diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseHookProvider.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseHookProvider.java index 019c13c9..9b747f7d 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseHookProvider.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/config/BaseHookProvider.java @@ -1,8 +1,5 @@ package com.elderdrivers.riru.edxp.config; -import android.content.res.Resources; -import android.content.res.XResources; - import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter; import com.elderdrivers.riru.edxp.hook.HookProvider; @@ -40,9 +37,4 @@ public abstract class BaseHookProvider implements HookProvider { public boolean initXResourcesNative() { return false; } - - @Override - public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) { - - } } diff --git a/edxp-core/jni/main/java_hook/java_hook.cpp b/edxp-core/jni/main/java_hook/java_hook.cpp index 19852660..ddc4d5ab 100644 --- a/edxp-core/jni/main/java_hook/java_hook.cpp +++ b/edxp-core/jni/main/java_hook/java_hook.cpp @@ -129,9 +129,6 @@ static JNINativeMethod hookMethods[] = { }, { "initXResourcesNative", "()Z", (void *) XposedBridge_initXResourcesNative - }, - { - "rewriteXmlReferencesNative", "(JLandroid/content/res/XResources;Landroid/content/res/Resources;)V", (void *) XResources_rewriteXmlReferencesNative } }; diff --git a/edxp-core/jni/main/native_hook/resource_hook.cpp b/edxp-core/jni/main/native_hook/resource_hook.cpp index 09282f92..56e37865 100644 --- a/edxp-core/jni/main/native_hook/resource_hook.cpp +++ b/edxp-core/jni/main/native_hook/resource_hook.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "resource_hook.h" #define CLASS_XRESOURCES "android/content/res/XResources" @@ -44,7 +45,7 @@ bool prepareSymbols() { #if defined(__LP64__) "_ZNK7android12ResXMLParser18getAttributeNameIDEm" #else - "_ZNK7android12ResXMLParser18getAttributeNameIDEj" + "_ZNK7android12ResXMLParser18getAttributeNameIDEj" #endif )); if (!ResXMLParser_getAttributeNameID) { @@ -66,6 +67,15 @@ bool prepareSymbols() { return true; } +int register_natives_XResources(JNIEnv *env, jclass clazz) { + const JNINativeMethod methods[] = { + {"rewriteXmlReferencesNative", + "(JLandroid/content/res/XResources;Landroid/content/res/Resources;)V", + (void *) XResources_rewriteXmlReferencesNative}, + }; + return env->RegisterNatives(clazz, methods, NELEM(methods)); +} + jboolean XposedBridge_initXResourcesNative(JNIEnv *env, jclass) { classXResources = env->FindClass(CLASS_XRESOURCES); if (classXResources == NULL) { @@ -75,6 +85,12 @@ jboolean XposedBridge_initXResourcesNative(JNIEnv *env, jclass) { } classXResources = reinterpret_cast(env->NewGlobalRef(classXResources)); + if (register_natives_XResources(env, classXResources) != JNI_OK) { + LOGE("Could not register natives for '%s'", CLASS_XRESOURCES); + env->ExceptionClear(); + return false; + } + methodXResourcesTranslateResId = env->GetStaticMethodID(classXResources, "translateResId", "(ILandroid/content/res/XResources;Landroid/content/res/Resources;)I"); if (methodXResourcesTranslateResId == NULL) { diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java index ef87ebb1..89b6212b 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -1,19 +1,17 @@ package com.elderdrivers.riru.edxp; import android.annotation.SuppressLint; -import android.content.res.Resources; -import android.content.res.XResources; import android.os.Build; import android.os.Process; import com.elderdrivers.riru.common.KeepAll; -import com.elderdrivers.riru.edxp.sandhook.BuildConfig; import com.elderdrivers.riru.edxp.config.InstallerChooser; -import com.elderdrivers.riru.edxp.util.Utils; +import com.elderdrivers.riru.edxp.sandhook.BuildConfig; import com.elderdrivers.riru.edxp.sandhook.core.HookMethodResolver; import com.elderdrivers.riru.edxp.sandhook.entry.Router; import com.elderdrivers.riru.edxp.sandhook.proxy.BlackWhiteListProxy; import com.elderdrivers.riru.edxp.sandhook.proxy.NormalProxy; +import com.elderdrivers.riru.edxp.util.Utils; import com.swift.sandhook.xposedcompat.XposedCompat; import com.swift.sandhook.xposedcompat.methodgen.SandHookXposedBridge; @@ -151,6 +149,4 @@ public class Main implements KeepAll { public static native int waitForGcToComplete(long thread); public static native boolean initXResourcesNative(); - - public static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes); } diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java index b8279053..eddc8387 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java @@ -1,7 +1,5 @@ package com.elderdrivers.riru.edxp.sandhook.config; -import android.content.res.Resources; -import android.content.res.XResources; import android.util.Log; import com.elderdrivers.riru.edxp.Main; @@ -65,9 +63,4 @@ public class SandHookProvider extends BaseHookProvider { public boolean initXResourcesNative() { return Main.initXResourcesNative(); } - - @Override - public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) { - Main.rewriteXmlReferencesNative(parserPtr, origRes, repRes); - } } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java index 3f1019be..5d5cbc6b 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -1,18 +1,16 @@ package com.elderdrivers.riru.edxp; import android.annotation.SuppressLint; -import android.content.res.Resources; -import android.content.res.XResources; import android.os.Build; import android.os.Process; import com.elderdrivers.riru.common.KeepAll; import com.elderdrivers.riru.edxp.config.InstallerChooser; +import com.elderdrivers.riru.edxp.util.Utils; import com.elderdrivers.riru.edxp.whale.core.HookMethodResolver; import com.elderdrivers.riru.edxp.whale.entry.Router; import com.elderdrivers.riru.edxp.whale.proxy.BlackWhiteListProxy; import com.elderdrivers.riru.edxp.whale.proxy.NormalProxy; -import com.elderdrivers.riru.edxp.util.Utils; import java.lang.reflect.Method; import java.util.Arrays; @@ -142,6 +140,4 @@ public class Main implements KeepAll { public static native int waitForGcToComplete(long thread); public static native boolean initXResourcesNative(); - - public static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes); } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java index 79303fe3..82fb21cd 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java @@ -1,8 +1,5 @@ package com.elderdrivers.riru.edxp.whale.config; -import android.content.res.Resources; -import android.content.res.XResources; - import com.elderdrivers.riru.edxp.Main; import com.elderdrivers.riru.edxp.config.BaseHookProvider; import com.lody.whale.WhaleRuntime; @@ -62,9 +59,4 @@ public class WhaleHookProvider extends BaseHookProvider { public boolean initXResourcesNative() { return Main.initXResourcesNative(); } - - @Override - public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) { - Main.rewriteXmlReferencesNative(parserPtr, origRes, repRes); - } } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java index a781e699..7d6c8210 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -143,5 +143,4 @@ public class Main implements KeepAll { public static native boolean initXResourcesNative(); - public static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes); } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java index 4cbd0a37..a6a7638b 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java @@ -1,8 +1,5 @@ package com.elderdrivers.riru.edxp.yahfa.config; -import android.content.res.Resources; -import android.content.res.XResources; - import com.elderdrivers.riru.edxp.Main; import com.elderdrivers.riru.edxp.config.BaseHookProvider; import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils; @@ -43,9 +40,4 @@ public class YahfaHookProvider extends BaseHookProvider { public boolean initXResourcesNative() { return Main.initXResourcesNative(); } - - @Override - public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) { - Main.rewriteXmlReferencesNative(parserPtr, origRes, repRes); - } } diff --git a/hiddenapi-stubs/libs/framework-stub.jar b/hiddenapi-stubs/libs/framework-stub.jar index e68daf93..a6755b2c 100644 Binary files a/hiddenapi-stubs/libs/framework-stub.jar and b/hiddenapi-stubs/libs/framework-stub.jar differ diff --git a/xposed-bridge/src/main/java/android/content/res/XResources.java b/xposed-bridge/src/main/java/android/content/res/XResources.java index 412a7dc6..5d208d26 100644 --- a/xposed-bridge/src/main/java/android/content/res/XResources.java +++ b/xposed-bridge/src/main/java/android/content/res/XResources.java @@ -11,15 +11,12 @@ import android.os.Build; import android.text.Html; import android.util.AttributeSet; import android.util.DisplayMetrics; -import android.util.Log; import android.util.SparseArray; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal; - import org.xmlpull.v1.XmlPullParser; import java.io.File; @@ -1136,9 +1133,7 @@ public class XResources extends Resources { return false; } - private static void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) { - EdXpConfigGlobal.getHookProvider().rewriteXmlReferencesNative(parserPtr, origRes, repRes); - } + private static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes); /** * Used to replace reference IDs in XMLs. diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java index 6ae7370a..679920b5 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java @@ -1,15 +1,7 @@ package com.elderdrivers.riru.edxp.config; -import android.content.res.Resources; -import android.content.res.XResources; - import com.elderdrivers.riru.edxp.hook.HookProvider; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Member; - -import de.robv.android.xposed.XposedBridge; - public class EdXpConfigGlobal { public static volatile EdXpConfig sConfig; @@ -24,7 +16,7 @@ public class EdXpConfigGlobal { public static HookProvider getHookProvider() { if (sHookProvider == null) { - return defaultHookProvider; + throw new IllegalArgumentException("sHookProvider should not be null."); } return sHookProvider; } @@ -47,59 +39,4 @@ public class EdXpConfigGlobal { return false; } }; - - - private static final HookProvider defaultHookProvider = new HookProvider() { - - @Override - public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) { - - } - - @Override - public void unhookMethod(Member method) { - - } - - @Override - public Object invokeOriginalMethod(Member method, long methodId, Object thisObject, Object[] args) - throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { - return null; - } - - @Override - public Member findMethodNative(Member hookMethod) { - return hookMethod; - } - - @Override - public void deoptMethods(String packageName, ClassLoader classLoader) { - - } - - @Override - public long getMethodId(Member member) { - return 0; - } - - @Override - public Object findMethodNative(Class clazz, String methodName, String methodSig) { - return null; - } - - @Override - public void deoptMethodNative(Object method) { - - } - - @Override - public boolean initXResourcesNative() { - return false; - } - - @Override - public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) { - - } - }; } diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java index a8fccd78..f396bd85 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java @@ -1,8 +1,5 @@ package com.elderdrivers.riru.edxp.hook; -import android.content.res.Resources; -import android.content.res.XResources; - import java.lang.reflect.Member; import de.robv.android.xposed.XposedBridge; @@ -26,6 +23,4 @@ public interface HookProvider { void deoptMethodNative(Object method); boolean initXResourcesNative(); - - void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes); } diff --git a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java index 4a2d5b87..a5f68819 100644 --- a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java @@ -82,15 +82,7 @@ public final class XposedInit { } catch (NoSuchFieldError ignored) { } } - findAndHookMethod("android.app.ApplicationPackageManager", null, "getResourcesForApplication", - ApplicationInfo.class, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - ApplicationInfo app = (ApplicationInfo) param.args[0]; - XResources.setPackageNameForResDir(app.packageName, - app.uid == Process.myUid() ? app.sourceDir : app.publicSourceDir); - } - }); + hookResources(); } @@ -111,6 +103,16 @@ public final class XposedInit { return; } + findAndHookMethod("android.app.ApplicationPackageManager", null, "getResourcesForApplication", + ApplicationInfo.class, new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + ApplicationInfo app = (ApplicationInfo) param.args[0]; + XResources.setPackageNameForResDir(app.packageName, + app.uid == Process.myUid() ? app.sourceDir : app.publicSourceDir); + } + }); + /* * getTopLevelResources(a) * -> getTopLevelResources(b)