From 432218626a5c2df28f94163866d84d794e883936 Mon Sep 17 00:00:00 2001 From: frknkrc44 Date: Tue, 19 Aug 2025 15:29:21 +0300 Subject: [PATCH] Add root manager detection, move package events --- .../nullptr/hidemyapplist/common/Presets.kt | 4 +- .../common/presets/RootAppsPreset.kt | 39 +++++++++++--- .../hidemyapplist/xposed/HMAService.kt | 2 + .../hidemyapplist/xposed/XposedEntry.kt | 35 ------------- .../xposed/hook/PmsPackageEventsHook.kt | 52 +++++++++++++++++++ 5 files changed, 89 insertions(+), 43 deletions(-) create mode 100644 xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsPackageEventsHook.kt diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/Presets.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/Presets.kt index 88e5acc..d989551 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/Presets.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/Presets.kt @@ -66,8 +66,10 @@ class Presets private constructor() { if (appInfo != null) { runCatching { - if (it.onReloadPreset(appInfo!!)) + if (it.onReloadPreset(appInfo!!)) { + loggerFunction?.invoke("Package $packageName added into ${it.name}!") addedInAList = true + } }.onFailure { fail -> loggerFunction?.invoke(fail.toString()) } diff --git a/common/src/main/java/icu/nullptr/hidemyapplist/common/presets/RootAppsPreset.kt b/common/src/main/java/icu/nullptr/hidemyapplist/common/presets/RootAppsPreset.kt index b6a1a00..2562037 100644 --- a/common/src/main/java/icu/nullptr/hidemyapplist/common/presets/RootAppsPreset.kt +++ b/common/src/main/java/icu/nullptr/hidemyapplist/common/presets/RootAppsPreset.kt @@ -1,16 +1,10 @@ package icu.nullptr.hidemyapplist.common.presets import android.content.pm.ApplicationInfo +import java.util.zip.ZipFile class RootAppsPreset() : BasePreset("root_apps") { override fun onAddExactPackages() { - // root managers - packageNames += arrayOf( - "me.weishu.kernelsu", - "com.rifsxd.ksunext", - "com.sukisu.ultra", - ) - // rooted apps packageNames += arrayOf( "io.github.a13e300.ksuwebui", @@ -57,6 +51,10 @@ class RootAppsPreset() : BasePreset("root_apps") { override fun onReloadPreset(appInfo: ApplicationInfo): Boolean { val packageName = appInfo.packageName + if (packageNames.contains(packageName)) { + return false + } + // Iconify if (packageName.startsWith("com.drdisagree.iconify")) { packageNames.add(packageName) @@ -99,6 +97,33 @@ class RootAppsPreset() : BasePreset("root_apps") { return true } + ZipFile(appInfo.sourceDir).use { zipFile -> + if (findRootManagerFromLibs(zipFile)) { + packageNames.add(appInfo.packageName) + return true + } + } + + return false + } + + private fun findRootManagerFromLibs(zipFile: ZipFile): Boolean { + val entryNames = listOf( + "libkernelsu.so", + "libapd.so", + "libmagisk.so", + "libmmrl-kernelsu.so" + ) + val architectures = listOf("arm64-v8a", "armeabi-v7a") + + for (entry in entryNames) { + for (arch in architectures) { + if (zipFile.getEntry("lib/$arch/$entry") != null) { + return true + } + } + } + return false } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt index 29fe9a7..83151eb 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/HMAService.kt @@ -16,6 +16,7 @@ import icu.nullptr.hidemyapplist.xposed.hook.PmsHookTarget28 import icu.nullptr.hidemyapplist.xposed.hook.PmsHookTarget30 import icu.nullptr.hidemyapplist.xposed.hook.PmsHookTarget33 import icu.nullptr.hidemyapplist.xposed.hook.PmsHookTarget34 +import icu.nullptr.hidemyapplist.xposed.hook.PmsPackageEventsHook import org.frknkrc44.hma_oss.common.BuildConfig import java.io.File import java.util.concurrent.ExecutorService @@ -150,6 +151,7 @@ class HMAService(val pms: IPackageManager) : IHMAService.Stub() { } frameworkHooks.add(ActivityHook(this)) + frameworkHooks.add(PmsPackageEventsHook(this)) frameworkHooks.forEach(IFrameworkHook::load) logI(TAG, "Hooks installed") diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt index c0d8066..79962ed 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/XposedEntry.kt @@ -1,8 +1,6 @@ package icu.nullptr.hidemyapplist.xposed -import android.content.Intent import android.content.pm.IPackageManager -import android.os.Build import com.github.kyuubiran.ezxhelper.init.EzXHelperInit import com.github.kyuubiran.ezxhelper.utils.findMethod import com.github.kyuubiran.ezxhelper.utils.getFieldByDesc @@ -34,39 +32,6 @@ class XposedEntry : IXposedHookZygoteInit, IXposedHookLoadPackage { EzXHelperInit.initHandleLoadPackage(lpparam) logI(TAG, "Hook entry") - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - try { - findMethod("com.android.server.pm.BroadcastHelper") { - name == "sendPackageBroadcastAndNotify" - }.hookBefore { param -> - HMAService.instance?.handlePackageEvent( - param.args[0] as String?, - param.args[1] as String? - ) - } - } catch (e: Throwable) { - findMethod("com.android.internal.content.PackageMonitor") { - name == "onReceive" - }.hookBefore { param -> - val intent = param.args[1] as Intent? ?: return@hookBefore - - HMAService.instance?.handlePackageEvent( - intent.action, - intent.data?.encodedSchemeSpecificPart - ) - } - } - } else { - findMethod("com.android.server.pm.PackageManagerService") { - name == "sendPackageBroadcast" - }.hookBefore { param -> - HMAService.instance?.handlePackageEvent( - param.args[0] as String?, - param.args[1] as String? - ) - } - } - var serviceManagerHook: XC_MethodHook.Unhook? = null serviceManagerHook = findMethod("android.os.ServiceManager") { name == "addService" diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsPackageEventsHook.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsPackageEventsHook.kt new file mode 100644 index 0000000..1ee6518 --- /dev/null +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsPackageEventsHook.kt @@ -0,0 +1,52 @@ +package icu.nullptr.hidemyapplist.xposed.hook + +import android.content.Intent +import android.os.Build +import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookBefore +import de.robv.android.xposed.XC_MethodHook +import icu.nullptr.hidemyapplist.xposed.HMAService + +class PmsPackageEventsHook(private val service: HMAService) : IFrameworkHook { + private var hook: XC_MethodHook.Unhook? = null + + override fun load() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + try { + hook = findMethod("com.android.server.pm.BroadcastHelper") { + name == "sendPackageBroadcastAndNotify" + }.hookBefore { param -> + service.handlePackageEvent( + param.args[0] as String?, + param.args[1] as String? + ) + } + } catch (e: Throwable) { + hook = findMethod("com.android.internal.content.PackageMonitor") { + name == "onReceive" + }.hookBefore { param -> + val intent = param.args[1] as Intent? ?: return@hookBefore + + service.handlePackageEvent( + intent.action, + intent.data?.encodedSchemeSpecificPart + ) + } + } + } else { + hook = findMethod("com.android.server.pm.PackageManagerService") { + name == "sendPackageBroadcast" + }.hookBefore { param -> + service.handlePackageEvent( + param.args[0] as String?, + param.args[1] as String? + ) + } + } + } + + override fun unload() { + hook?.unhook() + hook = null + } +}