Simplify denylist isolated process handling with wildcard matching

Use a single prefix entry (e.g. "com.example:") to match all isolated
processes of a package instead of listing each service individually.
This avoids needing to reselect isolated processes after app updates.
Also simplify the package-level toggle to always select all processes.

Made-with: Cursor
This commit is contained in:
LoveSy
2026-03-04 23:29:33 +08:00
committed by topjohnwu
parent b89589ee0c
commit 41059e8d69
2 changed files with 23 additions and 18 deletions
@@ -71,19 +71,30 @@ class AppProcessInfo(
private fun Array<out ComponentInfo>?.toProcessList() =
orEmpty().map { createProcess(it.getProcName()) }
private fun Array<ServiceInfo>?.toProcessList() = orEmpty().map {
if (it.isIsolated) {
if (it.useAppZygote) {
val proc = info.processName ?: info.packageName
createProcess("${proc}_zygote")
private fun Array<ServiceInfo>?.toProcessList(): List<ProcessInfo> {
if (this == null) return emptyList()
val result = mutableListOf<ProcessInfo>()
var hasIsolated = false
for (si in this) {
if (si.isIsolated) {
if (si.useAppZygote) {
val proc = info.processName ?: info.packageName
result.add(createProcess("${proc}_zygote"))
} else {
hasIsolated = true
}
} else {
val proc = if (SDK_INT >= Build.VERSION_CODES.Q)
"${it.getProcName()}:${it.name}" else it.getProcName()
createProcess(proc, ISOLATED_MAGIC)
result.add(createProcess(si.getProcName()))
}
} else {
createProcess(it.getProcName())
}
if (hasIsolated) {
val prefix = "${info.processName ?: info.packageName}:"
val isEnabled = denyList.any {
it.packageName == ISOLATED_MAGIC && it.process.startsWith(prefix)
}
result.add(ProcessInfo(prefix, ISOLATED_MAGIC, isEnabled))
}
return result
}
private fun fetchProcesses(pm: PackageManager): Collection<ProcessInfo> {
@@ -133,10 +133,7 @@ class DenyAppState(val info: AppProcessInfo) : Comparable<DenyAppState> {
}
}
} else {
processes
.filterNot { it.isEnabled }
.filter { if (isExpanded) true else it.defaultSelection }
.forEach { it.toggle() }
processes.filterNot { it.isEnabled }.forEach { it.toggle() }
}
}
@@ -153,11 +150,8 @@ class DenyAppState(val info: AppProcessInfo) : Comparable<DenyAppState> {
class DenyProcessState(val process: ProcessInfo) {
var isEnabled by mutableStateOf(process.isEnabled)
val defaultSelection get() =
process.isIsolated || process.isAppZygote || process.name == process.packageName
val displayName: String =
if (process.isIsolated) "(isolated) ${process.name}" else process.name
if (process.isIsolated) "(isolated) ${process.name}*" else process.name
fun toggle() {
isEnabled = !isEnabled