Postpone XResources native methods registering
This commit is contained in:
parent
edda665778
commit
20c83e4db7
|
|
@ -1,8 +1,5 @@
|
||||||
package com.elderdrivers.riru.edxp.config;
|
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.deopt.PrebuiltMethodsDeopter;
|
||||||
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
||||||
|
|
||||||
|
|
@ -40,9 +37,4 @@ public abstract class BaseHookProvider implements HookProvider {
|
||||||
public boolean initXResourcesNative() {
|
public boolean initXResourcesNative() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -129,9 +129,6 @@ static JNINativeMethod hookMethods[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"initXResourcesNative", "()Z", (void *) XposedBridge_initXResourcesNative
|
"initXResourcesNative", "()Z", (void *) XposedBridge_initXResourcesNative
|
||||||
},
|
|
||||||
{
|
|
||||||
"rewriteXmlReferencesNative", "(JLandroid/content/res/XResources;Landroid/content/res/Resources;)V", (void *) XResources_rewriteXmlReferencesNative
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include <include/ByteOrder.h>
|
#include <include/ByteOrder.h>
|
||||||
#include <include/logging.h>
|
#include <include/logging.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <java_hook/java_hook.h>
|
||||||
#include "resource_hook.h"
|
#include "resource_hook.h"
|
||||||
|
|
||||||
#define CLASS_XRESOURCES "android/content/res/XResources"
|
#define CLASS_XRESOURCES "android/content/res/XResources"
|
||||||
|
|
@ -44,7 +45,7 @@ bool prepareSymbols() {
|
||||||
#if defined(__LP64__)
|
#if defined(__LP64__)
|
||||||
"_ZNK7android12ResXMLParser18getAttributeNameIDEm"
|
"_ZNK7android12ResXMLParser18getAttributeNameIDEm"
|
||||||
#else
|
#else
|
||||||
"_ZNK7android12ResXMLParser18getAttributeNameIDEj"
|
"_ZNK7android12ResXMLParser18getAttributeNameIDEj"
|
||||||
#endif
|
#endif
|
||||||
));
|
));
|
||||||
if (!ResXMLParser_getAttributeNameID) {
|
if (!ResXMLParser_getAttributeNameID) {
|
||||||
|
|
@ -66,6 +67,15 @@ bool prepareSymbols() {
|
||||||
return true;
|
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) {
|
jboolean XposedBridge_initXResourcesNative(JNIEnv *env, jclass) {
|
||||||
classXResources = env->FindClass(CLASS_XRESOURCES);
|
classXResources = env->FindClass(CLASS_XRESOURCES);
|
||||||
if (classXResources == NULL) {
|
if (classXResources == NULL) {
|
||||||
|
|
@ -75,6 +85,12 @@ jboolean XposedBridge_initXResourcesNative(JNIEnv *env, jclass) {
|
||||||
}
|
}
|
||||||
classXResources = reinterpret_cast<jclass>(env->NewGlobalRef(classXResources));
|
classXResources = reinterpret_cast<jclass>(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",
|
methodXResourcesTranslateResId = env->GetStaticMethodID(classXResources, "translateResId",
|
||||||
"(ILandroid/content/res/XResources;Landroid/content/res/Resources;)I");
|
"(ILandroid/content/res/XResources;Landroid/content/res/Resources;)I");
|
||||||
if (methodXResourcesTranslateResId == NULL) {
|
if (methodXResourcesTranslateResId == NULL) {
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,17 @@
|
||||||
package com.elderdrivers.riru.edxp;
|
package com.elderdrivers.riru.edxp;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.XResources;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
|
|
||||||
import com.elderdrivers.riru.common.KeepAll;
|
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.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.core.HookMethodResolver;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
|
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.proxy.BlackWhiteListProxy;
|
import com.elderdrivers.riru.edxp.sandhook.proxy.BlackWhiteListProxy;
|
||||||
import com.elderdrivers.riru.edxp.sandhook.proxy.NormalProxy;
|
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.XposedCompat;
|
||||||
import com.swift.sandhook.xposedcompat.methodgen.SandHookXposedBridge;
|
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 int waitForGcToComplete(long thread);
|
||||||
|
|
||||||
public static native boolean initXResourcesNative();
|
public static native boolean initXResourcesNative();
|
||||||
|
|
||||||
public static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
package com.elderdrivers.riru.edxp.sandhook.config;
|
package com.elderdrivers.riru.edxp.sandhook.config;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.XResources;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.Main;
|
import com.elderdrivers.riru.edxp.Main;
|
||||||
|
|
@ -65,9 +63,4 @@ public class SandHookProvider extends BaseHookProvider {
|
||||||
public boolean initXResourcesNative() {
|
public boolean initXResourcesNative() {
|
||||||
return Main.initXResourcesNative();
|
return Main.initXResourcesNative();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) {
|
|
||||||
Main.rewriteXmlReferencesNative(parserPtr, origRes, repRes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,16 @@
|
||||||
package com.elderdrivers.riru.edxp;
|
package com.elderdrivers.riru.edxp;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.XResources;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
|
|
||||||
import com.elderdrivers.riru.common.KeepAll;
|
import com.elderdrivers.riru.common.KeepAll;
|
||||||
import com.elderdrivers.riru.edxp.config.InstallerChooser;
|
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.core.HookMethodResolver;
|
||||||
import com.elderdrivers.riru.edxp.whale.entry.Router;
|
import com.elderdrivers.riru.edxp.whale.entry.Router;
|
||||||
import com.elderdrivers.riru.edxp.whale.proxy.BlackWhiteListProxy;
|
import com.elderdrivers.riru.edxp.whale.proxy.BlackWhiteListProxy;
|
||||||
import com.elderdrivers.riru.edxp.whale.proxy.NormalProxy;
|
import com.elderdrivers.riru.edxp.whale.proxy.NormalProxy;
|
||||||
import com.elderdrivers.riru.edxp.util.Utils;
|
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
@ -142,6 +140,4 @@ public class Main implements KeepAll {
|
||||||
public static native int waitForGcToComplete(long thread);
|
public static native int waitForGcToComplete(long thread);
|
||||||
|
|
||||||
public static native boolean initXResourcesNative();
|
public static native boolean initXResourcesNative();
|
||||||
|
|
||||||
public static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package com.elderdrivers.riru.edxp.whale.config;
|
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.Main;
|
||||||
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
||||||
import com.lody.whale.WhaleRuntime;
|
import com.lody.whale.WhaleRuntime;
|
||||||
|
|
@ -62,9 +59,4 @@ public class WhaleHookProvider extends BaseHookProvider {
|
||||||
public boolean initXResourcesNative() {
|
public boolean initXResourcesNative() {
|
||||||
return Main.initXResourcesNative();
|
return Main.initXResourcesNative();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) {
|
|
||||||
Main.rewriteXmlReferencesNative(parserPtr, origRes, repRes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -143,5 +143,4 @@ public class Main implements KeepAll {
|
||||||
|
|
||||||
public static native boolean initXResourcesNative();
|
public static native boolean initXResourcesNative();
|
||||||
|
|
||||||
public static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package com.elderdrivers.riru.edxp.yahfa.config;
|
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.Main;
|
||||||
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils;
|
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils;
|
||||||
|
|
@ -43,9 +40,4 @@ public class YahfaHookProvider extends BaseHookProvider {
|
||||||
public boolean initXResourcesNative() {
|
public boolean initXResourcesNative() {
|
||||||
return Main.initXResourcesNative();
|
return Main.initXResourcesNative();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) {
|
|
||||||
Main.rewriteXmlReferencesNative(parserPtr, origRes, repRes);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -11,15 +11,12 @@ import android.os.Build;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
@ -1136,9 +1133,7 @@ public class XResources extends Resources {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes) {
|
private static native void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes);
|
||||||
EdXpConfigGlobal.getHookProvider().rewriteXmlReferencesNative(parserPtr, origRes, repRes);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to replace reference IDs in XMLs.
|
* Used to replace reference IDs in XMLs.
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,7 @@
|
||||||
package com.elderdrivers.riru.edxp.config;
|
package com.elderdrivers.riru.edxp.config;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.XResources;
|
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
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 class EdXpConfigGlobal {
|
||||||
|
|
||||||
public static volatile EdXpConfig sConfig;
|
public static volatile EdXpConfig sConfig;
|
||||||
|
|
@ -24,7 +16,7 @@ public class EdXpConfigGlobal {
|
||||||
|
|
||||||
public static HookProvider getHookProvider() {
|
public static HookProvider getHookProvider() {
|
||||||
if (sHookProvider == null) {
|
if (sHookProvider == null) {
|
||||||
return defaultHookProvider;
|
throw new IllegalArgumentException("sHookProvider should not be null.");
|
||||||
}
|
}
|
||||||
return sHookProvider;
|
return sHookProvider;
|
||||||
}
|
}
|
||||||
|
|
@ -47,59 +39,4 @@ public class EdXpConfigGlobal {
|
||||||
return false;
|
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) {
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package com.elderdrivers.riru.edxp.hook;
|
package com.elderdrivers.riru.edxp.hook;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.XResources;
|
|
||||||
|
|
||||||
import java.lang.reflect.Member;
|
import java.lang.reflect.Member;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
@ -26,6 +23,4 @@ public interface HookProvider {
|
||||||
void deoptMethodNative(Object method);
|
void deoptMethodNative(Object method);
|
||||||
|
|
||||||
boolean initXResourcesNative();
|
boolean initXResourcesNative();
|
||||||
|
|
||||||
void rewriteXmlReferencesNative(long parserPtr, XResources origRes, Resources repRes);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -82,15 +82,7 @@ public final class XposedInit {
|
||||||
} catch (NoSuchFieldError ignored) {
|
} 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();
|
hookResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -111,6 +103,16 @@ public final class XposedInit {
|
||||||
return;
|
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(a)
|
||||||
* -> getTopLevelResources(b)
|
* -> getTopLevelResources(b)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue