From dd0297c1122ec267f484e2af00bd6d7e3928ba9c Mon Sep 17 00:00:00 2001 From: LoveSy Date: Tue, 13 Jul 2021 17:48:10 +0800 Subject: [PATCH] Fix rirud readdir & display status on Magisk --- gradle/wrapper/gradle-wrapper.properties | 4 +-- riru/build.gradle | 3 -- riru/src/main/java/riru/Daemon.java | 3 ++ .../java/riru/DaemonSocketServerThread.java | 15 ++++++---- riru/src/main/java/riru/DaemonUtils.java | 30 +++++++++++++++++-- template/magisk_module/customize.sh | 3 +- template/magisk_module/post-fs-data.sh | 7 +++-- template/magisk_module/rirud | 5 ---- template/magisk_module/service.sh | 3 ++ 9 files changed, 52 insertions(+), 21 deletions(-) delete mode 100644 template/magisk_module/rirud create mode 100644 template/magisk_module/service.sh diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e6d93853..d5d22cdb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jul 12 12:36:51 CST 2021 +#Mon Jul 12 21:05:17 CST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/riru/build.gradle b/riru/build.gradle index c6bb5415..859186a6 100644 --- a/riru/build.gradle +++ b/riru/build.gradle @@ -1,4 +1,3 @@ -import org.apache.tools.ant.DirectoryScanner import org.apache.tools.ant.filters.FixCrLfFilter import org.apache.tools.ant.filters.ReplaceTokens @@ -8,8 +7,6 @@ plugins { id 'com.android.application' } -DirectoryScanner.removeDefaultExclude('**/.gitattributes') - def versionNameShort = "v${riruApiVersion}.${versionNameMinor}.${versionNamePatch}" def versionName = "${versionNameShort}.r${gitCommitCount}.${gitCommitId}" def versionCode = gitCommitCount diff --git a/riru/src/main/java/riru/Daemon.java b/riru/src/main/java/riru/Daemon.java index 3b298525..ee8108e7 100644 --- a/riru/src/main/java/riru/Daemon.java +++ b/riru/src/main/java/riru/Daemon.java @@ -74,6 +74,7 @@ private void startWait(boolean allowRestart, boolean isFirst) { DaemonUtils.resetNativeBridgeProp(DaemonUtils.getOriginalNativeBridge()); Log.i(TAG, "Riru loaded, stop rirud socket..."); + DaemonUtils.writeStatus("Riru is loaded normally"); serverThread.stopServer(); try { @@ -84,7 +85,9 @@ private void startWait(boolean allowRestart, boolean isFirst) { } public static void main(String[] args) { + DaemonUtils.init(args); DaemonUtils.killParentProcess(); + DaemonUtils.writeStatus("app_process launched"); int magiskVersionCode = DaemonUtils.getMagiskVersionCode(); String magiskTmpfsPath = DaemonUtils.getMagiskTmpfsPath(); diff --git a/riru/src/main/java/riru/DaemonSocketServerThread.java b/riru/src/main/java/riru/DaemonSocketServerThread.java index bca2df56..92a87099 100644 --- a/riru/src/main/java/riru/DaemonSocketServerThread.java +++ b/riru/src/main/java/riru/DaemonSocketServerThread.java @@ -15,6 +15,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -191,7 +192,9 @@ private void handleReadDir(LittleEndianDataInputStream in, LittleEndianDataOutpu } if (files == null || index >= size) { out.writeInt(-1); - continue; + break; + } else { + out.writeInt(0); } File f = files[index]; @@ -200,13 +203,15 @@ private void handleReadDir(LittleEndianDataInputStream in, LittleEndianDataOutpu boolean isFile = f.isFile(); boolean isDir = f.isDirectory(); if (isFile) - out.writeChar(/*DT_REG*/ 8); + out.writeByte(/*DT_REG*/ 8); else if (isDir) - out.writeChar(/*DT_DIR*/ 4); + out.writeByte(/*DT_DIR*/ 4); else - out.writeChar(/*DT_UNKNOWN*/0); + out.writeByte(/*DT_UNKNOWN*/0); - out.write(f.getName().getBytes()); + byte[] name = Arrays.copyOf(f.getName().getBytes(StandardCharsets.UTF_8), 256); + name[255] = 0; // null-terminated + out.write(name); } } diff --git a/riru/src/main/java/riru/DaemonUtils.java b/riru/src/main/java/riru/DaemonUtils.java index d942728e..216b1c09 100644 --- a/riru/src/main/java/riru/DaemonUtils.java +++ b/riru/src/main/java/riru/DaemonUtils.java @@ -1,5 +1,7 @@ package riru; +import static riru.Daemon.TAG; + import android.os.Build; import android.os.IBinder; import android.os.ServiceManager; @@ -11,18 +13,18 @@ import android.util.Log; import java.io.BufferedReader; +import java.io.DataOutputStream; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.InterruptedIOException; import java.security.SecureRandom; import java.util.Locale; -import static riru.Daemon.TAG; - public class DaemonUtils { private static Boolean has32Bit = null, has64Bit = null; @@ -39,6 +41,11 @@ public class DaemonUtils { } } + public static void init(String[] args) { + magiskVersionCode = Integer.parseInt(args[0]); + magiskTmpfsPath = args[1]; + } + public static void killParentProcess() { int ppid = Os.getppid(); try { @@ -49,6 +56,25 @@ public static void killParentProcess() { } } + public static void writeStatus(String status) { + File prop = new File("module.prop"); + try (BufferedReader br = new BufferedReader(new FileReader(prop))) { + StringBuilder sb = new StringBuilder(); + String line = br.readLine(); + while (line != null) { + sb.append(line.replaceFirst("^description=(\\[.*]\\s*)?", "description=[" + status + "] ")); + sb.append(System.lineSeparator()); + line = br.readLine(); + } + String content = sb.toString(); + try (DataOutputStream os = new DataOutputStream(new FileOutputStream(prop, false))) { + os.write(content.getBytes()); + } + } catch (Throwable e) { + Log.e(TAG, "fail to write status", e); + } + } + public static boolean has32Bit() { if (has32Bit == null) { has32Bit = Build.SUPPORTED_32_BIT_ABIS.length > 0; diff --git a/template/magisk_module/customize.sh b/template/magisk_module/customize.sh index 7cf99600..209d9d7f 100644 --- a/template/magisk_module/customize.sh +++ b/template/magisk_module/customize.sh @@ -56,6 +56,7 @@ fi extract "$ZIPFILE" 'module.prop' "$MODPATH" extract "$ZIPFILE" 'post-fs-data.sh' "$MODPATH" +extract "$ZIPFILE" 'service.sh' "$MODPATH" extract "$ZIPFILE" 'system.prop' "$MODPATH" extract "$ZIPFILE" 'util_functions.sh' "$MODPATH" extract "$ZIPFILE" 'uninstall.sh' "$MODPATH" @@ -100,9 +101,7 @@ ui_print "- Setting permissions" set_perm_recursive "$MODPATH" 0 0 0755 0644 ui_print "- Extracting rirud" -extract "$ZIPFILE" "rirud" "$MODPATH" extract "$ZIPFILE" "rirud.dex" "$MODPATH" -set_perm "$MODPATH/rirud" 0 0 0700 set_perm "$MODPATH/rirud.dex" 0 0 0600 ui_print "- Checking if your ROM has incorrect SELinux rules" diff --git a/template/magisk_module/post-fs-data.sh b/template/magisk_module/post-fs-data.sh index 8d2c3d26..ab9a1c0e 100644 --- a/template/magisk_module/post-fs-data.sh +++ b/template/magisk_module/post-fs-data.sh @@ -1,5 +1,8 @@ #!/system/bin/sh MODDIR=${0%/*} -chmod 700 "$MODPATH/rirud" -"$MODDIR/rirud" +chmod 700 "$MODDIR/rirud" +sed -Ei 's/^description=(\[.*][[:space:]]*)?/description=[app_process fails to run] /g' "$MODDIR/module.prop" +export CLASSPATH=$MODDIR/rirud.dex +cd $MODDIR +flock "module.prop" -c "/system/bin/app_process -Djava.class.path=rirud.dex /system/bin --nice-name=rirud riru.Daemon $(magisk -V) $(magisk --path)" diff --git a/template/magisk_module/rirud b/template/magisk_module/rirud deleted file mode 100644 index 6df0dcce..00000000 --- a/template/magisk_module/rirud +++ /dev/null @@ -1,5 +0,0 @@ -#!/system/bin/sh -MODDIR=${0%/*} - -export CLASSPATH=$MODDIR/rirud.dex -exec app_process -Djava.class.path="$MODDIR"/rirud.dex /system/bin --nice-name=rirud riru.Daemon >/dev/null 2>&1 diff --git a/template/magisk_module/service.sh b/template/magisk_module/service.sh new file mode 100644 index 00000000..d0822d4b --- /dev/null +++ b/template/magisk_module/service.sh @@ -0,0 +1,3 @@ +#!/system/bin/sh +MODDIR=${0%/*} +flock -n "$MODDIR/module.prop" -c "sed -Ei 's/^description=(\[.*][[:space:]]*)?/description=[post-fs-data.sh fails to run] /g' \"$MODDIR/module.prop\""