From 213a15cdb6899f9ba5b4d2e5a2dd3fe86fcf4a3d Mon Sep 17 00:00:00 2001 From: YangQi0408 Date: Tue, 8 Jul 2025 22:34:34 +0800 Subject: [PATCH] =?UTF-8?q?manager:=20=E6=98=BE=E7=A4=BA=20Zygisk=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F=20(#264)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * manager: Add display of Zygisk Implement feature and formatting code * manager: Change the method of detecting Zygisk Implement Signed-off-by: YangQi0408 Co-authored-by: WenHao2130 --- .../java/com/sukisu/ultra/ui/screen/Home.kt | 57 +++++++++++++------ .../java/com/sukisu/ultra/ui/util/KsuCli.kt | 22 ++++++- .../ultra/ui/viewmodel/HomeViewModel.kt | 6 +- .../src/main/res/values-zh-rCN/strings.xml | 1 + manager/app/src/main/res/values/strings.xml | 1 + 5 files changed, 65 insertions(+), 22 deletions(-) diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt index a45e8657..5108aab4 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/Home.kt @@ -261,8 +261,8 @@ fun UpdateCard() { @Composable fun RebootDropdownItem(@StringRes id: Int, reason: String = "") { DropdownMenuItem( - text = {Text(stringResource(id))}, - onClick = {reboot(reason)}) + text = { Text(stringResource(id)) }, + onClick = { reboot(reason) }) } @OptIn(ExperimentalMaterial3Api::class) @@ -319,7 +319,8 @@ private fun TopBar( }) { RebootDropdownItem(id = R.string.reboot) - val pm = LocalContext.current.getSystemService(Context.POWER_SERVICE) as PowerManager? + val pm = + LocalContext.current.getSystemService(Context.POWER_SERVICE) as PowerManager? @Suppress("DEPRECATION") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && pm?.isRebootingUserspaceSupported == true) { RebootDropdownItem(id = R.string.reboot_userspace, reason = "userspace") @@ -343,8 +344,10 @@ private fun StatusCard( onClickInstall: () -> Unit = {} ) { ElevatedCard( - colors = getCardColors( if (systemStatus.ksuVersion != null)MaterialTheme.colorScheme.secondaryContainer - else MaterialTheme.colorScheme.errorContainer), + colors = getCardColors( + if (systemStatus.ksuVersion != null) MaterialTheme.colorScheme.secondaryContainer + else MaterialTheme.colorScheme.errorContainer + ), elevation = getCardElevation(), ) { Row( @@ -433,7 +436,10 @@ private fun StatusCard( } } - val isHideVersion = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE) + val isHideVersion = LocalContext.current.getSharedPreferences( + "settings", + Context.MODE_PRIVATE + ) .getBoolean("is_hide_version", false) if (!isHideVersion) { @@ -679,7 +685,7 @@ private fun InfoCard( modifier = Modifier .fillMaxWidth() .weight(1f) - ){ + ) { Text( text = label, style = MaterialTheme.typography.labelLarge, @@ -731,7 +737,12 @@ private fun InfoCard( when (signatureIndex) { 1 -> "(${stringResource(R.string.default_signature)})" 2 -> "(${stringResource(R.string.dynamic_signature)})" - else -> if (signatureIndex >= 0) "(${stringResource(R.string.signature_index, signatureIndex)})" else "(${stringResource(R.string.unknown_signature)})" + else -> if (signatureIndex >= 0) "(${ + stringResource( + R.string.signature_index, + signatureIndex + ) + })" else "(${stringResource(R.string.unknown_signature)})" } ) append(" | ") @@ -751,19 +762,28 @@ private fun InfoCard( icon = Icons.Default.Security, ) + if (!isSimpleMode && systemInfo.zygiskImplement != "None") { + InfoCardItem( + stringResource(R.string.home_zygisk_implement), + systemInfo.zygiskImplement, + icon = Icons.Default.Adb, + ) + } + if (!isSimpleMode) { // 根据showKpmInfo决定是否显示KPM信息 if (lkmMode != true && !showKpmInfo) { - val displayVersion = if (systemInfo.kpmVersion.isEmpty() || systemInfo.kpmVersion.startsWith("Error")) { - val statusText = if (Natives.isKPMEnabled()) { - stringResource(R.string.kernel_patched) + val displayVersion = + if (systemInfo.kpmVersion.isEmpty() || systemInfo.kpmVersion.startsWith("Error")) { + val statusText = if (Natives.isKPMEnabled()) { + stringResource(R.string.kernel_patched) + } else { + stringResource(R.string.kernel_not_enabled) + } + "${stringResource(R.string.not_supported)} ($statusText)" } else { - stringResource(R.string.kernel_not_enabled) + "${stringResource(R.string.supported)} (${systemInfo.kpmVersion})" } - "${stringResource(R.string.not_supported)} ($statusText)" - } else { - "${stringResource(R.string.supported)} (${systemInfo.kpmVersion})" - } InfoCardItem( stringResource(R.string.home_kpm_version), @@ -775,7 +795,8 @@ private fun InfoCard( if (!isSimpleMode && !isHideSusfsStatus && systemInfo.suSFSStatus == "Supported" && - systemInfo.suSFSVersion.isNotEmpty()) { + systemInfo.suSFSVersion.isNotEmpty() + ) { val infoText = SuSFSInfoText(systemInfo) @@ -804,9 +825,11 @@ private fun SuSFSInfoText(systemInfo: HomeViewModel.SystemInfo): String = buildS append(" ${stringResource(R.string.sus_su_mode)} ${systemInfo.susSUMode}") } } + Natives.getHookType() == "Manual" -> { append(" (${stringResource(R.string.manual_hook)})") } + else -> { append(" (${Natives.getHookType()})") } diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt index 9bda606c..fd98d8d4 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/util/KsuCli.kt @@ -223,7 +223,11 @@ fun restoreBoot( onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit ): Boolean { val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libzakoboot.so") - val result = flashWithIO("${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", onStdout, onStderr) + val result = flashWithIO( + "${getKsuDaemonPath()} boot-restore -f --magiskboot $magiskboot", + onStdout, + onStderr + ) onFinish(result.isSuccess, result.code) return result.isSuccess } @@ -232,7 +236,8 @@ fun uninstallPermanently( onFinish: (Boolean, Int) -> Unit, onStdout: (String) -> Unit, onStderr: (String) -> Unit ): Boolean { val magiskboot = File(ksuApp.applicationInfo.nativeLibraryDir, "libzakoboot.so") - val result = flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr) + val result = + flashWithIO("${getKsuDaemonPath()} uninstall --magiskboot $magiskboot", onStdout, onStderr) onFinish(result.isSuccess, result.code) return result.isSuccess } @@ -457,6 +462,7 @@ fun getSuSFSVariant(): String { val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} variant") return result } + fun getSuSFSFeatures(): String { val shell = getRootShell() val result = ShellUtils.fastCmd(shell, "${getSuSFSDaemonPath()} features") @@ -505,7 +511,7 @@ fun getKpmModuleCount(): Int { return result.trim().toIntOrNull() ?: 0 } -fun runCmd(shell : Shell, cmd : String) : String { +fun runCmd(shell: Shell, cmd: String): String { return shell.newJob() .add(cmd) .to(mutableListOf(), null) @@ -548,3 +554,13 @@ fun getKpmVersion(): String { val result = ShellUtils.fastCmd(shell, cmd) return result.trim() } + +fun getZygiskImplement(): String { + val shell = getRootShell() + val zygiskPath = "/data/adb/modules/zygisksu" + val result = if (ShellUtils.fastCmdResult(shell, "test -f $zygiskPath/module.prop")) { + ShellUtils.fastCmd(shell, "grep '^name=' $zygiskPath/module.prop | cut -d'=' -f2") + } else "None" + Log.i(TAG, "Zygisk implement: $result") + return result +} diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt index 00e333eb..50abca4f 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/viewmodel/HomeViewModel.kt @@ -62,7 +62,8 @@ class HomeViewModel : ViewModel() { val moduleCount: Int = 0, val kpmModuleCount: Int = 0, val managersList: Natives.ManagersList? = null, - val isDynamicSignEnabled: Boolean = false + val isDynamicSignEnabled: Boolean = false, + val zygiskImplement: String = "" ) private val gson = Gson() @@ -280,7 +281,8 @@ class HomeViewModel : ViewModel() { moduleCount = getModuleCount(), kpmModuleCount = getKpmModuleCount(), managersList = managersList, - isDynamicSignEnabled = isDynamicSignEnabled + isDynamicSignEnabled = isDynamicSignEnabled, + zygiskImplement = getZygiskImplement() ) } catch (e: Exception) { Log.e(TAG, "Error fetching system info", e) diff --git a/manager/app/src/main/res/values-zh-rCN/strings.xml b/manager/app/src/main/res/values-zh-rCN/strings.xml index 14fbb271..46cf8465 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -583,4 +583,5 @@ 未知 活跃管理器 无活跃管理器 + Zygisk 实现 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index ef9ae13b..47972ed3 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -586,4 +586,5 @@ Active Manager No active manager SukiSU + Zygisk implement