diff --git a/.gitignore b/.gitignore index 643c3054e..95aeaf816 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ apache/local/generated /build /captures bin/ +/apache diff --git a/axml/libs/manifest-editor b/axml/libs/manifest-editor index c40dc842a..8bab1509a 160000 --- a/axml/libs/manifest-editor +++ b/axml/libs/manifest-editor @@ -1 +1 @@ -Subproject commit c40dc842a3e3ec23ec77b08d638671af0d9062d3 +Subproject commit 8bab1509a9a02f77ed6bae7a07228373e001504a diff --git a/build.gradle.kts b/build.gradle.kts index cda316668..b79f5968c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -68,9 +68,9 @@ val verCode by extra(commitCount) val verName by extra(latestTag) val androidTargetSdkVersion by extra(36) val androidMinSdkVersion by extra(27) -val androidBuildToolsVersion by extra("36.0.0") +val androidBuildToolsVersion by extra("36.1.0") val androidCompileSdkVersion by extra(36) -val androidCompileNdkVersion by extra("29.0.13113456") +val androidCompileNdkVersion by extra("29.0.14033849") val androidSourceCompatibility by extra(JavaVersion.VERSION_21) val androidTargetCompatibility by extra(JavaVersion.VERSION_21) diff --git a/core/src/main/java/de/robv/android/xposed/XposedBridge.java b/core/src/main/java/de/robv/android/xposed/XposedBridge.java index b7730431e..571cc257b 100644 --- a/core/src/main/java/de/robv/android/xposed/XposedBridge.java +++ b/core/src/main/java/de/robv/android/xposed/XposedBridge.java @@ -24,6 +24,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.util.Log; +import android.util.LogPrinter; import org.lsposed.lspd.impl.LSPosedBridge; import org.lsposed.lspd.impl.LSPosedHookCallback; @@ -37,7 +38,9 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Date; import java.util.HashSet; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; @@ -72,6 +75,8 @@ public final class XposedBridge { private static final Object[] EMPTY_ARRAY = new Object[0]; + private static final SimpleDateFormat format = new SimpleDateFormat("'['yyyy-MM-dd'T'HH:mm:ss.SSS"); + // built-in handlers public static final CopyOnWriteArraySet sLoadedPackageCallbacks = new CopyOnWriteArraySet<>(); /*package*/ static final CopyOnWriteArraySet sInitPackageResourcesCallbacks = new CopyOnWriteArraySet<>(); @@ -81,6 +86,12 @@ private XposedBridge() { public static volatile ClassLoader dummyClassLoader = null; + private static LogPrinter printer; + + public static void setLogPrinter(LogPrinter printer){ + XposedBridge.printer = printer; + } + public static void initXResources() { if (dummyClassLoader != null) { return; @@ -146,6 +157,9 @@ public static int getXposedVersion() { */ public synchronized static void log(String text) { Log.i(TAG, text); + if (printer != null){ + printer.println(format.format(new Date()) + " " + ActivityThread.currentProcessName() + ";" + Thread.currentThread().getName() + "]" + text); + } } /** @@ -159,6 +173,9 @@ public synchronized static void log(String text) { public synchronized static void log(Throwable t) { String logStr = Log.getStackTraceString(t); Log.e(TAG, logStr); + if (printer != null){ + printer.println(format.format(new Date()) + " " + ActivityThread.currentProcessName() + ";" + Thread.currentThread().getName() + "]" + logStr); + } } /** diff --git a/core/src/main/jni/src/jni/hook_bridge.cpp b/core/src/main/jni/src/jni/hook_bridge.cpp index 104ed2840..0380d4b54 100644 --- a/core/src/main/jni/src/jni/hook_bridge.cpp +++ b/core/src/main/jni/src/jni/hook_bridge.cpp @@ -155,6 +155,7 @@ LSP_DEF_NATIVE_METHOD(jboolean, HookBridge, unhookMethod, jboolean useModernApi, for (auto i = hook_item->legacy_callbacks.begin(); i != hook_item->legacy_callbacks.end(); ++i) { if (env->IsSameObject(i->second, callback)) { hook_item->legacy_callbacks.erase(i); + env->DeleteGlobalRef(i->second); return JNI_TRUE; } } diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ServiceManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ServiceManager.java index f6df0d059..1e890081a 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ServiceManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ServiceManager.java @@ -99,9 +99,7 @@ public static void start(String[] args) { int systemServerMaxRetry = 1; for (String arg : args) { - if (arg.equals("--from-service")) { - Log.w(TAG, "LSPosed daemon is not started properly. Try for a late start..."); - } else if (arg.startsWith("--system-server-max-retry=")) { + if (arg.startsWith("--system-server-max-retry=")) { try { systemServerMaxRetry = Integer.parseInt(arg.substring(arg.lastIndexOf('=') + 1)); } catch (Throwable ignored) { diff --git a/magisk-loader/magisk_module/customize.sh b/magisk-loader/magisk_module/customize.sh index 010a94324..5fc4161cf 100644 --- a/magisk-loader/magisk_module/customize.sh +++ b/magisk-loader/magisk_module/customize.sh @@ -73,7 +73,6 @@ ui_print "- Extracting module files" extract "$ZIPFILE" 'module.prop' "$MODPATH" extract "$ZIPFILE" 'action.sh' "$MODPATH" -extract "$ZIPFILE" 'post-fs-data.sh' "$MODPATH" extract "$ZIPFILE" 'service.sh' "$MODPATH" extract "$ZIPFILE" 'uninstall.sh' "$MODPATH" extract "$ZIPFILE" 'sepolicy.rule' "$MODPATH" diff --git a/magisk-loader/magisk_module/post-fs-data.sh b/magisk-loader/magisk_module/post-fs-data.sh deleted file mode 100644 index c0234f4da..000000000 --- a/magisk-loader/magisk_module/post-fs-data.sh +++ /dev/null @@ -1,26 +0,0 @@ -# -# This file is part of LSPosed. -# -# LSPosed is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# LSPosed is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with LSPosed. If not, see . -# -# Copyright (C) 2021 LSPosed Contributors -# - -MODDIR=${0%/*} - -rm -f "/data/local/tmp/daemon.apk" -rm -f "/data/local/tmp/manager.apk" -cd "$MODDIR" - -unshare --propagation slave -m sh -c "$MODDIR/daemon $@&" diff --git a/magisk-loader/magisk_module/sepolicy.rule b/magisk-loader/magisk_module/sepolicy.rule index 1c7f04d07..fffe18c3a 100644 --- a/magisk-loader/magisk_module/sepolicy.rule +++ b/magisk-loader/magisk_module/sepolicy.rule @@ -11,3 +11,4 @@ allow dex2oat unlabeled file * type xposed_data file_type typeattribute xposed_data mlstrustedobject allow * xposed_data {file dir} * +allow system_server apk_data_file file execute \ No newline at end of file diff --git a/magisk-loader/magisk_module/service.sh b/magisk-loader/magisk_module/service.sh index 48b99320f..95979daa2 100644 --- a/magisk-loader/magisk_module/service.sh +++ b/magisk-loader/magisk_module/service.sh @@ -18,6 +18,8 @@ # MODDIR=${0%/*} + cd "$MODDIR" -# post-fs-data.sh may be blocked by other modules. retry to start this -unshare --propagation slave -m sh -c "$MODDIR/daemon --from-service $@&" + +# To avoid delaying the normal mount timing of zygote, we start LSPosed service daemon in late_start service mode instead of post-fs-data mode +unshare --propagation slave -m sh -c "$MODDIR/daemon $@&"