diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt index 5ea7876c..d244103b 100644 --- a/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt @@ -69,6 +69,21 @@ import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.concurrent.atomic.AtomicBoolean + +private val isRootAccessFallbackConfirmed = AtomicBoolean(false) +private val rootUidPattern = Regex("\\buid=0\\b") +private val rootAccessCheckLock = Any() + +private fun hasRootAccessFallback() = synchronized(rootAccessCheckLock) { + if (isRootAccessFallbackConfirmed.get()) true + else runCatching { + @Suppress("DEPRECATION") + Shell.su("id").exec().out.any { rootUidPattern.containsMatchIn(it) }.also { + if (it) isRootAccessFallbackConfirmed.set(true) + } + }.getOrNull() == true +} /** * 当前系统环境是否为简体中文 @@ -418,7 +433,7 @@ fun Context.openApp(packageName: String = getPackageName(), userId: Int = 0) = r val isRootAccess get() = runCatching { @Suppress("DEPRECATION") Shell.rootAccess() -}.getOrNull() ?: false +}.getOrNull() == true || isRootAccessFallbackConfirmed.get() || hasRootAccessFallback() /** * 执行命令 @@ -454,4 +469,4 @@ fun Context.hideOrShowLauncherIcon(isShow: Boolean) { val Context.isLauncherIconShowing get() = packageManager?.getComponentEnabledSetting( ComponentName(packageName, "${BuildConfigWrapper.APPLICATION_ID}.Home") - ) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED \ No newline at end of file + ) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED