From cb2cdaed126d28d238c2e5a468f0d0c8bdbe840d Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:32:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=88=A0=E9=99=A4KernelConfigUtils.kt?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zako/sukisu/ui/util/KernelConfigUtils.kt | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KernelConfigUtils.kt diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KernelConfigUtils.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KernelConfigUtils.kt deleted file mode 100644 index ba32d3df..00000000 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KernelConfigUtils.kt +++ /dev/null @@ -1,15 +0,0 @@ -package shirkneko.zako.sukisu.ui.util - -import java.io.File - -object KernelConfigUtils { - - fun isKpmEnabled(): Boolean { - return try { - val config = File("/proc/config.gz").readText() - config.contains("CONFIG_KPM=y") - } catch (e: Exception) { - false - } - } -} \ No newline at end of file From e9c5ffb4303a51b4d477a92d1fa1dbde83c0086f Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Mon, 31 Mar 2025 22:33:20 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BC=98=E5=8C=96HomeScreen=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4KPM=E7=8A=B6=E6=80=81=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4ContributionCard=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/shirkneko/zako/sukisu/ui/screen/Home.kt | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt index 4b34f607..de7fe75b 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt @@ -51,7 +51,6 @@ import androidx.compose.animation.shrinkVertically import androidx.compose.runtime.saveable.rememberSaveable import shirkneko.zako.sukisu.ui.theme.CardConfig import androidx.core.content.edit -import shirkneko.zako.sukisu.ui.util.KernelConfigUtils.isKpmEnabled @OptIn(ExperimentalMaterial3Api::class) @Destination(start = true) @@ -156,11 +155,10 @@ fun HomeScreen(navigator: DestinationsNavigator) { } InfoCard() if (!isSimpleMode) { + ContributionCard() DonateCard() LearnMoreCard() - ContributionCard() } - Spacer(Modifier) } } @@ -351,13 +349,11 @@ private fun StatusCard( } Spacer(modifier = Modifier.height(4.dp)) - if (isKpmEnabled()) { - val kpmVersion = getKpmVersion() - Text( - text = stringResource(R.string.home_kpm_version, kpmVersion), - style = MaterialTheme.typography.bodyMedium - ) - } + val kpmVersion = getKpmVersion() + Text( + text = stringResource(R.string.home_kpm_version, kpmVersion), + style = MaterialTheme.typography.bodyMedium + ) } } From f67f16733f90b77ff345ae17aec71ba343d6ed85 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Mon, 31 Mar 2025 23:22:03 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=98=E5=8C=96KPM=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91=EF=BC=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=AD=97=E7=AC=A6=E4=B8=B2=E8=B5=84=E6=BA=90?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4KPM=E7=89=88=E6=9C=AC=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/shirkneko/zako/sukisu/ui/screen/Home.kt | 13 ++++++------- .../java/shirkneko/zako/sukisu/ui/screen/kpm.kt | 16 +++++++++++----- .../app/src/main/res/values-zh-rCN/strings.xml | 10 +++++----- manager/app/src/main/res/values/strings.xml | 10 +++++----- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt index de7fe75b..364c2584 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/Home.kt @@ -347,13 +347,6 @@ private fun StatusCard( style = MaterialTheme.typography.bodyMedium ) } - Spacer(modifier = Modifier.height(4.dp)) - - val kpmVersion = getKpmVersion() - Text( - text = stringResource(R.string.home_kpm_version, kpmVersion), - style = MaterialTheme.typography.bodyMedium - ) } } @@ -555,6 +548,12 @@ private fun InfoCard() { InfoCardItem(stringResource(R.string.home_selinux_status), getSELinuxStatus()) + if (!isSimpleMode) { + Spacer(Modifier.height(16.dp)) + InfoCardItem(stringResource(R.string.home_kpm_version), getKpmVersion()) + } + + if (!isSimpleMode) { Spacer(modifier = Modifier.height(16.dp)) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt index 7054a447..6c7729ba 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/screen/kpm.kt @@ -102,19 +102,25 @@ fun KpmScreen( if (confirmResult == ConfirmResult.Confirmed) { val success = loadingDialog.withLoading { - loadKpmModule(tempFile.absolutePath) + try { + val process = ProcessBuilder("nsenter", "-t", "1", "-m").start() + process.waitFor() + loadKpmModule(tempFile.absolutePath) + } catch (e: Exception) { + Log.e("KsuCli", "Failed to execute nsenter command: ${e.message}") + "failed" + } } Log.d("KsuCli", "loadKpmModule result: $success") - if (success == "success") { + if (success.contains("Success", ignoreCase = true)) { viewModel.fetchModuleList() snackBarHost.showSnackbar( message = kpmInstallSuccess, duration = SnackbarDuration.Long ) } else { - // 修正为显示安装失败的消息 snackBarHost.showSnackbar( message = kpmInstallFailed, duration = SnackbarDuration.Long @@ -157,7 +163,7 @@ fun KpmScreen( onClick = { selectPatchLauncher.launch( Intent(Intent.ACTION_GET_CONTENT).apply { - type = "application/*" + type = "*/*" } ) }, @@ -238,7 +244,7 @@ fun KpmScreen( unloadKpmModule(module.id) } Log.d("KsuCli", "unloadKpmModule result: $success") - if (success == "success") { + if (success.contains("Success", ignoreCase = true)) { viewModel.fetchModuleList() snackBarHost.showSnackbar( message = kpmUninstallSuccess, 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 7a345adc..08e3f5be 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -230,11 +230,11 @@ 确定要卸载内核模块 %1$s 吗? 卸载成功 卸载失败 - 安装kpm模块 - 确认安装吗? - 安装kpm模块成功 - 安装kpm模块失败 - KPM 版本: %s + 加载kpm模块 + 确认加载吗? + 加载kpm模块成功 + 加载kpm模块失败 + KPM 版本 关闭 以下内核模块功能由KernelPatch开发,经过修改后加入SukiSU Ultra的内核模块功能 SukiSU Ultra展望 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 861e94c3..c24c465c 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -232,13 +232,13 @@ Determine the kernel module to uninstall: %1$s ? Uninstalled successfully Failed to uninstall - Installing the kpm module - Confirm installation? - Installation of kpm module successful - Installation of kpm module failed + Load the kpm module + Confirm Load? + Load of kpm module successful + Load of kpm module failed kpm parameters kpm control - KPM Version: %s + KPM Version close The following kernel module functions were developed by KernelPatch and modified to include the kernel module functions of SukiSU Ultra SukiSU Ultra Look forward to From 408c3be67590bc11c528125495919a5df742775e Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Tue, 1 Apr 2025 02:40:58 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=98=E5=8C=96Kpm=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0=E7=9A=84=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=EF=BC=8C=E6=94=B9=E4=B8=BABoolean=E6=88=96In?= =?UTF-8?q?t=E4=BB=A5=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB=E6=80=A7?= =?UTF-8?q?=E5=92=8C=E5=87=86=E7=A1=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shirkneko/zako/sukisu/ui/util/KsuCli.kt | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KsuCli.kt b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KsuCli.kt index cf4c4c01..1b5df7db 100644 --- a/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KsuCli.kt +++ b/manager/app/src/main/java/shirkneko/zako/sukisu/ui/util/KsuCli.kt @@ -486,51 +486,51 @@ private fun getKpmmgrPath(): String { } -fun loadKpmModule(path: String, args: String? = null): String { +fun loadKpmModule(path: String, args: String? = null): Boolean { val shell = getRootShell() val cmd = "${getKpmmgrPath()} load $path ${args ?: ""}" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.contains("Success") } -fun unloadKpmModule(name: String): String { +fun unloadKpmModule(name: String): Boolean { val shell = getRootShell() val cmd = "${getKpmmgrPath()} unload $name" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.trim().toIntOrNull() == 0 } -fun getKpmModuleCount(): String { +fun getKpmModuleCount(): Int { val shell = getRootShell() val cmd = "${getKpmmgrPath()} num" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.trim().toIntOrNull() ?: 0 } fun listKpmModules(): String { val shell = getRootShell() val cmd = "${getKpmmgrPath()} list" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.trim() } fun getKpmModuleInfo(name: String): String { val shell = getRootShell() val cmd = "${getKpmmgrPath()} info $name" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.trim() } -fun controlKpmModule(name: String, args: String? = null): String { +fun controlKpmModule(name: String, args: String? = null): Int { val shell = getRootShell() val cmd = "${getKpmmgrPath()} control $name ${args ?: ""}" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.trim().toIntOrNull() ?: -1 } fun getKpmVersion(): String { val shell = getRootShell() val cmd = "${getKpmmgrPath()} version" val result = ShellUtils.fastCmd(shell, cmd) - return result + return result.trim() }