diff --git a/build.gradle.kts b/build.gradle.kts index dabff6e..f536a16 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,7 +35,7 @@ fun String.execute(currentWorkingDir: File = file("./")): String { val minSdkVer by extra(24) val targetSdkVer by extra(33) -val appVerName by extra("3.0.0") +val appVerName by extra("3.0.0-Beta") val serviceVerCode by extra(83) val minBackupVerCode by extra(65) diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookLegacy.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookLegacy.kt index 2d9b0ec..b8e0c4c 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookLegacy.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookLegacy.kt @@ -21,7 +21,6 @@ class PmsHookLegacy(private val service: HMAService) : IFrameworkHook { } private val hooks = mutableSetOf() - private fun XC_MethodHook.Unhook.yes() = hooks.add(this) @Suppress("UNCHECKED_CAST") private fun removeList( @@ -105,13 +104,13 @@ class PmsHookLegacy(private val service: HMAService) : IFrameworkHook { } for (method in pmMethods) when (method.name) { "getAllPackages" - -> removeList(method, false, listOf()).yes() + -> hooks += removeList(method, false, listOf()) "getInstalledPackages", "getInstalledApplications", "getPackagesHoldingPermissions", "queryInstrumentation" - -> removeList(method, true, listOf("packageName")).yes() + -> hooks += removeList(method, true, listOf("packageName")) "getPackageInfo", "getPackageGids", @@ -120,24 +119,27 @@ class PmsHookLegacy(private val service: HMAService) : IFrameworkHook { "getInstallerPackageName", "getLaunchIntentForPackage", "getLeanbackLaunchIntentForPackage" - -> setResult(method, null).yes() + -> hooks += setResult(method, null) "queryIntentActivities", "queryIntentActivityOptions", "queryIntentReceivers", "queryIntentServices", "queryIntentContentProviders" - -> removeList(method, true, listOf("activityInfo", "packageName")).yes() + -> hooks += removeList(method, true, listOf("activityInfo", "packageName")) "getActivityInfo", "resolveActivity", "resolveActivityAsUser" - -> resolveIntent(method, null).yes() + -> hooks += resolveIntent(method, null) "getPackageUid" - -> setResult(method, -1).yes() + -> hooks += setResult(method, -1) } } - override fun unload() = hooks.forEach(XC_MethodHook.Unhook::unhook) + override fun unload() { + hooks.forEach(XC_MethodHook.Unhook::unhook) + hooks.clear() + } } diff --git a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt index d0e993f..a7d4b35 100644 --- a/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt +++ b/xposed/src/main/java/icu/nullptr/hidemyapplist/xposed/hook/PmsHookTarget28.kt @@ -1,8 +1,10 @@ package icu.nullptr.hidemyapplist.xposed.hook import android.annotation.TargetApi +import android.content.pm.ResolveInfo import android.os.Build import com.github.kyuubiran.ezxhelper.utils.findMethod +import com.github.kyuubiran.ezxhelper.utils.hookAfter import com.github.kyuubiran.ezxhelper.utils.hookBefore import de.robv.android.xposed.XC_MethodHook import icu.nullptr.hidemyapplist.common.Constants @@ -18,12 +20,13 @@ class PmsHookTarget28(private val service: HMAService) : IFrameworkHook { private const val TAG = "PmsHookTarget28" } - private var hook: XC_MethodHook.Unhook? = null + private val hooks = mutableListOf() + @Suppress("UNCHECKED_CAST") override fun load() { logI(TAG, "Load hook") - hook = findMethod(service.pms::class.java, findSuper = true) { - name == "filterAppAccessLPr" + hooks += findMethod(service.pms::class.java, findSuper = true) { + name == "filterAppAccessLPr" && parameterTypes.size == 5 }.hookBefore { param -> runCatching { val callingUid = param.args[1] as Int @@ -45,10 +48,37 @@ class PmsHookTarget28(private val service: HMAService) : IFrameworkHook { unload() } } + hooks += findMethod(service.pms::class.java, findSuper = true) { + name == "applyPostResolutionFilter" + }.hookAfter { param -> + runCatching { + val callingUid = param.args[3] as Int + if (callingUid == Constants.UID_SYSTEM) return@hookAfter + val callingApps = Utils.binderLocalScope { + service.pms.getPackagesForUid(callingUid) + } ?: return@hookAfter + val list = param.result as MutableCollection + val listToRemove = mutableSetOf() + for (resolveInfo in list) { + for (caller in callingApps) { + val targetApp = resolveInfo.resolvePackageName + if (service.shouldHide(caller, targetApp)) { + logI(TAG, "@Filter caller: $callingUid $caller, target: $targetApp") + listToRemove.add(resolveInfo) + break + } + } + } + list.removeAll(listToRemove) + }.onFailure { + logE(TAG, "Fatal error occurred, disable hooks", it) + unload() + } + } } override fun unload() { - hook?.unhook() - hook = null + hooks.forEach(XC_MethodHook.Unhook::unhook) + hooks.clear() } }