manager: Deprecated AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT, the leftover add_sus_mount cli and umount_for_zygote_system_process

Reason:
 - AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT is also causing a bit more performance overheads and still it cannot catch all the sus mounts in all situations. Actually it can easily be done in boot-completed.sh, and it should be more accurate, see module templates for more details.

- Official KernelSU also allows ksud to add custom path to try_umount list as well, users can use their own way to add only the desired sus mounts to try_umount list, but remember to disable susfs ADD_TRY_UMOUNT in kernel if users want to use the official one.

- There are less use cases for umount_for_zygote_system_process, and sometimes enabling this may cause bootloop with some modules enabled, instead user can use busybox nsenter to umount the sus mounts for specific process later by themmselves.
This commit is contained in:
ShirkNeko
2025-11-22 22:54:10 +08:00
parent 39f4a5991a
commit 5c80febdbd
10 changed files with 37 additions and 361 deletions

View File

@@ -12,7 +12,6 @@ import androidx.compose.material.icons.filled.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
@@ -42,7 +41,6 @@ import com.sukisu.ultra.ui.susfs.content.KstatConfigContent
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.SusMountsContent
import com.sukisu.ultra.ui.susfs.content.SusPathsContent
import com.sukisu.ultra.ui.susfs.content.TryUmountContent
import com.sukisu.ultra.ui.susfs.util.SuSFSManager
@@ -63,7 +61,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),
SUS_MOUNTS(R.string.susfs_tab_sus_mounts),
TRY_UMOUNT(R.string.susfs_tab_try_umount),
KSTAT_CONFIG(R.string.susfs_tab_kstat_config),
PATH_SETTINGS(R.string.susfs_tab_path_settings),
@@ -112,7 +109,6 @@ fun SuSFSConfigScreen(
var susPaths by remember { mutableStateOf(emptySet<String>()) }
var susLoopPaths by remember { mutableStateOf(emptySet<String>()) }
var susMaps by remember { mutableStateOf(emptySet<String>()) }
var susMounts by remember { mutableStateOf(emptySet<String>()) }
var tryUmounts by remember { mutableStateOf(emptySet<String>()) }
var androidDataPath by remember { mutableStateOf("") }
var sdcardPath by remember { mutableStateOf("") }
@@ -138,7 +134,6 @@ fun SuSFSConfigScreen(
var showAddLoopPathDialog by remember { mutableStateOf(false) }
var showAddSusMapDialog by remember { mutableStateOf(false) }
var showAddAppPathDialog by remember { mutableStateOf(false) }
var showAddMountDialog by remember { mutableStateOf(false) }
var showAddUmountDialog by remember { mutableStateOf(false) }
var showAddKstatStaticallyDialog by remember { mutableStateOf(false) }
var showAddKstatDialog by remember { mutableStateOf(false) }
@@ -147,7 +142,6 @@ fun SuSFSConfigScreen(
var editingPath by remember { mutableStateOf<String?>(null) }
var editingLoopPath by remember { mutableStateOf<String?>(null) }
var editingSusMap by remember { mutableStateOf<String?>(null) }
var editingMount by remember { mutableStateOf<String?>(null) }
var editingUmount by remember { mutableStateOf<String?>(null) }
var editingKstatConfig by remember { mutableStateOf<String?>(null) }
var editingKstatPath by remember { mutableStateOf<String?>(null) }
@@ -156,7 +150,6 @@ fun SuSFSConfigScreen(
var showResetPathsDialog by remember { mutableStateOf(false) }
var showResetLoopPathsDialog by remember { mutableStateOf(false) }
var showResetSusMapsDialog by remember { mutableStateOf(false) }
var showResetMountsDialog by remember { mutableStateOf(false) }
var showResetUmountsDialog by remember { mutableStateOf(false) }
var showResetKstatDialog by remember { mutableStateOf(false) }
@@ -211,7 +204,6 @@ fun SuSFSConfigScreen(
susPaths = SuSFSManager.getSusPaths(context)
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
susMaps = SuSFSManager.getSusMaps(context)
susMounts = SuSFSManager.getSusMounts(context)
tryUmounts = SuSFSManager.getTryUmounts(context)
androidDataPath = SuSFSManager.getAndroidDataPath(context)
sdcardPath = SuSFSManager.getSdcardPath(context)
@@ -371,34 +363,6 @@ fun SuSFSConfigScreen(
existingSusPaths = susPaths
)
AddPathDialog(
showDialog = showAddMountDialog,
onDismiss = {
showAddMountDialog = false
editingMount = null
},
onConfirm = { mount ->
coroutineScope.launch {
isLoading = true
val success = if (editingMount != null) {
SuSFSManager.editSusMount(context, editingMount!!, mount)
} else {
SuSFSManager.addSusMount(context, mount)
}
if (success) {
susMounts = SuSFSManager.getSusMounts(context)
}
isLoading = false
showAddMountDialog = false
editingMount = null
}
},
isLoading = isLoading,
titleRes = if (editingMount != null) R.string.susfs_edit_sus_mount else R.string.susfs_add_sus_mount,
labelRes = R.string.susfs_mount_path_label,
initialValue = editingMount ?: ""
)
AddTryUmountDialog(
showDialog = showAddUmountDialog,
onDismiss = {
@@ -581,26 +545,6 @@ fun SuSFSConfigScreen(
isLoading = isLoading
)
ConfirmDialog(
showDialog = showResetMountsDialog,
onDismiss = { showResetMountsDialog = false },
onConfirm = {
coroutineScope.launch {
isLoading = true
SuSFSManager.saveSusMounts(context, emptySet())
susMounts = emptySet()
if (SuSFSManager.isAutoStartEnabled(context)) {
SuSFSManager.configureAutoStart(context, true)
}
isLoading = false
showResetMountsDialog = false
}
},
titleRes = R.string.susfs_reset_mounts_title,
messageRes = R.string.susfs_reset_mounts_message,
isLoading = isLoading
)
ConfirmDialog(
showDialog = showResetUmountsDialog,
onDismiss = { showResetUmountsDialog = false },
@@ -785,6 +729,20 @@ fun SuSFSConfigScreen(
isLoading = false
}
},
hideSusMountsForAllProcs = hideSusMountsForAllProcs,
onHideSusMountsForAllProcsChange = { hideForAll: Boolean ->
coroutineScope.launch {
isLoading = true
if (SuSFSManager.setHideSusMountsForAllProcs(
context,
hideForAll
)
) {
hideSusMountsForAllProcs = hideForAll
}
isLoading = false
}
},
onReset = { showConfirmReset = true },
onApply = {
coroutineScope.launch {
@@ -816,7 +774,6 @@ fun SuSFSConfigScreen(
susPaths = SuSFSManager.getSusPaths(context)
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
susMaps = SuSFSManager.getSusMaps(context)
susMounts = SuSFSManager.getSusMounts(context)
tryUmounts = SuSFSManager.getTryUmounts(context)
androidDataPath = SuSFSManager.getAndroidDataPath(context)
sdcardPath = SuSFSManager.getSdcardPath(context)
@@ -900,42 +857,6 @@ fun SuSFSConfigScreen(
onReset = { showResetSusMapsDialog = true }
)
}
SuSFSTab.SUS_MOUNTS -> {
SusMountsContent(
susMounts = susMounts,
hideSusMountsForAllProcs = hideSusMountsForAllProcs,
isLoading = isLoading,
onAddMount = { showAddMountDialog = true },
onRemoveMount = { mount ->
coroutineScope.launch {
isLoading = true
if (SuSFSManager.removeSusMount(context, mount)) {
susMounts = SuSFSManager.getSusMounts(context)
}
isLoading = false
}
},
onEditMount = { mount ->
editingMount = mount
showAddMountDialog = true
},
onToggleHideSusMountsForAllProcs = { hideForAll ->
coroutineScope.launch {
isLoading = true
if (SuSFSManager.setHideSusMountsForAllProcs(
context,
hideForAll
)
) {
hideSusMountsForAllProcs = hideForAll
}
isLoading = false
}
},
onReset = { showResetMountsDialog = true }
)
}
SuSFSTab.TRY_UMOUNT -> {
TryUmountContent(
tryUmounts = tryUmounts,

View File

@@ -25,7 +25,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.foundation.Image
@@ -1431,101 +1430,3 @@ fun FeatureStatusCard(
}
}
@Composable
fun SusMountHidingControlCard(
hideSusMountsForAllProcs: Boolean,
isLoading: Boolean,
onToggleHiding: (Boolean) -> Unit
) {
Card(
modifier = Modifier.fillMaxWidth(),
colors = CardDefaults.defaultColors(
color = colorScheme.surface
)
) {
Column(
modifier = Modifier.padding(12.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
// 标题行
Row(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = if (hideSusMountsForAllProcs) Icons.Default.VisibilityOff else Icons.Default.Visibility,
contentDescription = null,
tint = colorScheme.primary,
modifier = Modifier.size(20.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = stringResource(R.string.susfs_hide_mounts_control_title),
style = MiuixTheme.textStyles.title2,
fontWeight = FontWeight.Bold,
color = colorScheme.onSurface
)
}
// 描述文本
Text(
text = stringResource(R.string.susfs_hide_mounts_control_description),
style = MiuixTheme.textStyles.body1,
color = colorScheme.onSurfaceVariantSummary,
lineHeight = 16.sp
)
// 控制开关
SuperSwitch(
title = stringResource(R.string.susfs_hide_mounts_for_all_procs_label),
summary = if (hideSusMountsForAllProcs) {
stringResource(R.string.susfs_hide_mounts_for_all_procs_enabled_description)
} else {
stringResource(R.string.susfs_hide_mounts_for_all_procs_disabled_description)
},
leftAction = {
Icon(
if (hideSusMountsForAllProcs) Icons.Default.VisibilityOff else Icons.Default.Visibility,
modifier = Modifier.padding(end = 16.dp),
contentDescription = stringResource(R.string.susfs_hide_mounts_for_all_procs_label),
tint = colorScheme.onBackground
)
},
checked = hideSusMountsForAllProcs,
onCheckedChange = onToggleHiding,
enabled = !isLoading
)
// 当前设置显示
Text(
text = stringResource(
R.string.susfs_hide_mounts_current_setting,
if (hideSusMountsForAllProcs) {
stringResource(R.string.susfs_hide_mounts_setting_all)
} else {
stringResource(R.string.susfs_hide_mounts_setting_non_ksu)
}
),
style = MiuixTheme.textStyles.body1,
color = colorScheme.primary,
fontWeight = FontWeight.Medium
)
// 建议文本
Card(
modifier = Modifier.fillMaxWidth(),
colors = CardDefaults.defaultColors(
color = colorScheme.surfaceVariant.copy(alpha = 0.2f)
),
cornerRadius = 8.dp
) {
Text(
text = stringResource(R.string.susfs_hide_mounts_recommendation),
style = MiuixTheme.textStyles.body2,
color = colorScheme.onSurfaceVariantSummary,
lineHeight = 18.sp,
modifier = Modifier.padding(12.dp)
)
}
}
}
}

View File

@@ -44,6 +44,8 @@ fun BasicSettingsContent(
onEnableCleanupResidueChange: (Boolean) -> Unit,
enableAvcLogSpoofing: Boolean,
onEnableAvcLogSpoofingChange: (Boolean) -> Unit,
hideSusMountsForAllProcs: Boolean,
onHideSusMountsForAllProcsChange: (Boolean) -> Unit,
onReset: (() -> Unit)? = null,
onApply: (() -> Unit)? = null,
onConfigReload: () -> Unit
@@ -243,6 +245,27 @@ fun BasicSettingsContent(
onCheckedChange = onEnableAvcLogSpoofingChange,
enabled = !isLoading
)
// 对所有进程隐藏SuS挂载开关
SuperSwitch(
title = stringResource(R.string.susfs_hide_mounts_for_all_procs_label),
summary = if (hideSusMountsForAllProcs) {
stringResource(R.string.susfs_hide_mounts_for_all_procs_enabled_description)
} else {
stringResource(R.string.susfs_hide_mounts_for_all_procs_disabled_description)
},
leftAction = {
Icon(
if (hideSusMountsForAllProcs) Icons.Default.VisibilityOff else Icons.Default.Visibility,
modifier = Modifier.padding(end = 16.dp),
contentDescription = stringResource(R.string.susfs_hide_mounts_for_all_procs_label),
tint = colorScheme.onBackground
)
},
checked = hideSusMountsForAllProcs,
onCheckedChange = onHideSusMountsForAllProcsChange,
enabled = !isLoading
)
}
// 槽位信息按钮

View File

@@ -1,70 +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.Storage
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 com.sukisu.ultra.ui.susfs.component.SusMountHidingControlCard
@Composable
fun SusMountsContent(
susMounts: Set<String>,
hideSusMountsForAllProcs: Boolean,
isLoading: Boolean,
onAddMount: () -> Unit,
onRemoveMount: (String) -> Unit,
onEditMount: ((String) -> Unit)? = null,
onToggleHideSusMountsForAllProcs: (Boolean) -> Unit,
onReset: (() -> Unit)? = null
) {
Column(
modifier = Modifier.fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
SusMountHidingControlCard(
hideSusMountsForAllProcs = hideSusMountsForAllProcs,
isLoading = isLoading,
onToggleHiding = onToggleHideSusMountsForAllProcs
)
if (susMounts.isEmpty()) {
EmptyStateCard(
message = stringResource(R.string.susfs_no_mounts_configured)
)
} else {
susMounts.toList().forEach { mount ->
PathItemCard(
path = mount,
icon = Icons.Default.Storage,
onDelete = { onRemoveMount(mount) },
onEdit = if (onEditMount != null) {
{ onEditMount(mount) }
} else null,
isLoading = isLoading
)
}
}
}
BottomActionButtons(
primaryButtonText = stringResource(R.string.add),
onPrimaryClick = onAddMount,
isLoading = isLoading
)
if (onReset != null && susMounts.isNotEmpty()) {
ResetButton(
title = stringResource(R.string.susfs_reset_mounts_title),
onClick = onReset
)
}
}

View File

@@ -39,7 +39,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_SUS_MOUNTS = "sus_mounts"
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"
@@ -147,7 +146,6 @@ object SuSFSManager {
val susPaths: Set<String>,
val susLoopPaths: Set<String>,
val susMaps: Set<String>,
val susMounts: Set<String>,
val tryUmounts: Set<String>,
val androidDataPath: String,
val sdcardPath: String,
@@ -169,7 +167,6 @@ object SuSFSManager {
susPaths.isNotEmpty() ||
susLoopPaths.isNotEmpty() ||
susMaps.isNotEmpty() ||
susMounts.isNotEmpty() ||
tryUmounts.isNotEmpty() ||
kstatConfigs.isNotEmpty() ||
addKstatPaths.isNotEmpty()
@@ -265,7 +262,6 @@ object SuSFSManager {
susPaths = getSusPaths(context),
susLoopPaths = getSusLoopPaths(context),
susMaps = getSusMaps(context),
susMounts = getSusMounts(context),
tryUmounts = getTryUmounts(context),
androidDataPath = getAndroidDataPath(context),
sdcardPath = getSdcardPath(context),
@@ -368,12 +364,6 @@ object SuSFSManager {
fun getSusMaps(context: Context): Set<String> =
getPrefs(context).getStringSet(KEY_SUS_MAPS, emptySet()) ?: emptySet()
fun saveSusMounts(context: Context, mounts: Set<String>) =
getPrefs(context).edit { putStringSet(KEY_SUS_MOUNTS, mounts) }
fun getSusMounts(context: Context): Set<String> =
getPrefs(context).getStringSet(KEY_SUS_MOUNTS, emptySet()) ?: emptySet()
fun saveTryUmounts(context: Context, umounts: Set<String>) =
getPrefs(context).edit { putStringSet(KEY_TRY_UMOUNTS, umounts) }
@@ -532,7 +522,6 @@ object SuSFSManager {
KEY_SUS_PATHS to getSusPaths(context),
KEY_SUS_LOOP_PATHS to getSusLoopPaths(context),
KEY_SUS_MAPS to getSusMaps(context),
KEY_SUS_MOUNTS to getSusMounts(context),
KEY_TRY_UMOUNTS to getTryUmounts(context),
KEY_ANDROID_DATA_PATH to getAndroidDataPath(context),
KEY_SDCARD_PATH to getSdcardPath(context),
@@ -769,7 +758,6 @@ object SuSFSManager {
"CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG" to context.getString(R.string.spoof_cmdline_feature_label),
"CONFIG_KSU_SUSFS_OPEN_REDIRECT" to context.getString(R.string.open_redirect_feature_label),
"CONFIG_KSU_SUSFS_ENABLE_LOG" to context.getString(R.string.enable_log_feature_label),
"CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT" to context.getString(R.string.auto_try_umount_bind_feature_label),
"CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS" to context.getString(R.string.hide_symbols_feature_label),
"CONFIG_KSU_SUSFS_SUS_KSTAT" to context.getString(R.string.sus_kstat_feature_label),
)
@@ -799,7 +787,6 @@ object SuSFSManager {
"spoof_cmdline_feature_label" to context.getString(R.string.spoof_cmdline_feature_label),
"open_redirect_feature_label" to context.getString(R.string.open_redirect_feature_label),
"enable_log_feature_label" to context.getString(R.string.enable_log_feature_label),
"auto_try_umount_bind_feature_label" to context.getString(R.string.auto_try_umount_bind_feature_label),
"hide_symbols_feature_label" to context.getString(R.string.hide_symbols_feature_label),
"sus_kstat_feature_label" to context.getString(R.string.sus_kstat_feature_label),
@@ -1075,54 +1062,6 @@ object SuSFSManager {
}
}
// 添加SUS挂载
suspend fun addSusMount(context: Context, mount: String): Boolean {
val success = executeSusfsCommand(context, "add_sus_mount '$mount'")
if (success) {
saveSusMounts(context, getSusMounts(context) + mount)
if (isAutoStartEnabled(context)) updateMagiskModule(context)
}
return success
}
suspend fun removeSusMount(context: Context, mount: String): Boolean {
saveSusMounts(context, getSusMounts(context) - mount)
if (isAutoStartEnabled(context)) updateMagiskModule(context)
showToast(context, "Removed SUS mount: $mount")
return true
}
// 编辑SUS挂载
suspend fun editSusMount(context: Context, oldMount: String, newMount: String): Boolean {
return try {
val currentMounts = getSusMounts(context).toMutableSet()
if (!currentMounts.remove(oldMount)) {
showToast(context, "Original mount not found: $oldMount")
return false
}
saveSusMounts(context, currentMounts)
val success = addSusMount(context, newMount)
if (success) {
showToast(context, "SUS mount updated: $oldMount -> $newMount")
return true
} else {
// 如果添加新挂载点失败,恢复旧挂载点
currentMounts.add(oldMount)
saveSusMounts(context, currentMounts)
if (isAutoStartEnabled(context)) updateMagiskModule(context)
showToast(context, "Failed to update mount, reverted to original")
return false
}
} catch (e: Exception) {
e.printStackTrace()
showToast(context, "Error updating SUS mount: ${e.message}")
false
}
}
// 添加尝试卸载
suspend fun addTryUmount(context: Context, path: String, mode: Int): Boolean {
val commandSuccess = executeSusfsCommand(context, "add_try_umount '$path' $mode")

View File

@@ -427,16 +427,6 @@ object ScriptGenerator {
appendLine(generateBinaryCheck(config.targetPath))
appendLine()
// 添加SUS挂载
if (config.susMounts.isNotEmpty()) {
appendLine("# 添加SUS挂载")
config.susMounts.forEach { mount ->
appendLine($$"\"$SUSFS_BIN\" add_sus_mount '$$mount'")
appendLine($$"echo \"$(get_current_time): 添加SUS挂载: $$mount\" >> \"$LOG_FILE\"")
}
appendLine()
}
// 添加尝试卸载
if (config.tryUmounts.isNotEmpty()) {
appendLine("# 添加尝试卸载")

View File

@@ -374,20 +374,16 @@
<!-- SuSFS Tab Titles -->
<string name="susfs_tab_basic_settings">基本设置</string>
<string name="susfs_tab_sus_paths">SuS 路径</string>
<string name="susfs_tab_sus_mounts">SuS 挂载</string>
<string name="susfs_tab_try_umount">尝试卸载</string>
<string name="susfs_tab_path_settings">路径设置</string>
<string name="susfs_tab_enabled_features">启用功能状态</string>
<!-- SuSFS Path Management -->
<string name="susfs_add_sus_path">添加 SuS 路径</string>
<string name="susfs_add_sus_mount">添加 SuS 挂载</string>
<string name="susfs_add_try_umount">添加尝试卸载</string>
<string name="susfs_sus_path_added_success">SuS 路径添加成功</string>
<string name="susfs_path_not_found_error">路径未找到错误</string>
<string name="susfs_path_label">路径</string>
<string name="susfs_mount_path_label">挂载路径</string>
<string name="susfs_no_paths_configured">暂无 SuS 路径配置</string>
<string name="susfs_no_mounts_configured">暂无 SuS 挂载配置</string>
<string name="susfs_no_umounts_configured">暂无尝试卸载配置</string>
<!-- SuSFS Umount Mode -->
<string name="susfs_umount_mode_label">卸载模式</string>
@@ -402,8 +398,6 @@
<!-- SuSFS Reset Categories -->
<string name="susfs_reset_paths_title">重置 SuS 路径</string>
<string name="susfs_reset_paths_message">这将清除所有 SuS 路径配置,确定要继续吗?</string>
<string name="susfs_reset_mounts_title">重置 SuS 挂载</string>
<string name="susfs_reset_mounts_message">这将清除所有 SuS 挂载配置,确定要继续吗?</string>
<string name="susfs_reset_umounts_title">重置尝试卸载</string>
<string name="susfs_reset_umounts_message">这将清除所有尝试卸载配置,确定要继续吗?</string>
<string name="susfs_reset_path_title">重置路径设置</string>
@@ -423,7 +417,6 @@
<string name="spoof_cmdline_feature_label">欺骗 Cmdline/Bootconfig</string>
<string name="open_redirect_feature_label">开放重定向支持</string>
<string name="enable_log_feature_label">日志记录支持</string>
<string name="auto_try_umount_bind_feature_label">自动尝试卸载绑定挂载</string>
<string name="hide_symbols_feature_label">隐藏 KSU SuSFS 符号</string>
<string name="sus_kstat_feature_label">SuS Kstat 支持</string>
<!-- 可切换状态 -->
@@ -473,17 +466,11 @@
<string name="kstat_path_management">Kstat 路径管理</string>
<string name="no_kstat_config_message">暂无 Kstat 配置,点击下方按钮添加配置</string>
<!-- SuSFS Mount Hiding Control Related Strings -->
<string name="susfs_hide_mounts_control_title">SuS 挂载隐藏控制</string>
<string name="susfs_hide_mounts_control_description">控制 SuS 挂载对进程的隐藏行为</string>
<string name="susfs_hide_mounts_for_all_procs_label">对所有进程隐藏 SuS 挂载</string>
<string name="susfs_hide_mounts_for_all_procs_enabled_description">启用后SuS 挂载将对所有进程隐藏,包括 KSU 进程</string>
<string name="susfs_hide_mounts_for_all_procs_disabled_description">禁用后SuS 挂载仅对非 KSU 进程隐藏KSU 进程可以看到挂载</string>
<string name="susfs_hide_mounts_all_enabled">已启用对所有进程隐藏 SuS 挂载</string>
<string name="susfs_hide_mounts_all_disabled">已禁用对所有进程隐藏 SuS 挂载</string>
<string name="susfs_hide_mounts_recommendation">建议在屏幕解锁后或在 service.sh 或 boot-completed.sh 阶段设置为禁用,这可以修复一些依赖 KSU 进程挂载的 root 应用的问题</string>
<string name="susfs_hide_mounts_current_setting">当前设置: %s</string>
<string name="susfs_hide_mounts_setting_all">对所有进程隐藏</string>
<string name="susfs_hide_mounts_setting_non_ksu">仅对非 KSU 进程隐藏</string>
<string name="susfs_android_data_path_set">Android Data 路径已设置为: %s</string>
<string name="susfs_sdcard_path_set">SDCard 路径已设置为: %s</string>
<string name="susfs_path_setup_warning">路径设置可能未完全成功,但将继续添加 SuS 路径</string>
@@ -512,7 +499,6 @@
<string name="cleanup_residue">清理工具残留</string>
<string name="cleanup_residue_description">清理各种模块以及工具的残留文件和目录(可能会误删导致丢失以及无法启动,谨慎使用)</string>
<string name="susfs_edit_sus_path">编辑 SuS 路径</string>
<string name="susfs_edit_sus_mount">编辑 SuS 挂载</string>
<string name="susfs_edit_try_umount">编辑尝试卸载</string>
<string name="edit_kstat_statically_title">编辑 Kstat 静态配置</string>
<string name="edit_kstat_path_title">编辑 Kstat 路径</string>

View File

@@ -382,20 +382,16 @@
<!-- SuSFS Tab Titles -->
<string name="susfs_tab_basic_settings">Basic Settings</string>
<string name="susfs_tab_sus_paths">SUS Paths</string>
<string name="susfs_tab_sus_mounts">SUS Mounts</string>
<string name="susfs_tab_try_umount">Try Umount</string>
<string name="susfs_tab_path_settings">Path Settings</string>
<string name="susfs_tab_enabled_features">Enabled Features Status</string>
<!-- SuSFS Path Management -->
<string name="susfs_add_sus_path">Add SUS Path</string>
<string name="susfs_add_sus_mount">Add SUS Mount</string>
<string name="susfs_add_try_umount">Add Try Umount</string>
<string name="susfs_sus_path_added_success">SUS path added successfully</string>
<string name="susfs_path_not_found_error">Path not found error</string>
<string name="susfs_path_label">Path</string>
<string name="susfs_mount_path_label">Mount Path</string>
<string name="susfs_no_paths_configured">No SUS paths configured</string>
<string name="susfs_no_mounts_configured">No SUS mounts configured</string>
<string name="susfs_no_umounts_configured">No try umount configured</string>
<!-- SuSFS Umount Mode -->
<string name="susfs_umount_mode_label">Umount Mode</string>
@@ -409,8 +405,6 @@
<!-- SuSFS Reset Categories -->
<string name="susfs_reset_paths_title">Reset SUS Paths</string>
<string name="susfs_reset_paths_message">This will clear all SUS path configurations. Are you sure you want to continue?</string>
<string name="susfs_reset_mounts_title">Reset SUS Mounts</string>
<string name="susfs_reset_mounts_message">This will clear all SUS mount configurations. Are you sure you want to continue?</string>
<string name="susfs_reset_umounts_title">Reset Try Umount</string>
<string name="susfs_reset_umounts_message">This will clear all try umount configurations. Are you sure you want to continue?</string>
<string name="susfs_reset_path_title">Reset Path Settings</string>
@@ -430,7 +424,6 @@
<string name="spoof_cmdline_feature_label">Spoof Cmdline/Bootconfig</string>
<string name="open_redirect_feature_label">Open Redirect Support</string>
<string name="enable_log_feature_label">Logging Support</string>
<string name="auto_try_umount_bind_feature_label">Auto Try Umount Bind Mount</string>
<string name="hide_symbols_feature_label">Hide KSU SUSFS Symbols</string>
<string name="sus_kstat_feature_label">SUS Kstat Support</string>
<!-- 可切换状态 -->
@@ -480,17 +473,11 @@
<string name="kstat_path_management">Kstat Path Management</string>
<string name="no_kstat_config_message">No Kstat configuration yet, click the button below to add</string>
<!-- SuSFS Mount Hiding Control Related Strings -->
<string name="susfs_hide_mounts_control_title">SUS Mount Hiding Control</string>
<string name="susfs_hide_mounts_control_description">Control the hiding behavior of SUS mounts for processes</string>
<string name="susfs_hide_mounts_for_all_procs_label">Hide SUS mounts for all processes</string>
<string name="susfs_hide_mounts_for_all_procs_enabled_description">When enabled, SUS mounts will be hidden from all processes, including KSU processes</string>
<string name="susfs_hide_mounts_for_all_procs_disabled_description">When disabled, SUS mounts will only be hidden from non-KSU processes, KSU processes can see the mounts</string>
<string name="susfs_hide_mounts_all_enabled">Enabled hiding SUS mounts for all processes</string>
<string name="susfs_hide_mounts_all_disabled">Disabled hiding SUS mounts for all processes</string>
<string name="susfs_hide_mounts_recommendation">It is recommended to set to disabled after screen is unlocked, or during service.sh or boot-completed.sh stage, as this should fix the issue on some rooted apps that rely on mounts mounted by KSU process</string>
<string name="susfs_hide_mounts_current_setting">Current setting: %s</string>
<string name="susfs_hide_mounts_setting_all">Hide for all processes</string>
<string name="susfs_hide_mounts_setting_non_ksu">Hide only for non-KSU processes</string>
<string name="susfs_android_data_path_set">Android Data path has been set to: %s</string>
<string name="susfs_sdcard_path_set">SD card path has been set to: %s</string>
<string name="susfs_path_setup_warning">Path setup may not be fully successful, but SUS paths will continue to be added</string>
@@ -519,7 +506,6 @@
<string name="cleanup_residue">Cleanup Residue</string>
<string name="cleanup_residue_description">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)</string>
<string name="susfs_edit_sus_path">Edit SUS Path</string>
<string name="susfs_edit_sus_mount">Edit SUS Mount</string>
<string name="susfs_edit_try_umount">Edit Try Umount</string>
<string name="edit_kstat_statically_title">Edit Kstat Static Configuration</string>
<string name="edit_kstat_path_title">Edit Kstat Path</string>