@@ -2,18 +2,22 @@ package li.songe.gkd.shizuku
22
33
44import android.content.ComponentName
5+ import android.content.Intent
56import android.content.pm.PackageManager
67import android.os.Build
78import androidx.annotation.RequiresApi
89import androidx.annotation.WorkerThread
910import kotlinx.coroutines.Dispatchers
11+ import kotlinx.coroutines.delay
1012import kotlinx.coroutines.flow.MutableStateFlow
1113import kotlinx.coroutines.flow.SharingStarted
1214import kotlinx.coroutines.flow.combine
1315import kotlinx.coroutines.flow.map
1416import kotlinx.coroutines.flow.stateIn
17+ import li.songe.gkd.META
1518import li.songe.gkd.app
1619import li.songe.gkd.appScope
20+ import li.songe.gkd.isActivityVisible
1721import li.songe.gkd.permission.shizukuGrantedState
1822import li.songe.gkd.permission.updatePermissionState
1923import li.songe.gkd.service.ExposeService
@@ -31,6 +35,7 @@ import rikka.shizuku.Shizuku
3135import rikka.shizuku.ShizukuBinderWrapper
3236import rikka.shizuku.SystemServiceHelper
3337import java.lang.reflect.Method
38+ import kotlin.system.exitProcess
3439
3540inline fun <T > safeInvokeShizuku (
3641 block : () -> T
@@ -224,11 +229,36 @@ private fun updateShizukuBinder() = updateBinderMutex.launchTry(appScope, Dispat
224229 toast(" Shizuku 服务连接成功" , delayMillis = delayMillis)
225230 }
226231 } else if (shizukuContextFlow.value.ok) {
227- uiAutomationFlow.value?.shutdown()
228- shizukuContextFlow.value.destroy()
229- shizukuContextFlow.value = defaultShizukuContext
230- toast(" Shizuku 服务已断开" )
232+ val willRelaunch = uiAutomationFlow.value != null && ! shizukuGrantedState.updateAndGet()
233+ if (willRelaunch) {
234+ // 需要重启应用让系统释放 UiAutomation
235+ killRelaunchApp()
236+ } else {
237+ uiAutomationFlow.value?.shutdown(true )
238+ shizukuContextFlow.value.destroy()
239+ shizukuContextFlow.value = defaultShizukuContext
240+ toast(" Shizuku 服务已断开" )
241+ }
242+ }
243+ }
244+
245+ private suspend fun killRelaunchApp () {
246+ if (isActivityVisible) {
247+ toast(" Shizuku 断开,重启应用以释放自动化服务" , forced = true )
248+ delay(1500 )
249+ val intent = app.packageManager.getLaunchIntentForPackage(META .appId)!!
250+ intent.addFlags(
251+ Intent .FLAG_ACTIVITY_NEW_TASK
252+ or Intent .FLAG_ACTIVITY_CLEAR_TOP
253+ or Intent .FLAG_ACTIVITY_CLEAR_TASK
254+ )
255+ app.startActivity(intent)
256+ } else {
257+ toast(" Shizuku 断开,结束应用以释放自动化服务" , forced = true )
258+ delay(1500 )
231259 }
260+ android.os.Process .killProcess(android.os.Process .myPid())
261+ exitProcess(0 )
232262}
233263
234264fun initShizuku () {
0 commit comments