diff --git a/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java b/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java index 471f68f..1dc5de8 100644 --- a/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java +++ b/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java @@ -204,6 +204,7 @@ public class LSPApplication { } Log.i(TAG,"createLoadedApkWithContext cost: " + (System.currentTimeMillis() - timeStart) + "ms"); + SigBypass.replaceApplication(appInfo.packageName, appInfo.sourceDir, appInfo.publicSourceDir); return context; } catch (Throwable e) { Log.e(TAG, "createLoadedApk", e); diff --git a/patch-loader/src/main/java/org/lsposed/lspatch/loader/SigBypass.java b/patch-loader/src/main/java/org/lsposed/lspatch/loader/SigBypass.java index c7e5386..2d70b32 100644 --- a/patch-loader/src/main/java/org/lsposed/lspatch/loader/SigBypass.java +++ b/patch-loader/src/main/java/org/lsposed/lspatch/loader/SigBypass.java @@ -3,6 +3,7 @@ package org.lsposed.lspatch.loader; import static org.lsposed.lspatch.share.Constants.ORIGINAL_APK_ASSET_PATH; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageParser; @@ -31,7 +32,7 @@ import de.robv.android.xposed.XposedHelpers; public class SigBypass { - private static final String TAG = "LSPatch-SigBypass"; + private static final String TAG = "NPatch-SigBypass"; private static final Map signatures = new HashMap<>(); private static void replaceSignature(Context context, PackageInfo packageInfo) { @@ -116,6 +117,34 @@ public class SigBypass { } } + public static void replaceApplication(String packageName, String sourceDir, String resourcesDir) throws IOException { + try { + Log.i(TAG, "Start Replace application info for `" + packageName + "`"); + XposedBridge.hookAllMethods(Class.forName("android.app.ApplicationPackageManager"), "getApplicationInfo", new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + if (packageName.equals(param.args[0])) { + ApplicationInfo info = (ApplicationInfo) param.getResult(); + info.sourceDir = sourceDir; + info.publicSourceDir = sourceDir; + } + } + }); + XposedBridge.hookAllMethods(Class.forName("android.app.ApplicationPackageManager"), "getApplicationInfoAsUser", new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) throws Throwable { + if (packageName.equals(param.args[0])) { + ApplicationInfo info = (ApplicationInfo) param.getResult(); + info.sourceDir = sourceDir; + info.publicSourceDir = sourceDir; + } + } + }); + } catch (Throwable e) { + Log.w(TAG, "fail to replace getApplicationInfo", e); + } + } + static void doSigBypass(Context context, int sigBypassLevel) throws IOException { if (sigBypassLevel >= Constants.SIGBYPASS_LV_PM) { hookPackageParser(context);