Two corrections to the previous attempt, both measured rather than reasoned. Including _sys_lwmutex_lock broke it. That counter keeps climbing straight through the hang at a flat ~375 per 10s -- the idle loops take lightweight mutexes -- so the 'unchanged' test re-armed on every tick and the detector never fired. sys_mutex_lock alone froze outright, at 22. And 'exactly zero' only fits Xillia 2. Kane & Lynch collapsed from ~200,000 per 10s to ~300, which is just as dead and never reaches zero. So the test is now relative: remember the busiest rate this game has reached, decay it slowly, and call it a hang when the current rate stays under a fiftieth of that for 30 seconds. A title that has never been busy has no peak to fall from and cannot trip it; the 5000/s floor sits far below every busy rate measured (20,000+) and far above anything idle. The syscall code is resolved by name from g_ppu_syscall_table once, rather than hardcoded, so it cannot silently come to mean a different syscall. Also logs its own state every 10s -- rate, peak, quiet seconds, dumps taken. Five attempts at detecting this hang have now failed, every one of them silently, and each cost a reproduction to discover. The detector reporting what it sees is worth more than the detector being clever.
ARMSX3
Uses the latest RPCS3 upstream code (the recent ARM64 improvements included).
Building
arm64-v8a and armv8.2 is supported. You need the Android SDK with NDK r27 or newer, CMake 3.30 or newer, and a JDK 17. Android Studio ships all of these.
Clone with submodules, then fetch the two third party checkouts that are not submodules:
git clone --recursive https://github.com/ARMSX2/ARMSX3.git
cd ARMSX3
git clone https://github.com/SnowflakePowered/librashader 3rdparty/librashader
git clone https://github.com/bylaws/libadrenotools android/armsx3-ui/app/src/main/cpp/libadrenotools
Build the core. This is the long part and produces an unstripped library of around 1.3 GB:
export ANDROID_HOME=$HOME/Library/Android/sdk
cmake -B build-android -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_HOME/ndk/<version>/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-31 \
-DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build-android --target rpcsx-android -j8
Strip it and put it where the app expects it:
llvm-strip --strip-unneeded build-android/android/libarmsx3-core.so
cp build-android/android/libarmsx3-core.so \
android/armsx3-ui/app/src/main/jniLibs/arm64-v8a/
Then build the app:
cd android/armsx3-ui
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
./gradlew :app:assembleRelease
The apk lands in app/build/outputs/apk/release/.
Note that the core library has to be rebuilt and copied again whenever anything under rpcs3/ or android/src/ changes. Gradle does not build it for you.
The Discord Social SDK is proprietary and is not redistributed here. Get it from Discord's developer portal and drop it in app/libs/ and app/src/main/cpp/discord_sdk/ if you want that feature. The build skips it otherwise.
Running it needs PS3 firmware, which is not included. License
GPL-2.0-only, the same as RPCS3. See LICENSE. Some files may be licensed differently, check the file headers.
Based on RPCS3, https://github.com/RPCS3/rpcs3