diff --git a/manager/app/src/main/assets/ksu_susfs_2.0.0 b/manager/app/src/main/assets/ksu_susfs_2.0.0 index 854b3a19..b020e7a6 100644 Binary files a/manager/app/src/main/assets/ksu_susfs_2.0.0 and b/manager/app/src/main/assets/ksu_susfs_2.0.0 differ diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/settings/ToolsScreen.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/settings/ToolsScreen.kt index a199d03d..1f50c275 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/settings/ToolsScreen.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/settings/ToolsScreen.kt @@ -149,31 +149,28 @@ fun Tools( DynamicManagerCard() - val lkmMode = Natives.isLkmMode - if (lkmMode) { - Card( - modifier = Modifier - .padding(top = 12.dp) - .fillMaxWidth(), - ) { - val umontManager = stringResource(id = R.string.umount_path_manager) - SuperArrow( - title = umontManager, - leftAction = { - Icon( - Icons.Rounded.FolderDelete, - modifier = Modifier.padding(end = 16.dp), - contentDescription = umontManager, - tint = colorScheme.onBackground - ) - }, - onClick = { - navigator.navigate(UmountManagerDestination) - } - ) - } + Card( + modifier = Modifier + .padding(top = 12.dp) + .fillMaxWidth(), + ) { + val umontManager = stringResource(id = R.string.umount_path_manager) + SuperArrow( + title = umontManager, + leftAction = { + Icon( + Icons.Rounded.FolderDelete, + modifier = Modifier.padding(end = 16.dp), + contentDescription = umontManager, + tint = colorScheme.onBackground + ) + }, + onClick = { + navigator.navigate(UmountManagerDestination) + } + ) } - + AllowlistBackupSection(scope = scope, context = context) } } diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/SuSFSConfig.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/SuSFSConfig.kt index b987d7fa..9824568c 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/SuSFSConfig.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/SuSFSConfig.kt @@ -42,7 +42,6 @@ import com.sukisu.ultra.ui.susfs.content.PathSettingsContent import com.sukisu.ultra.ui.susfs.content.SusLoopPathsContent import com.sukisu.ultra.ui.susfs.content.SusMapsContent import com.sukisu.ultra.ui.susfs.content.SusPathsContent -import com.sukisu.ultra.ui.susfs.content.TryUmountContent import com.sukisu.ultra.ui.susfs.util.SuSFSManager import com.sukisu.ultra.ui.util.isAbDevice import kotlinx.coroutines.launch @@ -61,7 +60,6 @@ enum class SuSFSTab(val displayNameRes: Int) { SUS_PATHS(R.string.susfs_tab_sus_paths), SUS_LOOP_PATHS(R.string.susfs_tab_sus_loop_paths), SUS_MAPS(R.string.susfs_tab_sus_maps), - TRY_UMOUNT(R.string.susfs_tab_try_umount), KSTAT_CONFIG(R.string.susfs_tab_kstat_config), PATH_SETTINGS(R.string.susfs_tab_path_settings), ENABLED_FEATURES(R.string.susfs_tab_enabled_features); @@ -109,7 +107,6 @@ fun SuSFSConfigScreen( var susPaths by remember { mutableStateOf(emptySet()) } var susLoopPaths by remember { mutableStateOf(emptySet()) } var susMaps by remember { mutableStateOf(emptySet()) } - var tryUmounts by remember { mutableStateOf(emptySet()) } var androidDataPath by remember { mutableStateOf("") } var sdcardPath by remember { mutableStateOf("") } @@ -134,7 +131,6 @@ fun SuSFSConfigScreen( var showAddLoopPathDialog by remember { mutableStateOf(false) } var showAddSusMapDialog by remember { mutableStateOf(false) } var showAddAppPathDialog by remember { mutableStateOf(false) } - var showAddUmountDialog by remember { mutableStateOf(false) } var showAddKstatStaticallyDialog by remember { mutableStateOf(false) } var showAddKstatDialog by remember { mutableStateOf(false) } @@ -142,7 +138,6 @@ fun SuSFSConfigScreen( var editingPath by remember { mutableStateOf(null) } var editingLoopPath by remember { mutableStateOf(null) } var editingSusMap by remember { mutableStateOf(null) } - var editingUmount by remember { mutableStateOf(null) } var editingKstatConfig by remember { mutableStateOf(null) } var editingKstatPath by remember { mutableStateOf(null) } @@ -150,7 +145,6 @@ fun SuSFSConfigScreen( var showResetPathsDialog by remember { mutableStateOf(false) } var showResetLoopPathsDialog by remember { mutableStateOf(false) } var showResetSusMapsDialog by remember { mutableStateOf(false) } - var showResetUmountsDialog by remember { mutableStateOf(false) } var showResetKstatDialog by remember { mutableStateOf(false) } @@ -204,7 +198,6 @@ fun SuSFSConfigScreen( susPaths = SuSFSManager.getSusPaths(context) susLoopPaths = SuSFSManager.getSusLoopPaths(context) susMaps = SuSFSManager.getSusMaps(context) - tryUmounts = SuSFSManager.getTryUmounts(context) androidDataPath = SuSFSManager.getAndroidDataPath(context) sdcardPath = SuSFSManager.getSdcardPath(context) kstatConfigs = SuSFSManager.getKstatConfigs(context) @@ -366,33 +359,6 @@ fun SuSFSConfigScreen( existingSusPaths = susPaths ) - AddTryUmountDialog( - showDialog = showAddUmountDialog, - onDismiss = { - showAddUmountDialog = false - editingUmount = null - }, - onConfirm = { path, mode -> - val oldUmount = editingUmount - coroutineScope.launch { - isLoading = true - val success = if (oldUmount != null) { - SuSFSManager.editTryUmount(context, oldUmount, path, mode) - } else { - SuSFSManager.addTryUmount(context, path, mode) - } - if (success) { - tryUmounts = SuSFSManager.getTryUmounts(context) - } - isLoading = false - showAddUmountDialog = false - editingUmount = null - } - }, - isLoading = isLoading, - initialPath = editingUmount?.split("|")?.get(0) ?: "", - initialMode = editingUmount?.split("|")?.get(1)?.toIntOrNull() ?: 0 - ) AddKstatStaticallyDialog( showDialog = showAddKstatStaticallyDialog, @@ -551,25 +517,6 @@ fun SuSFSConfigScreen( isLoading = isLoading ) - ConfirmDialog( - showDialog = showResetUmountsDialog, - onDismiss = { showResetUmountsDialog = false }, - onConfirm = { - coroutineScope.launch { - isLoading = true - SuSFSManager.saveTryUmounts(context, emptySet()) - tryUmounts = emptySet() - if (SuSFSManager.isAutoStartEnabled(context)) { - SuSFSManager.configureAutoStart(context, true) - } - isLoading = false - showResetUmountsDialog = false - } - }, - titleRes = R.string.susfs_reset_umounts_title, - messageRes = R.string.susfs_reset_umounts_message, - isLoading = isLoading - ) ConfirmDialog( showDialog = showResetKstatDialog, @@ -749,6 +696,18 @@ fun SuSFSConfigScreen( isLoading = false } }, + umountForZygoteIsoService = umountForZygoteIsoService, + onUmountForZygoteIsoServiceChange = { enabled -> + coroutineScope.launch { + isLoading = true + val success = + SuSFSManager.setUmountForZygoteIsoService(context, enabled) + if (success) { + umountForZygoteIsoService = enabled + } + isLoading = false + } + }, onReset = { showConfirmReset = true }, onApply = { coroutineScope.launch { @@ -780,7 +739,6 @@ fun SuSFSConfigScreen( susPaths = SuSFSManager.getSusPaths(context) susLoopPaths = SuSFSManager.getSusLoopPaths(context) susMaps = SuSFSManager.getSusMaps(context) - tryUmounts = SuSFSManager.getTryUmounts(context) androidDataPath = SuSFSManager.getAndroidDataPath(context) sdcardPath = SuSFSManager.getSdcardPath(context) kstatConfigs = SuSFSManager.getKstatConfigs(context) @@ -863,40 +821,6 @@ fun SuSFSConfigScreen( onReset = { showResetSusMapsDialog = true } ) } - SuSFSTab.TRY_UMOUNT -> { - TryUmountContent( - tryUmounts = tryUmounts, - umountForZygoteIsoService = umountForZygoteIsoService, - isLoading = isLoading, - onAddUmount = { showAddUmountDialog = true }, - onRemoveUmount = { umountEntry -> - coroutineScope.launch { - isLoading = true - if (SuSFSManager.removeTryUmount(context, umountEntry)) { - tryUmounts = SuSFSManager.getTryUmounts(context) - } - isLoading = false - } - }, - onEditUmount = { umountEntry -> - editingUmount = umountEntry - showAddUmountDialog = true - }, - onToggleUmountForZygoteIsoService = { enabled -> - coroutineScope.launch { - isLoading = true - val success = - SuSFSManager.setUmountForZygoteIsoService(context, enabled) - if (success) { - umountForZygoteIsoService = enabled - } - isLoading = false - } - }, - onReset = { showResetUmountsDialog = true } - ) - } - SuSFSTab.KSTAT_CONFIG -> { KstatConfigContent( kstatConfigs = kstatConfigs, diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt index 77230aca..47d6816d 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/component/SuSFSConfigDialogs.kt @@ -659,69 +659,6 @@ fun AddAppPathDialog( } } -@Composable -fun AddTryUmountDialog( - showDialog: Boolean, - onDismiss: () -> Unit, - onConfirm: (String, Int) -> Unit, - isLoading: Boolean, - initialPath: String = "", - initialMode: Int = 0 -) { - var newUmountPath by remember { mutableStateOf("") } - var newUmountMode by remember { mutableIntStateOf(0) } - - // 当对话框显示时,设置初始值 - LaunchedEffect(showDialog, initialPath, initialMode) { - if (showDialog) { - newUmountPath = initialPath - newUmountMode = initialMode - } - } - - val umountModeItems = listOf( - stringResource(R.string.susfs_umount_mode_normal), - stringResource(R.string.susfs_umount_mode_detach) - ) - - UniversalDialog( - showDialog = showDialog, - onDismiss = onDismiss, - onConfirm = { - if (newUmountPath.isNotBlank()) { - onConfirm(newUmountPath.trim(), newUmountMode) - true - } else { - false - } - }, - titleRes = if (initialPath.isNotEmpty()) R.string.susfs_edit_try_umount else R.string.susfs_add_try_umount, - isLoading = isLoading, - fields = listOf( - DialogField.TextField( - value = newUmountPath, - onValueChange = { newUmountPath = it }, - labelRes = R.string.susfs_path_label, - enabled = !isLoading - ), - DialogField.Dropdown( - titleRes = R.string.susfs_umount_mode_label, - summary = umountModeItems[newUmountMode], - items = umountModeItems, - selectedIndex = newUmountMode, - onSelectedIndexChange = { newUmountMode = it }, - enabled = !isLoading - ) - ), - confirmTextRes = if (initialPath.isNotEmpty()) R.string.susfs_save else R.string.add, - isConfirmEnabled = newUmountPath.isNotBlank() && !isLoading, - onReset = { - newUmountPath = "" - newUmountMode = 0 - } - ) -} - /** * 添加Kstat静态配置对话框 */ diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt index cb1f87d3..b851d64b 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/BasicSettingsContent.kt @@ -46,6 +46,8 @@ fun BasicSettingsContent( onEnableAvcLogSpoofingChange: (Boolean) -> Unit, hideSusMountsForAllProcs: Boolean, onHideSusMountsForAllProcsChange: (Boolean) -> Unit, + umountForZygoteIsoService: Boolean, + onUmountForZygoteIsoServiceChange: (Boolean) -> Unit, onReset: (() -> Unit)? = null, onApply: (() -> Unit)? = null, onConfigReload: () -> Unit @@ -266,6 +268,23 @@ fun BasicSettingsContent( onCheckedChange = onHideSusMountsForAllProcsChange, enabled = !isLoading ) + + // 卸载 Zygote 隔离服务开关 + SuperSwitch( + title = stringResource(R.string.umount_zygote_iso_service), + summary = stringResource(R.string.umount_zygote_iso_service_description), + leftAction = { + Icon( + Icons.Default.Security, + modifier = Modifier.padding(end = 16.dp), + contentDescription = stringResource(R.string.umount_zygote_iso_service), + tint = colorScheme.onBackground + ) + }, + checked = umountForZygoteIsoService, + onCheckedChange = onUmountForZygoteIsoServiceChange, + enabled = !isLoading + ) } // 槽位信息按钮 diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt deleted file mode 100644 index 10d2c8c0..00000000 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/content/TryUmountContent.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.sukisu.ultra.ui.susfs.content - -import androidx.compose.foundation.layout.* -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.sukisu.ultra.R -import com.sukisu.ultra.ui.susfs.component.BottomActionButtons -import com.sukisu.ultra.ui.susfs.component.EmptyStateCard -import com.sukisu.ultra.ui.susfs.component.PathItemCard -import com.sukisu.ultra.ui.susfs.component.ResetButton -import top.yukonga.miuix.kmp.basic.* -import top.yukonga.miuix.kmp.extra.SuperSwitch -import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme - -@Composable -fun TryUmountContent( - tryUmounts: Set, - umountForZygoteIsoService: Boolean, - isLoading: Boolean, - onAddUmount: () -> Unit, - onRemoveUmount: (String) -> Unit, - onEditUmount: ((String) -> Unit)? = null, - onToggleUmountForZygoteIsoService: (Boolean) -> Unit, - onReset: (() -> Unit)? = null -) { - Column( - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(12.dp) - ) { - Card( - modifier = Modifier.fillMaxWidth(), - ) { - SuperSwitch( - title = stringResource(R.string.umount_zygote_iso_service), - summary = stringResource(R.string.umount_zygote_iso_service_description), - leftAction = { - Icon( - Icons.Default.Security, - modifier = Modifier.padding(end = 16.dp), - contentDescription = stringResource(R.string.umount_zygote_iso_service), - tint = colorScheme.onBackground - ) - }, - checked = umountForZygoteIsoService, - onCheckedChange = onToggleUmountForZygoteIsoService, - enabled = !isLoading - ) - } - - if (tryUmounts.isEmpty()) { - EmptyStateCard( - message = stringResource(R.string.susfs_no_umounts_configured) - ) - } else { - tryUmounts.toList().forEach { umountEntry -> - val parts = umountEntry.split("|") - val path = if (parts.isNotEmpty()) parts[0] else umountEntry - val mode = if (parts.size > 1) parts[1] else "0" - val modeText = if (mode == "0") - stringResource(R.string.susfs_umount_mode_normal_short) - else - stringResource(R.string.susfs_umount_mode_detach_short) - - PathItemCard( - path = path, - icon = Icons.Default.Storage, - additionalInfo = stringResource( - R.string.susfs_umount_mode_display, - modeText, - mode - ), - onDelete = { onRemoveUmount(umountEntry) }, - onEdit = if (onEditUmount != null) { - { onEditUmount(umountEntry) } - } else null, - isLoading = isLoading - ) - } - } - } - - BottomActionButtons( - primaryButtonText = stringResource(R.string.add), - onPrimaryClick = onAddUmount, - isLoading = isLoading - ) - - if (onReset != null && tryUmounts.isNotEmpty()) { - ResetButton( - title = stringResource(R.string.susfs_reset_umounts_title), - onClick = onReset - ) - } -} - diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt index a511a725..e1528eb5 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSManager.kt @@ -40,7 +40,6 @@ object SuSFSManager { private const val KEY_SUS_LOOP_PATHS = "sus_loop_paths" private const val KEY_SUS_MAPS = "sus_maps" - private const val KEY_TRY_UMOUNTS = "try_umounts" private const val KEY_ANDROID_DATA_PATH = "android_data_path" private const val KEY_SDCARD_PATH = "sdcard_path" private const val KEY_ENABLE_LOG = "enable_log" @@ -147,7 +146,6 @@ object SuSFSManager { val susPaths: Set, val susLoopPaths: Set, val susMaps: Set, - val tryUmounts: Set, val androidDataPath: String, val sdcardPath: String, val enableLog: Boolean, @@ -168,7 +166,6 @@ object SuSFSManager { susPaths.isNotEmpty() || susLoopPaths.isNotEmpty() || susMaps.isNotEmpty() || - tryUmounts.isNotEmpty() || kstatConfigs.isNotEmpty() || addKstatPaths.isNotEmpty() } @@ -267,7 +264,6 @@ object SuSFSManager { susPaths = getSusPaths(context), susLoopPaths = getSusLoopPaths(context), susMaps = getSusMaps(context), - tryUmounts = getTryUmounts(context), androidDataPath = getAndroidDataPath(context), sdcardPath = getSdcardPath(context), enableLog = getEnableLogState(context), @@ -369,12 +365,6 @@ object SuSFSManager { fun getSusMaps(context: Context): Set = getPrefs(context).getStringSet(KEY_SUS_MAPS, emptySet()) ?: emptySet() - fun saveTryUmounts(context: Context, umounts: Set) = - getPrefs(context).edit { putStringSet(KEY_TRY_UMOUNTS, umounts) } - - fun getTryUmounts(context: Context): Set = - getPrefs(context).getStringSet(KEY_TRY_UMOUNTS, emptySet()) ?: emptySet() - fun saveKstatConfigs(context: Context, configs: Set) = getPrefs(context).edit { putStringSet(KEY_KSTAT_CONFIGS, configs) } @@ -552,7 +542,6 @@ object SuSFSManager { KEY_SUS_PATHS to getSusPaths(context), KEY_SUS_LOOP_PATHS to getSusLoopPaths(context), KEY_SUS_MAPS to getSusMaps(context), - KEY_TRY_UMOUNTS to getTryUmounts(context), KEY_ANDROID_DATA_PATH to getAndroidDataPath(context), KEY_SDCARD_PATH to getSdcardPath(context), KEY_ENABLE_LOG to getEnableLogState(context), @@ -1066,48 +1055,6 @@ object SuSFSManager { } } - // 添加尝试卸载 - private suspend fun addTryUmountInternal(context: Context, path: String, mode: Int): Boolean { - executeSusfsCommand(context, "add_try_umount '$path' $mode") - saveTryUmounts(context, getTryUmounts(context) + "$path|$mode") - if (isAutoStartEnabled(context)) updateMagiskModule(context) - return true - } - - suspend fun addTryUmount(context: Context, path: String, mode: Int): Boolean { - return addTryUmountInternal(context, path, mode) - } - - suspend fun removeTryUmount(context: Context, umountEntry: String): Boolean { - saveTryUmounts(context, getTryUmounts(context) - umountEntry) - if (isAutoStartEnabled(context)) updateMagiskModule(context) - return true - } - - // 编辑尝试卸载 - suspend fun editTryUmount(context: Context, oldEntry: String, newPath: String, newMode: Int): Boolean { - return try { - val currentUmounts = getTryUmounts(context).toMutableSet() - if (!currentUmounts.remove(oldEntry)) { - return false - } - - saveTryUmounts(context, currentUmounts) - - val success = addTryUmountInternal(context, newPath, newMode) - - if (!success) { - // 如果添加新条目失败,恢复旧条目 - currentUmounts.add(oldEntry) - saveTryUmounts(context, currentUmounts) - if (isAutoStartEnabled(context)) updateMagiskModule(context) - } - return success - } catch (_: Exception) { - false - } - } - // Zygote隔离服务卸载控制 suspend fun setUmountForZygoteIsoService(context: Context, enabled: Boolean): Boolean { val result = executeSusfsCommandWithOutput(context, "umount_for_zygote_iso_service ${if (enabled) 1 else 0}") diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt index 79cf298f..c15c2dc1 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/susfs/util/SuSFSModuleScripts.kt @@ -427,21 +427,6 @@ object ScriptGenerator { appendLine(generateBinaryCheck(config.targetPath)) appendLine() - // 添加尝试卸载 - if (config.tryUmounts.isNotEmpty()) { - appendLine("# 添加尝试卸载") - config.tryUmounts.forEach { umount -> - val parts = umount.split("|") - if (parts.size == 2) { - val path = parts[0] - val mode = parts[1] - appendLine($$"\"$SUSFS_BIN\" add_try_umount '$$path' $$mode") - appendLine($$"echo \"$(get_current_time): 添加尝试卸载: $$path (模式: $$mode)\" >> \"$LOG_FILE\"") - } - } - appendLine() - } - appendLine($$"echo \"$(get_current_time): Post-Mount脚本执行完成\" >> \"$LOG_FILE\"") } } diff --git a/manager/app/src/main/jniLibs/arm64-v8a/libksu_susfs.so b/manager/app/src/main/jniLibs/arm64-v8a/libksu_susfs.so index 854b3a19..b020e7a6 100644 Binary files a/manager/app/src/main/jniLibs/arm64-v8a/libksu_susfs.so and b/manager/app/src/main/jniLibs/arm64-v8a/libksu_susfs.so differ 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 435fe1f0..f877a680 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -361,7 +361,6 @@ 无法找到 ksu_susfs 文件 SuSFS 命令执行失败 - 开机自启动 重启时自动应用所有非默认配置 @@ -369,28 +368,15 @@ 基本设置 SuS 路径 - 尝试卸载 路径设置 启用功能状态 添加 SuS 路径 - 添加尝试卸载 路径 暂无 SuS 路径配置 - 暂无尝试卸载配置 - - 卸载模式 - 普通卸载(0) - 分离卸载(1) - 普通 - 分离 - 模式: %1$s (%2$s) - 重置 SuS 路径 这将清除所有 SuS 路径配置,确定要继续吗? - 重置尝试卸载 - 这将清除所有尝试卸载配置,确定要继续吗? 重置路径设置 Android Data 路径 @@ -475,7 +461,6 @@ 清理工具残留 清理各种模块以及工具的残留文件和目录(可能会误删导致丢失以及无法启动,谨慎使用) 编辑 SuS 路径 - 编辑尝试卸载 编辑 Kstat 静态配置 编辑 Kstat 路径 保存 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index 52f5d47a..a721f6e0 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -369,7 +369,6 @@ Cannot find ksu_susfs file SuSFS command execution failed - Auto Start Automatically apply all non-default configurations on reboot @@ -377,27 +376,15 @@ Basic Settings SUS Paths - Try Umount Path Settings Enabled Features Status Add SUS Path - Add Try Umount Path No SUS paths configured - No try umount configured - - Umount Mode - Normal Umount (0) - Detach Umount (1) - Normal - Detach - Mode: %1$s (%2$s) Reset SUS Paths This will clear all SUS path configurations. Are you sure you want to continue? - Reset Try Umount - This will clear all try umount configurations. Are you sure you want to continue? Reset Path Settings Android Data Path @@ -435,7 +422,6 @@ Use Uname Use Build Time Unable to retrieve slot information - Kstat Configuration Add Kstat Static Configuration @@ -482,7 +468,6 @@ Cleanup Residue Clean up the residual files and directories of various modules and tools (May be deleted by mistake, resulting in loss and failure to start, use with caution) Edit SUS Path - Edit Try Umount Edit Kstat Static Configuration Edit Kstat Path Save