The Network tab offered three of the ten settings the core's Net node has. The seven it did not were reachable only as raw core overrides, and one of them is the setting that answers the question the tab exists to answer. RPCN replaces Sony's PSN. A publisher's own backend never was PSN, so a game that talked to one is not reachable through RPCN at all -- it is reachable by resolving its hostnames somewhere else, which is DNS address and IP swap list. Those had no writer anywhere in the app, so "use a custom server" had no answer short of hand-editing config.yml. They are first in the tab now, and their descriptions say which of the two layers they belong to, because that distinction is the whole confusion. Added with them: IP address, Bind address, PSN Country, Derive MAC from PSID and Clans Enabled -- all six Settings.kt sites each, plus the bridge dispatch, the setters, the search index and the tab's reset list. A key missing from the dispatch is dropped in silence with no build error, so the emitted keys and the handled keys were diffed rather than eyeballed. EditableTextRow was dead ARMSX2 DEV9-era code with no callers, a hardcoded "0.0.0.0" and no controllerFocusable, which would have made every one of these rows unreachable on a pad. It takes a placeholder and a description now and registers with the pad-nav registry. Saved RPCN servers are a view onto cfg_rpcn's own "Hosts" list rather than a second store, so add, remove, reset and anything the core does to it agree by construction. Reset restores the shipped list and selects np.rpcs3.net, which is the way back after typing a custom address over the top of it; removal of the official entry is refused, matching upstream's own guard, and reported instead of silently doing nothing. Host descriptions are user text being pasted into a JSON field, so they are escaped on the way out. Also exposes cfg_rpcn's experimental IPv6 support, which had no UI either, and fixes the PSN row's label -- it still read "PSN (Simulated)" from when it was a two-state toggle that could not select RPCN.
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