Skip to content

Commit

Permalink
fix: shizuku 在某些机型上 ClassNotFoundException (gkd-kit#212)
Browse files Browse the repository at this point in the history
  • Loading branch information
lisonge committed Oct 28, 2023
1 parent 2c1f0cc commit 4ab0038
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions app/src/main/java/li/songe/gkd/shizuku/ShizukuApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.stateIn
import li.songe.gkd.composition.CanOnDestroy
import li.songe.gkd.data.DeviceInfo
Expand Down Expand Up @@ -92,13 +91,23 @@ fun CanOnDestroy.useSafeGetTasksFc(scope: CoroutineScope): () -> List<ActivityMa
shizukuGrantFlow.value = if (shizukuAliveFlow.value) shizukuIsSafeOK() else false
delay(3000)
}
val activityTaskManagerFlow = combine(
val shizukuCanUsedFlow = combine(
shizukuAliveFlow,
shizukuGrantFlow,
storeFlow.map(scope) { s -> s.enableShizuku }) { shizukuAlive, shizukuGrant, enableShizuku ->
if (enableShizuku && shizukuAlive && shizukuGrant) newActivityTaskManager() else null
}.flowOn(Dispatchers.IO).stateIn(scope, SharingStarted.Eagerly, null)
enableShizuku && shizukuAlive && shizukuGrant
}.stateIn(scope, SharingStarted.Eagerly, false)

val activityTaskManagerFlow =
shizukuCanUsedFlow.map(scope) { if (it) newActivityTaskManager() else null }

return {
activityTaskManagerFlow.value?.safeGetTasks()
if (shizukuCanUsedFlow.value) {
// 避免直接访问方法校验 android.app.IActivityTaskManager 类型
// 报错 java.lang.ClassNotFoundException:Didn't find class "android.app.IActivityTaskManager" on path: DexPathList
activityTaskManagerFlow.value?.safeGetTasks()
} else {
null
}
}
}

0 comments on commit 4ab0038

Please sign in to comment.