From 088996da9b051bfb96275c87241b765524bf08d6 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Thu, 20 Nov 2025 18:48:59 +0800 Subject: [PATCH] Revert "kernel: expose umount list to ioctl interface #2950" This reverts commit 029ae8d389b4c03d7fe0c3d44cedb230488ff123. --- kernel/kernel_umount.c | 36 ++++-- kernel/kernel_umount.h | 15 +-- kernel/supercalls.c | 109 +----------------- kernel/supercalls.h | 20 +--- kernel/umount_manager.c | 24 ++-- kernel/umount_manager.h | 5 +- .../ultra/ui/screen/UmountManagerScreen.kt | 35 ++++-- .../java/com/sukisu/ultra/ui/util/KsuCli.kt | 9 +- .../app/src/main/res/values-ar/strings.xml | 3 + .../app/src/main/res/values-az/strings.xml | 3 + .../app/src/main/res/values-bs/strings.xml | 3 + .../app/src/main/res/values-da/strings.xml | 3 + .../app/src/main/res/values-de/strings.xml | 3 + .../app/src/main/res/values-es/strings.xml | 3 + .../app/src/main/res/values-et/strings.xml | 3 + .../app/src/main/res/values-fa/strings.xml | 3 + .../app/src/main/res/values-fil/strings.xml | 3 + .../app/src/main/res/values-fr/strings.xml | 3 + .../app/src/main/res/values-hi/strings.xml | 3 + .../app/src/main/res/values-hr/strings.xml | 3 + .../app/src/main/res/values-hu/strings.xml | 3 + .../app/src/main/res/values-idn/strings.xml | 4 + .../app/src/main/res/values-in/strings.xml | 6 + .../app/src/main/res/values-it/strings.xml | 3 + .../app/src/main/res/values-ja/strings.xml | 5 + .../app/src/main/res/values-kn/strings.xml | 3 + .../app/src/main/res/values-ko/strings.xml | 3 + .../app/src/main/res/values-lt/strings.xml | 3 + .../app/src/main/res/values-lv/strings.xml | 3 + .../app/src/main/res/values-mr/strings.xml | 3 + .../app/src/main/res/values-ms/strings.xml | 3 + .../app/src/main/res/values-nl/strings.xml | 3 + .../app/src/main/res/values-pl/strings.xml | 3 + .../app/src/main/res/values-pt/strings.xml | 3 + .../app/src/main/res/values-ro/strings.xml | 3 + .../app/src/main/res/values-ru/strings.xml | 11 ++ .../app/src/main/res/values-sl/strings.xml | 3 + .../app/src/main/res/values-th/strings.xml | 3 + .../app/src/main/res/values-tr/strings.xml | 9 ++ .../app/src/main/res/values-uk/strings.xml | 4 + .../app/src/main/res/values-vi/strings.xml | 9 ++ .../src/main/res/values-zh-rCN/strings.xml | 11 ++ .../src/main/res/values-zh-rHK/strings.xml | 4 + .../src/main/res/values-zh-rTW/strings.xml | 6 + manager/app/src/main/res/values/strings.xml | 11 ++ userspace/ksud/src/cli.rs | 42 +------ userspace/ksud/src/ksucalls.rs | 49 -------- userspace/ksud/src/umount_manager.rs | 26 ++++- 48 files changed, 271 insertions(+), 257 deletions(-) diff --git a/kernel/kernel_umount.c b/kernel/kernel_umount.c index 40860570..9bd8ec57 100644 --- a/kernel/kernel_umount.c +++ b/kernel/kernel_umount.c @@ -43,6 +43,24 @@ static const struct ksu_feature_handler kernel_umount_handler = { .set_handler = kernel_umount_feature_set, }; +static bool should_umount(struct path *path) +{ + if (!path) { + return false; + } + + if (current->nsproxy->mnt_ns == init_nsproxy.mnt_ns) { + pr_info("ignore global mnt namespace process: %d\n", current_uid().val); + return false; + } + + if (path->mnt && path->mnt->mnt_sb && path->mnt->mnt_sb->s_type) { + const char *fstype = path->mnt->mnt_sb->s_type->name; + return strcmp(fstype, "overlay") == 0; + } + return false; +} + extern int path_umount(struct path *path, int flags); static void ksu_umount_mnt(struct path *path, int flags) @@ -53,7 +71,7 @@ static void ksu_umount_mnt(struct path *path, int flags) } } -void try_umount(const char *mnt, int flags) +void try_umount(const char *mnt, bool check_mnt, int flags) { struct path path; int err = kern_path(mnt, 0, &path); @@ -67,6 +85,12 @@ void try_umount(const char *mnt, int flags) return; } + // we are only interest in some specific mounts + if (check_mnt && !should_umount(&path)) { + path_put(&path); + return; + } + ksu_umount_mnt(&path, flags); } @@ -83,14 +107,8 @@ static void umount_tw_func(struct callback_head *cb) saved = override_creds(tw->old_cred); } - struct mount_entry *entry; - down_read(&mount_list_lock); - list_for_each_entry(entry, &mount_list, list) { - pr_info("%s: unmounting: %s flags 0x%x\n", __func__, entry->umountable, entry->flags); - try_umount(entry->umountable, entry->flags); - } - up_read(&mount_list_lock); - + // fixme: use `collect_mounts` and `iterate_mount` to iterate all mountpoint and + // filter the mountpoint whose target is `/data/adb` ksu_umount_manager_execute_all(tw->old_cred); if (saved) diff --git a/kernel/kernel_umount.h b/kernel/kernel_umount.h index 65da6203..68d2f759 100644 --- a/kernel/kernel_umount.h +++ b/kernel/kernel_umount.h @@ -2,24 +2,13 @@ #define __KSU_H_KERNEL_UMOUNT #include -#include -#include void ksu_kernel_umount_init(void); void ksu_kernel_umount_exit(void); -void try_umount(const char *mnt, int flags); +void try_umount(const char *mnt, bool check_mnt, int flags); // Handler function to be called from setresuid hook int ksu_handle_umount(uid_t old_uid, uid_t new_uid); -// for the umount list -struct mount_entry { - char *umountable; - unsigned int flags; - struct list_head list; -}; -extern struct list_head mount_list; -extern struct rw_semaphore mount_list_lock; - -#endif +#endif \ No newline at end of file diff --git a/kernel/supercalls.c b/kernel/supercalls.c index e42007f0..85349f96 100644 --- a/kernel/supercalls.c +++ b/kernel/supercalls.c @@ -18,7 +18,6 @@ #include "feature.h" #include "klog.h" // IWYU pragma: keep #include "ksud.h" -#include "kernel_umount.h" #include "manager.h" #include "selinux/selinux.h" #include "objsec.h" @@ -511,111 +510,6 @@ static int do_nuke_ext4_sysfs(void __user *arg) return nuke_ext4_sysfs(mnt); } -struct list_head mount_list = LIST_HEAD_INIT(mount_list); -DECLARE_RWSEM(mount_list_lock); - -static int add_try_umount(void __user *arg) -{ - struct mount_entry *new_entry, *entry, *tmp; - struct ksu_add_try_umount_cmd cmd; - char buf[256] = {0}; - - if (copy_from_user(&cmd, arg, sizeof cmd)) - return -EFAULT; - - switch (cmd.mode) { - case KSU_UMOUNT_WIPE: { - struct mount_entry *entry, *tmp; - down_write(&mount_list_lock); - list_for_each_entry_safe(entry, tmp, &mount_list, list) { - pr_info("wipe_umount_list: removing entry: %s\n", entry->umountable); - list_del(&entry->list); - kfree(entry->umountable); - kfree(entry); - } - up_write(&mount_list_lock); - - return 0; - } - - case KSU_UMOUNT_ADD: { - long len = strncpy_from_user(buf, (const char __user *)cmd.arg, 256); - if (len <= 0) - return -EFAULT; - - buf[sizeof(buf) - 1] = '\0'; - - new_entry = kzalloc(sizeof(*new_entry), GFP_KERNEL); - if (!new_entry) - return -ENOMEM; - - new_entry->umountable = kstrdup(buf, GFP_KERNEL); - if (!new_entry->umountable) { - kfree(new_entry); - return -1; - } - - down_write(&mount_list_lock); - - // disallow dupes - // if this gets too many, we can consider moving this whole task to a kthread - list_for_each_entry(entry, &mount_list, list) { - if (!strcmp(entry->umountable, buf)) { - pr_info("cmd_add_try_umount: %s is already here!\n", buf); - up_write(&mount_list_lock); - kfree(new_entry->umountable); - kfree(new_entry); - return -1; - } - } - - // now check flags and add - // this also serves as a null check - if (cmd.flags) - new_entry->flags = cmd.flags; - else - new_entry->flags = 0; - - // debug - list_add(&new_entry->list, &mount_list); - up_write(&mount_list_lock); - pr_info("cmd_add_try_umount: %s added!\n", buf); - - return 0; - } - - // this is just strcmp'd wipe anyway - case KSU_UMOUNT_DEL: { - long len = strncpy_from_user(buf, (const char __user *)cmd.arg, sizeof(buf) - 1); - if (len <= 0) - return -EFAULT; - - buf[sizeof(buf) - 1] = '\0'; - - down_write(&mount_list_lock); - list_for_each_entry_safe(entry, tmp, &mount_list, list) { - if (!strcmp(entry->umountable, buf)) { - pr_info("cmd_add_try_umount: entry removed: %s\n", entry->umountable); - list_del(&entry->list); - kfree(entry->umountable); - kfree(entry); - } - } - up_write(&mount_list_lock); - - return 0; - } - - default: { - pr_err("cmd_add_try_umount: invalid operation %u\n", cmd.mode); - return -EINVAL; - } - - } // switch(cmd.mode) - - return 0; -} - // 100. GET_FULL_VERSION - Get full version string static int do_get_full_version(void __user *arg) { @@ -827,7 +721,7 @@ static int do_umount_manager(void __user *arg) switch (cmd.operation) { case UMOUNT_OP_ADD: { - return ksu_umount_manager_add(cmd.path, cmd.flags, false); + return ksu_umount_manager_add(cmd.path, cmd.check_mnt, cmd.flags, false); } case UMOUNT_OP_REMOVE: { return ksu_umount_manager_remove(cmd.path); @@ -864,7 +758,6 @@ static const struct ksu_ioctl_cmd_map ksu_ioctl_handlers[] = { { .cmd = KSU_IOCTL_GET_WRAPPER_FD, .name = "GET_WRAPPER_FD", .handler = do_get_wrapper_fd, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_MANAGE_MARK, .name = "MANAGE_MARK", .handler = do_manage_mark, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_NUKE_EXT4_SYSFS, .name = "NUKE_EXT4_SYSFS", .handler = do_nuke_ext4_sysfs, .perm_check = manager_or_root }, - { .cmd = KSU_IOCTL_ADD_TRY_UMOUNT, .name = "ADD_TRY_UMOUNT", .handler = add_try_umount, .perm_check = manager_or_root }, { .cmd = KSU_IOCTL_GET_FULL_VERSION,.name = "GET_FULL_VERSION", .handler = do_get_full_version, .perm_check = always_allow}, { .cmd = KSU_IOCTL_HOOK_TYPE,.name = "GET_HOOK_TYPE", .handler = do_get_hook_type, .perm_check = manager_or_root}, { .cmd = KSU_IOCTL_ENABLE_KPM, .name = "GET_ENABLE_KPM", .handler = do_enable_kpm, .perm_check = manager_or_root}, diff --git a/kernel/supercalls.h b/kernel/supercalls.h index 6caca808..c4f95e19 100644 --- a/kernel/supercalls.h +++ b/kernel/supercalls.h @@ -89,25 +89,14 @@ struct ksu_manage_mark_cmd { __u32 result; // Output: for get operation - mark status or reg_count }; -#define KSU_MARK_GET 1 -#define KSU_MARK_MARK 2 -#define KSU_MARK_UNMARK 3 -#define KSU_MARK_REFRESH 4 - struct ksu_nuke_ext4_sysfs_cmd { __aligned_u64 arg; // Input: mnt pointer }; -struct ksu_add_try_umount_cmd { - __aligned_u64 arg; // char ptr, this is the mountpoint - __u32 flags; // this is the flag we use for it - __u8 mode; // denotes what to do with it 0:wipe_list 1:add_to_list 2:delete_entry -}; - -#define KSU_UMOUNT_WIPE 0 // ignore everything and wipe list -#define KSU_UMOUNT_ADD 1 // add entry (path + flags) -#define KSU_UMOUNT_DEL 2 // delete entry, strcmp - +#define KSU_MARK_GET 1 +#define KSU_MARK_MARK 2 +#define KSU_MARK_UNMARK 3 +#define KSU_MARK_REFRESH 4 // Other command structures struct ksu_get_full_version_cmd { @@ -163,7 +152,6 @@ struct ksu_manual_su_cmd { #define KSU_IOCTL_GET_WRAPPER_FD _IOC(_IOC_WRITE, 'K', 15, 0) #define KSU_IOCTL_MANAGE_MARK _IOC(_IOC_READ|_IOC_WRITE, 'K', 16, 0) #define KSU_IOCTL_NUKE_EXT4_SYSFS _IOC(_IOC_WRITE, 'K', 17, 0) -#define KSU_IOCTL_ADD_TRY_UMOUNT _IOC(_IOC_WRITE, 'K', 18, 0) // Other IOCTL command definitions #define KSU_IOCTL_GET_FULL_VERSION _IOC(_IOC_READ, 'K', 100, 0) #define KSU_IOCTL_HOOK_TYPE _IOC(_IOC_READ, 'K', 101, 0) diff --git a/kernel/umount_manager.c b/kernel/umount_manager.c index b901a19b..5d1e6039 100644 --- a/kernel/umount_manager.c +++ b/kernel/umount_manager.c @@ -17,7 +17,7 @@ static struct umount_manager g_umount_mgr = { static void try_umount_path(struct umount_entry *entry) { - try_umount(entry->path, entry->flags); + try_umount(entry->path, entry->check_mnt, entry->flags); } static struct umount_entry *find_entry_locked(const char *path) @@ -39,19 +39,21 @@ static int init_default_entries(void) const struct { const char *path; + bool check_mnt; int flags; } defaults[] = { - { "/odm", 0 }, - { "/system", 0 }, - { "/vendor", 0 }, - { "/product", 0 }, - { "/system_ext", 0 }, - { "/data/adb/modules", MNT_DETACH }, - { "/debug_ramdisk", MNT_DETACH }, + { "/odm", true, 0 }, + { "/system", true, 0 }, + { "/vendor", true, 0 }, + { "/product", true, 0 }, + { "/system_ext", true, 0 }, + { "/data/adb/modules", false, MNT_DETACH }, + { "/debug_ramdisk", false, MNT_DETACH }, }; for (int i = 0; i < ARRAY_SIZE(defaults); i++) { - ret = ksu_umount_manager_add(defaults[i].path, + ret = ksu_umount_manager_add(defaults[i].path, + defaults[i].check_mnt, defaults[i].flags, true); // is_default = true if (ret) { @@ -91,7 +93,7 @@ void ksu_umount_manager_exit(void) pr_info("Umount manager cleaned up\n"); } -int ksu_umount_manager_add(const char *path, int flags, bool is_default) +int ksu_umount_manager_add(const char *path, bool check_mnt, int flags, bool is_default) { struct umount_entry *entry; unsigned long irqflags; @@ -125,6 +127,7 @@ int ksu_umount_manager_add(const char *path, int flags, bool is_default) } strncpy(entry->path, path, sizeof(entry->path) - 1); + entry->check_mnt = check_mnt; entry->flags = flags; entry->state = UMOUNT_STATE_IDLE; entry->is_default = is_default; @@ -231,6 +234,7 @@ int ksu_umount_manager_get_entries(struct ksu_umount_entry_info __user *entries, memset(&info, 0, sizeof(info)); strncpy(info.path, entry->path, sizeof(info.path) - 1); + info.check_mnt = entry->check_mnt; info.flags = entry->flags; info.is_default = entry->is_default; info.state = entry->state; diff --git a/kernel/umount_manager.h b/kernel/umount_manager.h index 41c9888c..f0299b40 100644 --- a/kernel/umount_manager.h +++ b/kernel/umount_manager.h @@ -16,6 +16,7 @@ enum umount_entry_state { struct umount_entry { struct list_head list; char path[256]; + bool check_mnt; int flags; enum umount_entry_state state; bool is_default; @@ -39,6 +40,7 @@ enum umount_manager_op { struct ksu_umount_manager_cmd { __u32 operation; char path[256]; + __u8 check_mnt; __s32 flags; __u32 count; __aligned_u64 entries_ptr; @@ -46,6 +48,7 @@ struct ksu_umount_manager_cmd { struct ksu_umount_entry_info { char path[256]; + __u8 check_mnt; __s32 flags; __u8 is_default; __u32 state; @@ -54,7 +57,7 @@ struct ksu_umount_entry_info { int ksu_umount_manager_init(void); void ksu_umount_manager_exit(void); -int ksu_umount_manager_add(const char *path, int flags, bool is_default); +int ksu_umount_manager_add(const char *path, bool check_mnt, int flags, bool is_default); int ksu_umount_manager_remove(const char *path); void ksu_umount_manager_execute_all(const struct cred *cred); int ksu_umount_manager_get_entries(struct ksu_umount_entry_info __user *entries, u32 *count); diff --git a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt index 0e2206e3..2e27203d 100644 --- a/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt +++ b/manager/app/src/main/java/com/sukisu/ultra/ui/screen/UmountManagerScreen.kt @@ -38,6 +38,7 @@ private val SPACING_LARGE = 16.dp data class UmountPathEntry( val path: String, + val checkMnt: Boolean, val flags: Int, val isDefault: Boolean ) @@ -243,11 +244,11 @@ fun UmountManagerScreen(navigator: DestinationsNavigator) { if (showAddDialog) { AddUmountPathDialog( onDismiss = { showAddDialog = false }, - onConfirm = { path, flags -> + onConfirm = { path, checkMnt, flags -> showAddDialog = false scope.launch(Dispatchers.IO) { - val success = addUmountPath(path, flags) + val success = addUmountPath(path, checkMnt, flags) withContext(Dispatchers.Main) { if (success) { saveUmountConfig() @@ -308,6 +309,10 @@ fun UmountPathCard( Spacer(modifier = Modifier.height(SPACING_SMALL)) Text( text = buildString { + append(context.getString(R.string.check_mount_type)) + append(": ") + append(if (entry.checkMnt) context.getString(R.string.yes) else context.getString(R.string.no)) + append(" | ") append(context.getString(R.string.flags)) append(": ") append(entry.flags.toUmountFlagName(context)) @@ -348,9 +353,10 @@ fun UmountPathCard( @Composable fun AddUmountPathDialog( onDismiss: () -> Unit, - onConfirm: (String, Int) -> Unit + onConfirm: (String, Boolean, Int) -> Unit ) { var path by rememberSaveable { mutableStateOf("") } + var checkMnt by rememberSaveable { mutableStateOf(false) } var flags by rememberSaveable { mutableStateOf("-1") } AlertDialog( @@ -368,6 +374,20 @@ fun AddUmountPathDialog( Spacer(modifier = Modifier.height(SPACING_MEDIUM)) + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = checkMnt, + onCheckedChange = { checkMnt = it } + ) + Spacer(modifier = Modifier.width(SPACING_SMALL)) + Text(stringResource(R.string.check_mount_type_overlay)) + } + + Spacer(modifier = Modifier.height(SPACING_MEDIUM)) + OutlinedTextField( value = flags, onValueChange = { flags = it }, @@ -383,7 +403,7 @@ fun AddUmountPathDialog( TextButton( onClick = { val flagsInt = flags.toIntOrNull() ?: -1 - onConfirm(path, flagsInt) + onConfirm(path, checkMnt, flagsInt) }, enabled = path.isNotBlank() ) { @@ -404,11 +424,12 @@ private fun parseUmountPaths(output: String): List { return lines.drop(2).mapNotNull { line -> val parts = line.trim().split(Regex("\\s+")) - if (parts.size >= 3) { + if (parts.size >= 4) { UmountPathEntry( path = parts[0], - flags = parts[1].toIntOrNull() ?: -1, - isDefault = parts[2].equals("Yes", ignoreCase = true) + checkMnt = parts[1].equals("true", ignoreCase = true), + flags = parts[2].toIntOrNull() ?: -1, + isDefault = parts[3].equals("Yes", ignoreCase = true) ) } else null } 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 c05cb26c..b532e8c0 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 @@ -13,6 +13,7 @@ import android.util.Log import com.topjohnwu.superuser.CallbackList import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.ShellUtils +import com.topjohnwu.superuser.io.SuFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize @@ -21,6 +22,7 @@ import com.sukisu.ultra.Natives import com.sukisu.ultra.ksuApp import org.json.JSONArray import java.io.File +import java.util.concurrent.CountDownLatch /** @@ -667,14 +669,15 @@ fun readUidScannerFile(): Boolean { return try { ShellUtils.fastCmd(shell, "cat /data/adb/ksu/.uid_scanner").trim() == "1" } catch (_: Exception) { - false + false } } -fun addUmountPath(path: String, flags: Int): Boolean { +fun addUmountPath(path: String, checkMnt: Boolean, flags: Int): Boolean { val shell = getRootShell() + val checkMntFlag = if (checkMnt) "--check-mnt" else "" val flagsArg = if (flags >= 0) "--flags $flags" else "" - val cmd = "${getKsuDaemonPath()} umount add $path $flagsArg" + val cmd = "${getKsuDaemonPath()} umount add $path $checkMntFlag $flagsArg" val result = ShellUtils.fastCmdResult(shell, cmd) Log.i(TAG, "add umount path $path result: $result") return result diff --git a/manager/app/src/main/res/values-ar/strings.xml b/manager/app/src/main/res/values-ar/strings.xml index 542a2566..f1e2a35a 100644 --- a/manager/app/src/main/res/values-ar/strings.xml +++ b/manager/app/src/main/res/values-ar/strings.xml @@ -126,6 +126,7 @@ LKM المحددة: %s حفظ السجلات السجلات محفوظة + وضع SuS SU تأكيد وحدة التثبيت %1$s؟ وحدة غير معروفة @@ -275,6 +276,8 @@ إعدادات متقدمة تخصيص شريط الأدوات عد مرة أخرى + تم تمكين SuSFS + تم تعطيل SuSFS تم تعيين الخلفية بنجاح إزالة خلفيات مخصصة Alternate icon diff --git a/manager/app/src/main/res/values-az/strings.xml b/manager/app/src/main/res/values-az/strings.xml index d90028db..32086b2b 100644 --- a/manager/app/src/main/res/values-az/strings.xml +++ b/manager/app/src/main/res/values-az/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Girişləri Saxla Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-bs/strings.xml b/manager/app/src/main/res/values-bs/strings.xml index da5e8299..4477a43d 100644 --- a/manager/app/src/main/res/values-bs/strings.xml +++ b/manager/app/src/main/res/values-bs/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Sačuvaj Dnevnike Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-da/strings.xml b/manager/app/src/main/res/values-da/strings.xml index 3c3221a5..1c26353c 100644 --- a/manager/app/src/main/res/values-da/strings.xml +++ b/manager/app/src/main/res/values-da/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Gem Logfiler Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-de/strings.xml b/manager/app/src/main/res/values-de/strings.xml index b9d848a4..e149a4f5 100644 --- a/manager/app/src/main/res/values-de/strings.xml +++ b/manager/app/src/main/res/values-de/strings.xml @@ -126,6 +126,7 @@ Wähle LKM: %s Protokolle Speichern Protokolle gespeichert + SuS SU-Modus: das Installationsmodul %1$s bestätigen ? unbekannter Modul @@ -275,6 +276,8 @@ Erweiterte Einstellungen Passt die Symbolleiste an. Comeback + SuSFS aktiviert + SuSFS deaktiviert Hintergrund erfolgreich gesetzt Eigene Hintergründe entfernt Alternatives Symbol diff --git a/manager/app/src/main/res/values-es/strings.xml b/manager/app/src/main/res/values-es/strings.xml index 451ee778..1593c6b0 100644 --- a/manager/app/src/main/res/values-es/strings.xml +++ b/manager/app/src/main/res/values-es/strings.xml @@ -124,6 +124,7 @@ LKM seleccionado: %s Guardar registros Registro guardado + Modo SuS SU: ¿confirmar la instalación del módulo %1$s? módulo desconocido @@ -273,6 +274,8 @@ Configuraciones avanzadas Personalizar la barra de herramientas. Retorno + SuSFS activado + SuSFS desactivado Fondo establecido correctamente Eliminar fondo personalizado Icono alternativo diff --git a/manager/app/src/main/res/values-et/strings.xml b/manager/app/src/main/res/values-et/strings.xml index 7c8640aa..3296faca 100644 --- a/manager/app/src/main/res/values-et/strings.xml +++ b/manager/app/src/main/res/values-et/strings.xml @@ -124,6 +124,7 @@ Valitud LKM: %s Salvesta Logid Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-fa/strings.xml b/manager/app/src/main/res/values-fa/strings.xml index e142416b..bff34861 100644 --- a/manager/app/src/main/res/values-fa/strings.xml +++ b/manager/app/src/main/res/values-fa/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s ذخیره گزارش‌ها Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-fil/strings.xml b/manager/app/src/main/res/values-fil/strings.xml index afcc0b2a..9df07b43 100644 --- a/manager/app/src/main/res/values-fil/strings.xml +++ b/manager/app/src/main/res/values-fil/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s I-save ang mga Log Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-fr/strings.xml b/manager/app/src/main/res/values-fr/strings.xml index 6d465159..a0f027bf 100644 --- a/manager/app/src/main/res/values-fr/strings.xml +++ b/manager/app/src/main/res/values-fr/strings.xml @@ -126,6 +126,7 @@ LKM sélectionné : %s Enregistrer les journaux Journaux enregistrés + Mode Sus confirmer l\'installation du module %1$s? module inconnu @@ -275,6 +276,8 @@ Paramètres avancés Choisir les boutons à afficher Reviens + SuSFS activé + SuSFS désactivé Fond d\'écran défini avec succès Fond d\'écran personnalisé supprimé Icône alternative diff --git a/manager/app/src/main/res/values-hi/strings.xml b/manager/app/src/main/res/values-hi/strings.xml index cde029c2..e07439b9 100644 --- a/manager/app/src/main/res/values-hi/strings.xml +++ b/manager/app/src/main/res/values-hi/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s लॉग सहेजें Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-hr/strings.xml b/manager/app/src/main/res/values-hr/strings.xml index ab688415..1700ada9 100644 --- a/manager/app/src/main/res/values-hr/strings.xml +++ b/manager/app/src/main/res/values-hr/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Spremi Zapise Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-hu/strings.xml b/manager/app/src/main/res/values-hu/strings.xml index ba3813a0..21a465a4 100644 --- a/manager/app/src/main/res/values-hu/strings.xml +++ b/manager/app/src/main/res/values-hu/strings.xml @@ -124,6 +124,7 @@ Kiválasztott LKM: %s Naplók mentése Mentett naplók + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-idn/strings.xml b/manager/app/src/main/res/values-idn/strings.xml index 3dbe03ec..6c9a5eef 100644 --- a/manager/app/src/main/res/values-idn/strings.xml +++ b/manager/app/src/main/res/values-idn/strings.xml @@ -113,6 +113,7 @@ Gunakan opsi ini hanya setelah OTA selesai. Lanjutkan? Lanjut Disarankan gambar partisi %1$s + (tidak stabil) Pilih KMI Copot Pemasangan Copot Pemasangan Sementara @@ -127,6 +128,7 @@ Lanjutkan? LKM Terpilih: %s Simpan Log Log Disimpan + Mode SuS SU: Konfirmasi pemasangan modul %1$s? modul tidak dikenal @@ -281,6 +283,8 @@ Tanamkan: Secara permanen memasang ke sistem Pengaturan Lanjutan Sesuaikan Bilah Alat Kembali + SuSFS diaktifkan + SuSFS dinonaktifkan Latar belakang berhasil diatur Latar belakang khusus dihapus Ikon Alternatif diff --git a/manager/app/src/main/res/values-in/strings.xml b/manager/app/src/main/res/values-in/strings.xml index 64027ac4..d4ba145c 100644 --- a/manager/app/src/main/res/values-in/strings.xml +++ b/manager/app/src/main/res/values-in/strings.xml @@ -114,6 +114,7 @@ Gunakan berkas LKM lokal Hanya berkas .ko yang didukung %1$s image partisi terekomendasi + (tidak stabil) Pilih KMI Hapus Hapus sementara @@ -128,6 +129,7 @@ LKM dipilih: %s Simpan Log Log disimpan + Mode SuS SU: konfirmasi pemasangan modul %1$s? module tidak dikenal @@ -288,6 +290,8 @@ Pengaturan Lanjutan Kustomisasi toolbar Kembali + SuSFS dinyalakan + SuSFS dimatikan Set latar belakang berhasil Latar belakang khusus yang dihapus Ubah ikon @@ -604,6 +608,7 @@ Jalur Loop Tambahkan Jalur Loop + Jalur Loop SUS Konfigurasi Jalur Loop Jalur loop ditandai ulang sebagai SUS_PATH pada setiap startup aplikasi pengguna non-root atau layanan terisolasi. Ini membantu mengatasi masalah di mana jalur yang ditambahkan mungkin memiliki status inode direset atau inode dibuat ulang di kernel. Palsukan log AVC @@ -657,6 +662,7 @@ Diaktifkan: Aktifkan pemalsuan sus tcontext dari \'su\' dengan \'kernel\' yang d Pemindaian Aplikasi Multi-Pengguna Ketika diaktifkan, fitur ini akan memindai aplikasi untuk semua pengguna, termasuk profil kerja Gagal mengatur, silakan periksa perizinan + Gagal mengatur: %s Bersihkan Lingkungan Runtime Bersihkan berkas runtime dan hentikan layanan pemindai Apakah Anda yakin ingin membersihkan lingkungan runtime? Tindakan ini akan menghentikan layanan pemindai dan menghapus berkas yang terkait. diff --git a/manager/app/src/main/res/values-it/strings.xml b/manager/app/src/main/res/values-it/strings.xml index a33f66cb..c664395c 100644 --- a/manager/app/src/main/res/values-it/strings.xml +++ b/manager/app/src/main/res/values-it/strings.xml @@ -126,6 +126,7 @@ LKM selezionato: %s Salva Registri Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -275,6 +276,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ja/strings.xml b/manager/app/src/main/res/values-ja/strings.xml index fdbfa061..ff9e96ec 100644 --- a/manager/app/src/main/res/values-ja/strings.xml +++ b/manager/app/src/main/res/values-ja/strings.xml @@ -112,6 +112,7 @@ \n続行しますか? 次へ %1$s のパーティションイメージを推奨します。 + (不安定) KMI を選択してください アンインストール 一時的にアンインストールする @@ -126,6 +127,7 @@ 選択された LKM: %s ログを保存 保存されたログ + SuS SU モード: %1$s モジュールをインストールしますか? 不明なモジュール @@ -279,6 +281,8 @@ 高度な設定 ツールバーをカスタマイズ 戻る + SuSFS 有効 + SuSFS 無効 背景の設定が成功しました カスタム背景を削除しました 代替アイコン @@ -593,6 +597,7 @@ ループパス ループパスを追加 + SUS ループパス ループパスの構成 ループパスは、非 root ユーザーアプリまたは独立したサービスの起動ごとに SUS_PATH として再設定されます。これにより、追加されたパスの inode ステータスがリセットされたり、カーネル内で inode が再生成される問題に対処できます。 AVC ログの偽装 diff --git a/manager/app/src/main/res/values-kn/strings.xml b/manager/app/src/main/res/values-kn/strings.xml index e60127c6..b0e75f19 100644 --- a/manager/app/src/main/res/values-kn/strings.xml +++ b/manager/app/src/main/res/values-kn/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s ಲಾಗ್ಗಳನ್ನು ಉಳಿಸಿ Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ko/strings.xml b/manager/app/src/main/res/values-ko/strings.xml index 8e6ee7de..387a14f8 100644 --- a/manager/app/src/main/res/values-ko/strings.xml +++ b/manager/app/src/main/res/values-ko/strings.xml @@ -124,6 +124,7 @@ 선택된 LKM: %s 로그 저장 로그 저장됨 + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-lt/strings.xml b/manager/app/src/main/res/values-lt/strings.xml index 4206c33f..4b9c8b4a 100644 --- a/manager/app/src/main/res/values-lt/strings.xml +++ b/manager/app/src/main/res/values-lt/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Saglabāt Žurnālus Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-lv/strings.xml b/manager/app/src/main/res/values-lv/strings.xml index 92b82876..4bdb803a 100644 --- a/manager/app/src/main/res/values-lv/strings.xml +++ b/manager/app/src/main/res/values-lv/strings.xml @@ -126,6 +126,7 @@ Izvēlētais lkm: %s Išsaugoti Žurnalus Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -275,6 +276,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-mr/strings.xml b/manager/app/src/main/res/values-mr/strings.xml index d070c17d..9f455df9 100644 --- a/manager/app/src/main/res/values-mr/strings.xml +++ b/manager/app/src/main/res/values-mr/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s लॉग जतन करा Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ms/strings.xml b/manager/app/src/main/res/values-ms/strings.xml index 245e8b57..ae3faf73 100644 --- a/manager/app/src/main/res/values-ms/strings.xml +++ b/manager/app/src/main/res/values-ms/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Simpan Log Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-nl/strings.xml b/manager/app/src/main/res/values-nl/strings.xml index 3e516f12..5932c21c 100644 --- a/manager/app/src/main/res/values-nl/strings.xml +++ b/manager/app/src/main/res/values-nl/strings.xml @@ -126,6 +126,7 @@ Geselecteerde LKM: %s Logboeken Opslaan Logs opgeslagen + SuS SU mode: confirm install module %1$s? unknown module @@ -275,6 +276,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-pl/strings.xml b/manager/app/src/main/res/values-pl/strings.xml index 3a2203ae..6a5f99bb 100644 --- a/manager/app/src/main/res/values-pl/strings.xml +++ b/manager/app/src/main/res/values-pl/strings.xml @@ -126,6 +126,7 @@ Wybrano LKM: %s Zapisz dzienniki Dzienniki zapisane + SuS SU mode: confirm install module %1$s? unknown module @@ -275,6 +276,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-pt/strings.xml b/manager/app/src/main/res/values-pt/strings.xml index cda81c7a..8791bebc 100644 --- a/manager/app/src/main/res/values-pt/strings.xml +++ b/manager/app/src/main/res/values-pt/strings.xml @@ -124,6 +124,7 @@ LKM selecionado: %s Salvar Registros Registros salvos + Modo SU SuSU: ¿confirmar la instalación del módulo %1$s? módulo desconocido @@ -273,6 +274,8 @@ Configurações Avançadas Personaliza a barra de ferramentas. Retorno + SuSFS habilitado + SuSFS desativado Fundo definido com sucesso Remover Ícone alternativo diff --git a/manager/app/src/main/res/values-ro/strings.xml b/manager/app/src/main/res/values-ro/strings.xml index 10d9095b..f7685065 100644 --- a/manager/app/src/main/res/values-ro/strings.xml +++ b/manager/app/src/main/res/values-ro/strings.xml @@ -126,6 +126,7 @@ Lkm selectat: %s Salvează Jurnale Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -275,6 +276,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-ru/strings.xml b/manager/app/src/main/res/values-ru/strings.xml index 1c6aedec..685a5c74 100644 --- a/manager/app/src/main/res/values-ru/strings.xml +++ b/manager/app/src/main/res/values-ru/strings.xml @@ -115,6 +115,7 @@ Использовать локальный файл LKM Поддерживаются только файлы .ko Образ раздела %1$s рекомендуется + (нестабильный) Выбрать KMI Удалить Удалить на время @@ -129,6 +130,7 @@ Выбран LKM: %s Сохранить логи Логи сохранены + SuS SU режим: подтвердите установку модуля %1$s? неизвестный модуль @@ -289,6 +291,8 @@ Расширенные Внешний вид Возвращение + SuSFS включен + SuSFS выключен Фон успешно установлен Пользовательский фон удалён Альт. иконка @@ -605,6 +609,7 @@ Циклические пути Добавить циклический путь + Циклический путь SUS Конфигурация пути цикла Пути цикла повторно отмечены как SUS_PATH в каждом пользовательском приложении, не являющемся root, или изолированном запуске службы. Это помогает решить проблемы, в которых добавленные пути могут иметь сброс статуса inode или повторно созданные inode в ядре. Спуф AVC лога @@ -657,6 +662,7 @@ Поиск многопользовательских приложений Когда включено, сканирует приложения для всех пользователей, включая рабочие профили Не удалось установить, проверьте права доступа + Не удалось установить: %s Очистить среду Runtime Очистить среду Runtime и остановить службу сканирования Вы уверены, что хотите очистить среду Runtime? Это остановит службу сканирования и удалит связанные с ней файлы. @@ -699,6 +705,9 @@ Очистить логи Вы уверены, что хотите удалить выбранный файл журнала? Это действие нельзя отменить. Логи успешно очищены + Выберите файл журнала + Текущий лог + Старый лог Фильтрация по типу Все типы Показаны записи %1$d из %2$d @@ -726,6 +735,8 @@ Для применения изменений необходима перезагрузка. Система применит новый конфиг при следующем запуске. Добавить путь размонтирования Смонтировать путь + Проверить тип монтирования + Проверить, является ли оверлеем Флаги размонтирования 0=Обычное размонтирование, 8=MNT_DETACH, -1=Автоматически Флаги diff --git a/manager/app/src/main/res/values-sl/strings.xml b/manager/app/src/main/res/values-sl/strings.xml index 27bf3718..83886e1e 100644 --- a/manager/app/src/main/res/values-sl/strings.xml +++ b/manager/app/src/main/res/values-sl/strings.xml @@ -124,6 +124,7 @@ Selected LKM: %s Shrani Dnevnike Logs saved + SuS SU mode: confirm install module %1$s? unknown module @@ -273,6 +274,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-th/strings.xml b/manager/app/src/main/res/values-th/strings.xml index ed07c50f..edd1486c 100644 --- a/manager/app/src/main/res/values-th/strings.xml +++ b/manager/app/src/main/res/values-th/strings.xml @@ -126,6 +126,7 @@ เลือก LKM: %s บันทึกบันทึก บันทึก Log แล้ว + SuS SU mode: confirm install module %1$s? unknown module @@ -275,6 +276,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon diff --git a/manager/app/src/main/res/values-tr/strings.xml b/manager/app/src/main/res/values-tr/strings.xml index 3ee11121..e3dae4e9 100644 --- a/manager/app/src/main/res/values-tr/strings.xml +++ b/manager/app/src/main/res/values-tr/strings.xml @@ -112,6 +112,7 @@ Yerel LKM dosyası kullan Yalnızca .ko dosyaları desteklenir %1$s bölüm görüntüsü önerilir + (kararsız) KMI seçin Kaldır Geçici olarak kaldır @@ -126,6 +127,7 @@ Seçilen LKM: %s Günlükleri kaydet Günlükler kaydedildi + SuS SU modu: %1$s modülünü yüklemek istediğinizden emin misiniz? Bilinmeyen modül @@ -286,6 +288,8 @@ Gelişmiş Ayarlar Araç çubuğunu özelleştir Geri + SuSFS etkin + SuSFS devre dışı Arka plan başarıyla ayarlandı Özel arka planlar kaldırıldı Alternatif simge @@ -602,6 +606,7 @@ Döngü Yolları Döngü Yolu Ekle + SUS Döngü Yolu Döngü Yolu Yapılandırması Döngü yolları, her kök olmayan (non-root) kullanıcı uygulaması veya yalıtılmış hizmet başlangıcında SUS_PATH olarak yeniden işaretlenir. Bu, eklenen yolların inode durumunun sıfırlanması veya çekirdekte yeniden oluşturulması gibi sorunları gidermeye yardımcı olur. AVC Günlük Kaydı Taklidi @@ -655,6 +660,7 @@ etkin: Çekirdekteki AVC günlük kaydında, \'su\' komutuna ait tcontext\'i \'k Çok Kullanıcılı Uygulama Taraması Etkinleştirildiğinde, iş profilleri de dahil olmak üzere tüm kullanıcıların uygulamalarını tarar. Ayar başarısız oldu, lütfen izinleri kontrol edin + Ayar başarısız oldu: %s Çalışma Zamanı Ortamını Temizle Çalışma zamanı dosyalarını temizleyin ve tarayıcı hizmetini durdurun Çalışma zamanı ortamını temizlemek istediğinizden emin misiniz? Bu işlem tarayıcı hizmetini durduracak ve ilgili dosyaları kaldıracaktır. @@ -697,6 +703,9 @@ etkin: Çekirdekteki AVC günlük kaydında, \'su\' komutuna ait tcontext\'i \'k Günlükleri Temizle Seçili günlük dosyasını temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz. Günlükler başarıyla temizlendi + Günlük Dosyası Seç + Mevcut Günlük + Eski Günlük Türe Göre Filtrele Tüm Türler %2$d girişten %1$d tanesi gösteriliyor diff --git a/manager/app/src/main/res/values-uk/strings.xml b/manager/app/src/main/res/values-uk/strings.xml index e4071105..3d6905ba 100644 --- a/manager/app/src/main/res/values-uk/strings.xml +++ b/manager/app/src/main/res/values-uk/strings.xml @@ -111,6 +111,7 @@ Ваш пристрій буде **ПРИМУСОВО** завантажено в поточний неактивний слот після перезавантаження!\nВикористовуйте цю опцію лише після завершення OTA.\nПродовжити? Далі Рекомендується образ розділу %1$s + (нестабільно) Вибрати KMI Видалити Тимчасово видалити @@ -125,6 +126,7 @@ Обраний LKM: %s Зберегти логи Логи збережено + Режим SuS SU: Підтвердити встановлення модуля %1$s? невідомий модуль @@ -276,6 +278,8 @@ Розширені налаштування Налаштувати панель інструментів Повернутися + SuSFS увімкнено + SuSFS вимкнено Фон успішно встановлено Видалено власні фони Альтернативна іконка diff --git a/manager/app/src/main/res/values-vi/strings.xml b/manager/app/src/main/res/values-vi/strings.xml index b62325b1..704533c0 100644 --- a/manager/app/src/main/res/values-vi/strings.xml +++ b/manager/app/src/main/res/values-vi/strings.xml @@ -110,6 +110,7 @@ Thiết bị của bạn sẽ **BUỘC** phải khởi động vào phân vùng chưa được sử dụng!\nChỉ sử dụng tùy chọn này sau khi cập nhật OTA hoàn tất.\nTiếp tục? Kế tiếp Phân vùng %1$s được khuyến nghị + (Thử nghiệm) Chọn KMI Gỡ cài đặt Gỡ cài đặt tạm thời @@ -124,6 +125,7 @@ Đã chọn LKM: %s Lưu nhật ký Nhật ký đã được lưu + Chế độ SuS SU: Xác nhận cài đặt module %1$s? Module không xác định @@ -277,6 +279,8 @@ Cài đặt nâng cao Cài đặt giao diện Trở lại + SuSFS đã bật + SuSFS đã tắt Đã cài đặt hình nền thành công Đã xóa hình nền tùy chỉnh Thay thế icon @@ -593,6 +597,7 @@ Đường dẫn Vòng lặp Thêm Đường dẫn Vòng lặp + Đường dẫn Vòng lặp SuS Cấu hình Đường dẫn Vòng lặp Đường dẫn Vòng lặp được đổi tên thành SUS_PATH mỗi khi một ứng dụng không phải root hoặc dịch vụ cô lập được khởi động. Điều này giúp giải quyết vấn đề đường dẫn đã thêm có thể trở nên không hợp lệ do trạng thái inode được đặt lại hoặc inode được tạo lại trong Kernel Giả mạo nhật ký AVC @@ -646,6 +651,7 @@ Bật: Kích hoạt tính năng giả mạo sus tcontext của \'su\' thành \'k Quét ứng dụng nhiều người dùng Khi được bật, tất cả ứng dụng của người dùng sẽ được quét, bao gồm cả dữ liệu công việc, v.v Thiết lập thất bại, vui lòng kiểm tra quyền + Thiết lập thất bại: %s Dọn dẹp môi trường hoạt động Dọn dẹp các file hoạt động và dừng quét các dịch vụ Bạn có chắc chắn muốn dọn dẹp môi trường hoạt động không? Thao tác này sẽ dừng dịch vụ quét và xóa các file liên quan @@ -688,6 +694,9 @@ Bật: Kích hoạt tính năng giả mạo sus tcontext của \'su\' thành \'k Xoá nhật ký Bạn có chắc chắn muốn xóa tệp nhật ký đã chọn không? Thao tác này không thể hoàn tác Đã xoá nhật ký thành công + Chọn tệp nhật ký + Nhật ký hiện tại + Nhật ký cũ Lọc theo loại Tất cả các loại Hiển thị %1$d trong tổng %2$d nhật ký 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 ea774599..272755a3 100644 --- a/manager/app/src/main/res/values-zh-rCN/strings.xml +++ b/manager/app/src/main/res/values-zh-rCN/strings.xml @@ -113,6 +113,7 @@ 使用本地 LKM 文件 仅支持选择 .ko 文件 建议选择 %1$s 分区镜像 + (实验性的) 选择 KMI 卸载 临时卸载 @@ -127,6 +128,7 @@ 已选择的 LKM:%s 保存日志 日志已保存 + SuS SU 模式: 确认安装模块 %1$s? 未知模块 @@ -287,6 +289,8 @@ 高级设置 外观设置 返回 + SuSFS 已启用 + SuSFS 已禁用 背景设置成功 已移除自定义背景 备选图标 @@ -603,6 +607,7 @@ 循环路径 添加循环路径 + SuS 循环路径 循环路径配置 循环路径会在每次非 root 用户应用或隔离服务启动时重新标记为 SUS_PATH。这有助于解决添加的路径可能因 inode 状态重置或内核中 inode 重新创建而失效的问题 AVC 日志欺骗 @@ -656,6 +661,7 @@ 多用户应用扫描 开启后将扫描所有用户的应用,包括工作资料等 设置失败,请检查权限 + 设置失败: %s 清理运行环境 清理运行时文件并停止扫描服务 您确定要清理运行环境吗?这将停止扫描服务并删除相关文件 @@ -698,6 +704,9 @@ 清空日志 确定要清空选中的日志文件吗?此操作无法撤销。 日志清空成功 + 选择日志文件 + 当前日志 + 旧日志 按类型筛选 所有类型 显示 %1$d / %2$d 条记录 @@ -724,6 +733,8 @@ 添加或删除路径后需要重启设备才能生效。系统会在下次启动时应用新的配置。 添加 Umount 路径 挂载路径 + 检查挂载类型 + 检查是否为 overlay 类型 卸载标志 0=正常卸载, 8=MNT_DETACH, -1=自动 标志 diff --git a/manager/app/src/main/res/values-zh-rHK/strings.xml b/manager/app/src/main/res/values-zh-rHK/strings.xml index e78faec6..2db31602 100644 --- a/manager/app/src/main/res/values-zh-rHK/strings.xml +++ b/manager/app/src/main/res/values-zh-rHK/strings.xml @@ -124,6 +124,7 @@ 選擇嘅 LKM:%s 存儲日誌 日誌已存儲 + SuS SU 模式: 確認安裝模組 %1$s? 未知模組 @@ -275,6 +276,8 @@ 高級配置 外觀配置 返回 + SuSFS 已啟用 + SuSFS 已禁用 背景設定成功 已移除自定義背景 備選圖標 @@ -573,6 +576,7 @@ Zygisk 實現 + SuS 循環路徑 循環路徑配置 循環路徑會喺每次非 root 用戶應用程式或者隔離服務啟動時,重新標記做 SUS_PATH。咁樣可以解決因為 inode 狀態重設或者核心重新建立 inode 而令到添加嘅路徑失效嘅問題。 AVC 日誌欺騙 diff --git a/manager/app/src/main/res/values-zh-rTW/strings.xml b/manager/app/src/main/res/values-zh-rTW/strings.xml index deac5de4..fae212c0 100644 --- a/manager/app/src/main/res/values-zh-rTW/strings.xml +++ b/manager/app/src/main/res/values-zh-rTW/strings.xml @@ -110,6 +110,7 @@ 將在重新啟動後強制切換至另一槽位!\n注意:僅能在 OTA 更新完成後重新啟動前使用。\n確定繼續? 下一步 建議選擇 %1$s 分區映像檔 + (實驗性的) 選擇 KMI 解除安裝 臨時解除安裝 @@ -124,6 +125,7 @@ 已選擇的 LKM:%s 儲存日誌 日誌已儲存 + SuS SU 模式: 確定安裝模組 %1$s? 未知模組 @@ -277,6 +279,8 @@ 進階設定 外觀設定 返回 + SuSFS 已啟用 + SuSFS 已禁用 背景設定成功 已移除自訂背景 備用圖示 @@ -589,6 +593,7 @@ 循環路徑 新增循環路徑 + SuS 循環路徑 循環路徑設定 循環路徑會在每次非 root 使用者應用程式或隔離服務啟動時重新標記為 SUS_PATH。這有助於解決新增的路徑可能因 inode 狀態重設或內核中 inode 重新建立而失效的問題 AVC 日誌偽裝 @@ -642,6 +647,7 @@ 多使用者應用掃描 開啟後將掃描所有使用者的應用,包括工作資料等 設定失敗,請檢查許可權 + 設定失敗: %s 清理執行環境 清理執行時檔案並停止掃描服務 您確定要清理執行環境嗎?這將停止掃描服務並刪除相關檔案 diff --git a/manager/app/src/main/res/values/strings.xml b/manager/app/src/main/res/values/strings.xml index b06e5801..de0acf4b 100644 --- a/manager/app/src/main/res/values/strings.xml +++ b/manager/app/src/main/res/values/strings.xml @@ -115,6 +115,7 @@ Use local LKM file Only .ko files are supported %1$s partition image is recommended + (Unstable) Select KMI Uninstall Uninstall temporarily @@ -129,6 +130,7 @@ Selected LKM: %s Save logs Logs saved + SuS SU mode: Confirm install module %1$s? Unknown module @@ -290,6 +292,8 @@ Advanced Settings Customize the toolbar Comeback + SuSFS enabled + SuSFS disabled Background set successfully Removed custom backgrounds Alternate icon @@ -606,6 +610,7 @@ Loop Paths Add Loop Path + SUS Loop Path Loop Path Configuration Loop paths are re-flagged as SUS_PATH on each non-root user app or isolated service startup. This helps address issues where added paths may have their inode status reset or inode re-created in the kernel AVC Log Spoofing @@ -663,6 +668,7 @@ Important Note:\n Multi-User Application Scanning When enabled, scans applications for all users, including work profiles Setting failed, please check permissions + Setting failed: %s Clean Runtime Environment Clean up runtime files and stop the scanner service Are you sure you want to clean the runtime environment? This will stop the scanner service and remove related files. @@ -705,6 +711,9 @@ Important Note:\n Clear Logs Are you sure you want to clear the selected log file? This action cannot be undone. Logs cleared successfully + Select Log File + Current Log + Old Log Filter by Type All Types Showing %1$d of %2$d entries @@ -733,6 +742,8 @@ Important Note:\n A reboot is required for changes to take effect. The system will apply the new configuration on the next boot. Add Umount Path Mount Path + Check Mount Type + Check if it is an overlay type Unmount Flags 0=Normal unmount, 8=MNT_DETACH, -1=Auto Flags diff --git a/userspace/ksud/src/cli.rs b/userspace/ksud/src/cli.rs index 1bd53bcd..4b042b24 100644 --- a/userspace/ksud/src/cli.rs +++ b/userspace/ksud/src/cli.rs @@ -390,32 +390,6 @@ enum Kernel { /// mount point mnt: String, }, - /// Manage umount list - Umount { - #[command(subcommand)] - command: UmountOp, - }, - /// Notify that module is mounted - NotifyModuleMounted, -} - -#[derive(clap::Subcommand, Debug)] -enum UmountOp { - /// Add mount point to umount list - Add { - /// mount point path - mnt: String, - /// umount flags (default: 0, MNT_DETACH: 2) - #[arg(short, long, default_value = "0")] - flags: u32, - }, - /// Delete mount point from umount list - Del { - /// mount point path - mnt: String, - }, - /// Wipe all entries from umount list - Wipe, } #[cfg(target_arch = "aarch64")] @@ -451,6 +425,7 @@ enum Umount { /// Check mount type (overlay) #[arg(long, default_value = "false")] + check_mnt: bool, /// Umount flags (0 or 8 for MNT_DETACH) #[arg(long, default_value = "-1")] @@ -631,15 +606,6 @@ pub fn run() -> Result<()> { } => crate::boot_patch::restore(boot, magiskboot, flash), Commands::Kernel { command } => match command { Kernel::NukeExt4Sysfs { mnt } => ksucalls::nuke_ext4_sysfs(&mnt), - Kernel::Umount { command } => match command { - UmountOp::Add { mnt, flags } => ksucalls::umount_list_add(&mnt, flags), - UmountOp::Del { mnt } => ksucalls::umount_list_del(&mnt), - UmountOp::Wipe => ksucalls::umount_list_wipe().map_err(Into::into), - }, - Kernel::NotifyModuleMounted => { - ksucalls::report_module_mounted(); - Ok(()) - } }, #[cfg(target_arch = "aarch64")] Commands::Kpm { command } => { @@ -661,7 +627,11 @@ pub fn run() -> Result<()> { } } Commands::Umount { command } => match command { - Umount::Add { path, flags } => crate::umount_manager::add_umount_path(&path, flags), + Umount::Add { + path, + check_mnt, + flags, + } => crate::umount_manager::add_umount_path(&path, check_mnt, flags), Umount::Remove { path } => crate::umount_manager::remove_umount_path(&path), Umount::List => crate::umount_manager::list_umount_paths(), Umount::ClearCustom => crate::umount_manager::clear_custom_paths(), diff --git a/userspace/ksud/src/ksucalls.rs b/userspace/ksud/src/ksucalls.rs index 4a814d2a..6016a368 100644 --- a/userspace/ksud/src/ksucalls.rs +++ b/userspace/ksud/src/ksucalls.rs @@ -18,7 +18,6 @@ const KSU_IOCTL_SET_FEATURE: u32 = 0x40004b0e; // _IOC(_IOC_WRITE, 'K', 14, 0) const KSU_IOCTL_GET_WRAPPER_FD: u32 = 0x40004b0f; // _IOC(_IOC_WRITE, 'K', 15, 0) const KSU_IOCTL_MANAGE_MARK: u32 = 0xc0004b10; // _IOC(_IOC_READ|_IOC_WRITE, 'K', 16, 0) const KSU_IOCTL_NUKE_EXT4_SYSFS: u32 = 0x40004b11; // _IOC(_IOC_WRITE, 'K', 17, 0) -const KSU_IOCTL_ADD_TRY_UMOUNT: u32 = 0x40004b12; // _IOC(_IOC_WRITE, 'K', 18, 0) #[repr(C)] #[derive(Clone, Copy, Default)] @@ -81,25 +80,12 @@ pub struct NukeExt4SysfsCmd { pub arg: u64, } -#[repr(C)] -#[derive(Clone, Copy, Default)] -struct AddTryUmountCmd { - arg: u64, // char ptr, this is the mountpoint - flags: u32, // this is the flag we use for it - mode: u8, // denotes what to do with it 0:wipe_list 1:add_to_list 2:delete_entry -} - // Mark operation constants const KSU_MARK_GET: u32 = 1; const KSU_MARK_MARK: u32 = 2; const KSU_MARK_UNMARK: u32 = 3; const KSU_MARK_REFRESH: u32 = 4; -// Umount operation constants -const KSU_UMOUNT_WIPE: u8 = 0; -const KSU_UMOUNT_ADD: u8 = 1; -const KSU_UMOUNT_DEL: u8 = 2; - // Global driver fd cache #[cfg(any(target_os = "linux", target_os = "android"))] static DRIVER_FD: OnceLock = OnceLock::new(); @@ -324,38 +310,3 @@ pub fn nuke_ext4_sysfs(mnt: &str) -> anyhow::Result<()> { ksuctl(KSU_IOCTL_NUKE_EXT4_SYSFS, &mut ioctl_cmd as *mut _)?; Ok(()) } - -/// Wipe all entries from umount list -pub fn umount_list_wipe() -> std::io::Result<()> { - let mut cmd = AddTryUmountCmd { - arg: 0, - flags: 0, - mode: KSU_UMOUNT_WIPE, - }; - ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?; - Ok(()) -} - -/// Add mount point to umount list -pub fn umount_list_add(path: &str, flags: u32) -> anyhow::Result<()> { - let c_path = std::ffi::CString::new(path)?; - let mut cmd = AddTryUmountCmd { - arg: c_path.as_ptr() as u64, - flags, - mode: KSU_UMOUNT_ADD, - }; - ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?; - Ok(()) -} - -/// Delete mount point from umount list -pub fn umount_list_del(path: &str) -> anyhow::Result<()> { - let c_path = std::ffi::CString::new(path)?; - let mut cmd = AddTryUmountCmd { - arg: c_path.as_ptr() as u64, - flags: 0, - mode: KSU_UMOUNT_DEL, - }; - ksuctl(KSU_IOCTL_ADD_TRY_UMOUNT, &mut cmd as *mut _)?; - Ok(()) -} diff --git a/userspace/ksud/src/umount_manager.rs b/userspace/ksud/src/umount_manager.rs index 41fd5562..d2c30064 100644 --- a/userspace/ksud/src/umount_manager.rs +++ b/userspace/ksud/src/umount_manager.rs @@ -13,6 +13,7 @@ const KSU_IOCTL_UMOUNT_MANAGER: u32 = 0xc0004b6b; // _IOC(_IOC_READ|_IOC_WRITE, #[derive(Clone, Serialize, Deserialize, Debug)] pub struct UmountEntry { pub path: String, + pub check_mnt: bool, pub flags: i32, pub is_default: bool, } @@ -33,6 +34,7 @@ pub struct UmountManager { struct UmountManagerCmd { pub operation: u32, pub path: [u8; 256], + pub check_mnt: u8, pub flags: i32, pub count: u32, pub entries_ptr: u64, @@ -43,6 +45,7 @@ impl Default for UmountManagerCmd { UmountManagerCmd { operation: 0, path: [0; 256], + check_mnt: 0, flags: 0, count: 0, entries_ptr: 0, @@ -109,7 +112,7 @@ impl UmountManager { Ok(()) } - pub fn add_entry(&mut self, path: &str, flags: i32) -> Result<()> { + pub fn add_entry(&mut self, path: &str, check_mnt: bool, flags: i32) -> Result<()> { let exists = self .defaults .iter() @@ -123,6 +126,7 @@ impl UmountManager { let entry = UmountEntry { path: path.to_string(), + check_mnt, flags, is_default, }; @@ -161,36 +165,43 @@ impl UmountManager { vec![ UmountEntry { path: "/odm".to_string(), + check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/system".to_string(), + check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/vendor".to_string(), + check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/product".to_string(), + check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/system_ext".to_string(), + check_mnt: true, flags: 0, is_default: true, }, UmountEntry { path: "/data/adb/modules".to_string(), + check_mnt: false, flags: -1, // MNT_DETACH is_default: true, }, UmountEntry { path: "/debug_ramdisk".to_string(), + check_mnt: false, flags: -1, // MNT_DETACH is_default: true, }, @@ -215,6 +226,7 @@ impl UmountManager { fn kernel_add_entry(entry: &UmountEntry) -> Result<()> { let mut cmd = UmountManagerCmd { operation: 0, + check_mnt: entry.check_mnt as u8, flags: entry.flags, ..Default::default() }; @@ -243,9 +255,9 @@ pub fn init_umount_manager() -> Result { Ok(manager) } -pub fn add_umount_path(path: &str, flags: i32) -> Result<()> { +pub fn add_umount_path(path: &str, check_mnt: bool, flags: i32) -> Result<()> { let mut manager = init_umount_manager()?; - manager.add_entry(path, flags)?; + manager.add_entry(path, check_mnt, flags)?; manager.save_config()?; println!("✓ Added umount path: {}", path); Ok(()) @@ -268,13 +280,17 @@ pub fn list_umount_paths() -> Result<()> { return Ok(()); } - println!("{:<30} {:<8} {:<10}", "Path", "Flags", "Default"); + println!( + "{:<30} {:<12} {:<8} {:<10}", + "Path", "CheckMnt", "Flags", "Default" + ); println!("{}", "=".repeat(60)); for entry in entries { println!( - "{:<30} {:<8} {:<10}", + "{:<30} {:<12} {:<8} {:<10}", entry.path, + entry.check_mnt, entry.flags, if entry.is_default { "Yes" } else { "No" } );