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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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