Postpone XResources native methods registering
This commit is contained in:
parent
edda665778
commit
20c83e4db7
|
|
@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#include <include/ByteOrder.h>
|
||||
#include <include/logging.h>
|
||||
#include <dlfcn.h>
|
||||
#include <java_hook/java_hook.h>
|
||||
#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<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",
|
||||
"(ILandroid/content/res/XResources;Landroid/content/res/Resources;)I");
|
||||
if (methodXResourcesTranslateResId == NULL) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue