Add LoadedApk callers to deoptimize list (#414)

This commit attempts to resolve an issue reported by users on recent OnePlus software updates where LSPosed modules are no longer able to hook the `Application#attach` method.

Android Runtime (ART) on these devices has become more aggressive with method inlining. This optimization can cause the relatively small `Application#attach` method to be directly embedded into its (indirect) calling methods, which makes it invisible to the hooking framework.

This approach is adapted from a reportedly successful commit in a community fork (LSPosed-Irena). It identifies `makeApplication` and `makeApplicationInner` within the `android.app.LoadedApk` class as the key callers to deoptimize. By adding these methods to the `BOOT_IMAGE` list, the goal is to prevent ART from inlining them, thus preserving `Application#attach` as a distinct and hookable method.

Co-authored-by: Irena <140869597+re-zero001@users.noreply.github.com>
This commit is contained in:
JingMatrix 2025-11-11 09:39:49 +01:00 committed by GitHub
parent 487e835559
commit f5af5690f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 7 additions and 0 deletions

View File

@ -20,6 +20,7 @@
package org.lsposed.lspd.deopt; package org.lsposed.lspd.deopt;
import android.app.Instrumentation;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.res.AssetManager; import android.content.res.AssetManager;
@ -57,6 +58,12 @@ public class InlinedMethodCallers {
// callers of Application#attach(Context) // callers of Application#attach(Context)
{"android.app.Instrumentation", "newApplication", ClassLoader.class, String.class, Context.class}, {"android.app.Instrumentation", "newApplication", ClassLoader.class, String.class, Context.class},
{"android.app.Instrumentation", "newApplication", ClassLoader.class, Context.class}, {"android.app.Instrumentation", "newApplication", ClassLoader.class, Context.class},
// callers of Instrumentation#newApplication(ClassLoader, String, Context)
{"android.app.LoadedApk", "makeApplicationInner", Boolean.TYPE, Instrumentation.class, Boolean.TYPE},
{"android.app.LoadedApk", "makeApplicationInner", Boolean.TYPE, Instrumentation.class},
{"android.app.LoadedApk", "makeApplication", Boolean.TYPE, Instrumentation.class},
{"android.app.ContextImpl", "getSharedPreferencesPath", String.class} {"android.app.ContextImpl", "getSharedPreferencesPath", String.class}
}; };