Postpone XResources native methods registering

This commit is contained in:
solohsu 2019-04-29 20:13:55 +08:00
parent edda665778
commit 20c83e4db7
14 changed files with 33 additions and 131 deletions

View File

@ -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) {
}
} }

View File

@ -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
} }
}; };

View File

@ -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"
@ -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) {

View File

@ -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);
} }

View File

@ -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);
}
} }

View File

@ -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);
} }

View File

@ -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);
}
} }

View File

@ -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);
} }

View File

@ -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);
}
} }

View File

@ -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.

View File

@ -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) {
}
};
} }

View File

@ -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);
} }

View File

@ -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)