Remove unused LoadedApk fallback hook

This commit is contained in:
ajp_anton
2026-07-15 23:56:59 +00:00
parent f537f724cd
commit dd444f9fba
@@ -1,7 +1,6 @@
package se.ajpanton.navbuttons
import android.content.Context
import android.content.pm.ApplicationInfo
import android.os.Handler
import android.os.Looper
import android.os.SystemClock
@@ -29,7 +28,6 @@ class NavButtons() : XposedModule() {
private var systemServerProcess = false
private var launcherHookInstalled = false
private var aospTaskbarHookInstalled = false
private var loadedApkClassLoaderFallbackHookInstalled = false
private var appBindFallbackHookInstalled = false
private var lastHomeLongPressHandledAtMs = 0L
private val targetHookRetryAttempts = mutableMapOf<String, Int>()
@@ -164,7 +162,6 @@ class NavButtons() : XposedModule() {
override fun getClassLoader(): ClassLoader = classLoader
})
} else {
hookLoadedApkClassLoaderFallback(param.processName)
hookAppBindFallback(param.processName)
handleTargetPackage(param.processName, classLoader)
scheduleTargetHookRetry(param.processName)
@@ -282,41 +279,6 @@ class NavButtons() : XposedModule() {
}
}
private fun hookLoadedApkClassLoaderFallback(processName: String) {
if (loadedApkClassLoaderFallbackHookInstalled || processName !in TARGET_PACKAGES) {
return
}
val loadedApkClass = findClassIfExists("android.app.LoadedApk", null) ?: return
val methods = findMethodsNamed(loadedApkClass, "createOrUpdateClassLoaderLocked")
if (methods.isEmpty()) {
log("LoadedApk classloader fallback method not found.")
return
}
loadedApkClassLoaderFallbackHookInstalled = true
methods.forEach { method ->
deoptimizeMethodIfPresent(method)
hook(method).intercept { chain ->
val result = chain.proceed()
val loadedApk = chain.thisObject ?: return@intercept result
val packageName = getLoadedApkPackageName(loadedApk) ?: return@intercept result
if (packageName in TARGET_PACKAGES) {
val classLoader = getFieldValue(loadedApk, "mClassLoader") as? ClassLoader
handleTargetPackage(packageName, classLoader)
}
result
}
}
}
private fun getLoadedApkPackageName(loadedApk: Any): String? {
val packageName = getFieldValue(loadedApk, "mPackageName") as? String
if (packageName != null) {
return packageName
}
return (getFieldValue(loadedApk, "mApplicationInfo") as? ApplicationInfo)?.packageName
}
private fun getAppBindClassLoader(appBindData: Any?): ClassLoader? {
val loadedApk = getFieldValue(appBindData, "info") ?: return null
return (getFieldValue(loadedApk, "mClassLoader") as? ClassLoader)