├── .github └── workflows │ └── build.yml └── patches ├── Magisk ├── Magisk-su2suu.diff ├── mountbind2product.diff ├── patch_vivo_do_mount_check.diff └── use-local-libsu.diff └── libsu └── libsu-su2suu.diff /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Magisk Build 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | 7 | jobs: 8 | build: 9 | name: Build on Magisk 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Check out patches 14 | uses: actions/checkout@v2 15 | 16 | - name: Check out Magisk 17 | uses: actions/checkout@v2 18 | with: 19 | path: Magisk 20 | repository: topjohnwu/Magisk 21 | ref: 6066b5cf86703512451a021cf1aaf1a877530af7 22 | submodules: 'recursive' 23 | fetch-depth: 0 24 | 25 | - name: Check out libsu 26 | uses: actions/checkout@v2 27 | with: 28 | path: libsu 29 | repository: topjohnwu/libsu 30 | ref: 9aa478c054d8d53b66b4401cb60e7139d46ede49 31 | fetch-depth: 0 32 | 33 | - name: Set up JDK 11 34 | uses: actions/setup-java@v1 35 | with: 36 | java-version: '11' 37 | 38 | - name: Set up Python 3 39 | uses: actions/setup-python@v2 40 | with: 41 | python-version: '3.x' 42 | 43 | - name: Set up GitHub env 44 | run: | 45 | ndk_ver=$(sed -n 's/^magisk.ondkVersion=//p' Magisk/gradle.properties) 46 | echo ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT >> $GITHUB_ENV 47 | echo ONDK_VERSION=$ndk_ver >> $GITHUB_ENV 48 | 49 | - name: Set up NDK 50 | run: | 51 | cd Magisk 52 | python build.py ndk 53 | 54 | - name: Apply libsu Patches 55 | run: | 56 | git -C libsu apply ../patches/libsu/libsu-su2suu.diff 57 | 58 | - name: Build libsuu 59 | run: | 60 | cd libsu 61 | ./gradlew :core:build 62 | ./gradlew :service:build 63 | ./gradlew :nio:build 64 | 65 | - name: Copy libsuu libs 66 | run: | 67 | mkdir Magisk/app/libs 68 | cp libsu/nio/build/outputs/aar/nio-release.aar Magisk/app/libs/ 69 | cp libsu/service/build/outputs/aar/service-release.aar Magisk/app/libs/ 70 | cp libsu/core/build/outputs/aar/core-release.aar Magisk/app/libs/ 71 | 72 | - name: Update Magisk Version 73 | run: | 74 | cp Magisk/config.prop.sample Magisk/config.prop 75 | sed -i s/version=string/version=25.2/g Magisk/config.prop 76 | curl -s https://android.googlesource.com/platform/build/+/refs/heads/master/target/product/security/testkey.x509.pem?format=TEXT | base64 -d > testkey.x509.pem 77 | curl -s https://android.googlesource.com/platform/build/+/refs/heads/master/target/product/security/testkey.pk8?format=TEXT | base64 -d > testkey.pk8 78 | openssl pkcs8 -in testkey.pk8 -inform DER -outform PEM -out testkey.priv.pem -nocrypt 79 | openssl pkcs12 -export -in testkey.x509.pem -inkey testkey.priv.pem -out testkey.pk12 -password pass:android -name androiddebugkey 80 | keytool -importkeystore -srckeystore testkey.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey -deststoretype JKS -destkeystore Magisk/test.jks -deststorepass android 81 | sed -i s/outdir=string/outdir=out/g Magisk/config.prop 82 | sed -i s/keyStore=string/keyStore=test.jks/g Magisk/config.prop 83 | sed -i s/keyStorePass=string/keyStorePass=android/g Magisk/config.prop 84 | sed -i s/keyAlias=string/keyAlias=androiddebugkey/g Magisk/config.prop 85 | sed -i s/keyPass=string/keyPass=android/g Magisk/config.prop 86 | 87 | - name: Apply Magisk Patches 88 | run: | 89 | git -C Magisk apply ../patches/Magisk/Magisk-su2suu.diff 90 | git -C Magisk apply ../patches/Magisk/use-local-libsu.diff 91 | 92 | - name: Build Magisk 93 | run: | 94 | cd Magisk 95 | python build.py -vr all 96 | 97 | - name: Upload build artifact 98 | uses: actions/upload-artifact@v2 99 | with: 100 | name: Magisk.apk 101 | path: Magisk/out/app-release.apk 102 | 103 | - name: Apply Magisk test Patches 104 | run: | 105 | git -C Magisk apply ../patches/Magisk/patch_vivo_do_mount_check.diff 106 | #git -C Magisk apply ../patches/Magisk/mountbind2product.diff 107 | 108 | - name: Build Magisk test 109 | run: | 110 | cd Magisk 111 | python build.py -vr all 112 | 113 | - name: Upload build artifact 114 | uses: actions/upload-artifact@v2 115 | with: 116 | name: Magisk-test.apk 117 | path: Magisk/out/app-release.apk 118 | -------------------------------------------------------------------------------- /patches/Magisk/Magisk-su2suu.diff: -------------------------------------------------------------------------------- 1 | diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt 2 | index 0c7e64024..71fdb361e 100644 3 | --- a/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt 4 | +++ b/app/src/main/java/com/topjohnwu/magisk/ui/MainActivity.kt 5 | @@ -168,7 +168,7 @@ class MainActivity : SplashActivity() { 6 | if (!Info.isEmulator && Info.env.isActive && System.getenv("PATH") 7 | ?.split(':') 8 | ?.filterNot { File("$it/magisk").exists() } 9 | - ?.any { File("$it/su").exists() } == true) { 10 | + ?.any { File("$it/suu").exists() } == true) { 11 | MagiskDialog(this).apply { 12 | setTitle(R.string.unsupport_general_title) 13 | setMessage(R.string.unsupport_other_su_msg) 14 | diff --git a/native/jni/core/applets.cpp b/native/jni/core/applets.cpp 15 | index 8d0d81446..41b8e8b01 100644 16 | --- a/native/jni/core/applets.cpp 17 | +++ b/native/jni/core/applets.cpp 18 | @@ -10,7 +10,7 @@ using namespace std; 19 | 20 | using main_fun = int (*)(int, char *[]); 21 | 22 | -constexpr const char *applets[] = { "su", "resetprop", "zygisk", nullptr }; 23 | +constexpr const char *applets[] = { "suu", "resetprop", "zygisk", nullptr }; 24 | static main_fun applet_mains[] = { su_client_main, resetprop_main, zygisk_main, nullptr }; 25 | 26 | static int call_applet(int argc, char *argv[]) { 27 | diff --git a/native/jni/include/magisk.hpp b/native/jni/include/magisk.hpp 28 | index 466e5f439..4ff87265a 100644 29 | --- a/native/jni/include/magisk.hpp 30 | +++ b/native/jni/include/magisk.hpp 31 | @@ -28,7 +28,7 @@ extern std::string MAGISKTMP; 32 | #define ZYGISKBIN INTLROOT "/zygisk" 33 | #define SELINUXMOCK INTLROOT "/selinux" 34 | 35 | -constexpr const char *applet_names[] = { "su", "resetprop", nullptr }; 36 | +constexpr const char *applet_names[] = { "suu", "resetprop", nullptr }; 37 | 38 | #define POST_FS_DATA_WAIT_TIME 40 39 | #define POST_FS_DATA_SCRIPT_MAX_TIME 35 40 | -------------------------------------------------------------------------------- /patches/Magisk/mountbind2product.diff: -------------------------------------------------------------------------------- 1 | diff --git a/native/jni/core/bootstages.cpp b/native/jni/core/bootstages.cpp 2 | index 336a4b0e..4a043aa5 100644 3 | --- a/native/jni/core/bootstages.cpp 4 | +++ b/native/jni/core/bootstages.cpp 5 | @@ -289,6 +289,10 @@ void post_fs_data(int client) { 6 | } 7 | } 8 | 9 | + if (MAGISKTMP != "/sbin") { 10 | + exec_command_sync("/system/bin/mount", "--bind", MAGISKTMP.data(), "/product/bin"); 11 | + } 12 | + 13 | if (!magisk_env()) { 14 | LOGE("* Magisk environment incomplete, abort\n"); 15 | goto early_abort; 16 | diff --git a/native/jni/core/restorecon.cpp b/native/jni/core/restorecon.cpp 17 | index f4454dfd..ada45bab 100644 18 | --- a/native/jni/core/restorecon.cpp 19 | +++ b/native/jni/core/restorecon.cpp 20 | @@ -90,7 +90,7 @@ void restore_tmpcon() { 21 | if (MAGISKTMP == "/sbin") 22 | setfilecon(MAGISKTMP.data(), ROOT_CON); 23 | else 24 | - chmod(MAGISKTMP.data(), 0700); 25 | + chmod(MAGISKTMP.data(), 0755); 26 | 27 | auto dir = xopen_dir(MAGISKTMP.data()); 28 | int dfd = dirfd(dir.get()); 29 | -------------------------------------------------------------------------------- /patches/Magisk/patch_vivo_do_mount_check.diff: -------------------------------------------------------------------------------- 1 | diff --git a/scripts/boot_patch.sh b/scripts/boot_patch.sh 2 | index c334e8d84..53766851a 100644 3 | --- a/scripts/boot_patch.sh 4 | +++ b/scripts/boot_patch.sh 5 | @@ -205,6 +205,11 @@ if [ -f kernel ]; then 6 | # After: [mov w2, #-32768] 7 | ./magiskboot hexpatch kernel 821B8012 E2FF8F12 8 | 9 | + # patch vivo do_mount_check 10 | + # /system -> /syswxl 11 | + # python3 -c "print(hex(int.from_bytes(b'/system', 'big')^int('bdbcbbbab9b8b7', 16)))" 12 | + ./magiskboot hexpatch kernel 0092CFC2C9CDDDDA00 0092CFC2C9CEC0DB00 13 | + 14 | # Force kernel to load rootfs 15 | # skip_initramfs -> want_initramfs 16 | ./magiskboot hexpatch kernel \ 17 | -------------------------------------------------------------------------------- /patches/Magisk/use-local-libsu.diff: -------------------------------------------------------------------------------- 1 | diff --git a/app/build.gradle.kts b/app/build.gradle.kts 2 | index 71007e627..1880339b8 100644 3 | --- a/app/build.gradle.kts 4 | +++ b/app/build.gradle.kts 5 | @@ -66,6 +66,8 @@ configurations.all { 6 | } 7 | 8 | dependencies { 9 | + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) 10 | + 11 | implementation(project(":app:shared")) 12 | 13 | implementation("com.github.topjohnwu:jtar:1.0.0") 14 | @@ -78,10 +80,10 @@ dependencies { 15 | implementation("dev.rikka.rikkax.recyclerview:recyclerview-ktx:1.3.1") 16 | implementation("io.noties.markwon:core:4.6.2") 17 | 18 | - val vLibsu = "5.0.2" 19 | - implementation("com.github.topjohnwu.libsu:core:${vLibsu}") 20 | - implementation("com.github.topjohnwu.libsu:service:${vLibsu}") 21 | - implementation("com.github.topjohnwu.libsu:nio:${vLibsu}") 22 | + //val vLibsu = "5.0.2" 23 | + //implementation("com.github.topjohnwu.libsu:core:${vLibsu}") 24 | + //implementation("com.github.topjohnwu.libsu:service:${vLibsu}") 25 | + //implementation("com.github.topjohnwu.libsu:nio:${vLibsu}") 26 | 27 | val vRetrofit = "2.9.0" 28 | implementation("com.squareup.retrofit2:retrofit:${vRetrofit}") 29 | -------------------------------------------------------------------------------- /patches/libsu/libsu-su2suu.diff: -------------------------------------------------------------------------------- 1 | diff --git a/core/src/main/java/com/topjohnwu/superuser/internal/BuilderImpl.java b/core/src/main/java/com/topjohnwu/superuser/internal/BuilderImpl.java 2 | index ae18065..fff8a79 100644 3 | --- a/core/src/main/java/com/topjohnwu/superuser/internal/BuilderImpl.java 4 | +++ b/core/src/main/java/com/topjohnwu/superuser/internal/BuilderImpl.java 5 | @@ -100,7 +100,7 @@ public final class BuilderImpl extends Shell.Builder { 6 | // Root mount master 7 | if (!hasFlags(FLAG_NON_ROOT_SHELL) && hasFlags(FLAG_MOUNT_MASTER)) { 8 | try { 9 | - shell = build("su", "--mount-master"); 10 | + shell = build("suu", "--mount-master"); 11 | if (!shell.isRoot()) 12 | shell = null; 13 | } catch (NoShellException ignore) {} 14 | @@ -109,7 +109,7 @@ public final class BuilderImpl extends Shell.Builder { 15 | // Normal root shell 16 | if (shell == null && !hasFlags(FLAG_NON_ROOT_SHELL)) { 17 | try { 18 | - shell = build("su"); 19 | + shell = build("suu"); 20 | if (!shell.isRoot()) { 21 | shell = null; 22 | } 23 | diff --git a/core/src/main/java/com/topjohnwu/superuser/internal/Utils.java b/core/src/main/java/com/topjohnwu/superuser/internal/Utils.java 24 | index 1e3575f..7a5a0fb 100644 25 | --- a/core/src/main/java/com/topjohnwu/superuser/internal/Utils.java 26 | +++ b/core/src/main/java/com/topjohnwu/superuser/internal/Utils.java 27 | @@ -151,7 +151,7 @@ public final class Utils { 28 | } 29 | // noinspection ConstantConditions 30 | for (String path : System.getenv("PATH").split(":")) { 31 | - File su = new File(path, "su"); 32 | + File su = new File(path, "suu"); 33 | if (su.canExecute()) { 34 | // We don't actually know whether the app has been granted root access. 35 | // Do NOT set the value as a confirmed state. 36 | --------------------------------------------------------------------------------