From 58538f64306707e1913f48bedef8c5c2b856d715 Mon Sep 17 00:00:00 2001 From: BlockXe Date: Thu, 16 Jul 2026 17:41:59 +0800 Subject: [PATCH 1/3] Fix unable to delete startup parameters & Add Simplified Chinese (zh-rCN) translation --- app/build.gradle.kts | 2 +- .../sysctlgui/ui/user/UserParamsViewModel.kt | 6 +- .../main/res/values-zh-rCN/params_info.xml | 58 +++++++++ app/src/main/res/values-zh-rCN/strings.xml | 119 ++++++++++++++++++ app/src/main/res/xml/locales_config.xml | 1 + .../androidvip/sysctlgui/data/db/ParamDao.kt | 3 + .../data/repository/UserRepositoryImpl.kt | 2 +- data/src/main/res/values-zh-rCN/strings.xml | 43 +++++++ .../domain/usecase/RemoveUserParamUseCase.kt | 4 +- 9 files changed, 233 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/values-zh-rCN/params_info.xml create mode 100644 app/src/main/res/values-zh-rCN/strings.xml create mode 100644 data/src/main/res/values-zh-rCN/strings.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 22bc46c..b1dd04c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,7 +21,7 @@ android { versionName = "3.1.0" vectorDrawables.useSupportLibrary = true androidResources { - localeFilters += listOf("en", "de", "pt-rBR", "tr") + localeFilters += listOf("en", "de", "pt-rBR", "tr", "zh-rCN") } javaCompileOptions { annotationProcessorOptions { diff --git a/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt b/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt index 90ed643..87f7758 100644 --- a/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt +++ b/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt @@ -1,5 +1,6 @@ package com.androidvip.sysctlgui.ui.user +import android.util.Log import androidx.lifecycle.viewModelScope import com.androidvip.sysctlgui.domain.usecase.GetUserParamsUseCase import com.androidvip.sysctlgui.domain.usecase.RemoveUserParamUseCase @@ -47,11 +48,14 @@ class UserParamsViewModel( private fun removeParam(param: UiKernelParam) { viewModelScope.launch { runCatching { - removeParam.invoke(param) + var count = removeParam.invoke(param) + require(count>0) }.onSuccess { setState { copy(userParams = userParams - param) } setEffect { UserParamsViewEffect.ShowUndoSnackBar(param) } mostRecentlyRemovedParam = param + }.onFailure { + } } } diff --git a/app/src/main/res/values-zh-rCN/params_info.xml b/app/src/main/res/values-zh-rCN/params_info.xml new file mode 100644 index 0000000..400d30d --- /dev/null +++ b/app/src/main/res/values-zh-rCN/params_info.xml @@ -0,0 +1,58 @@ + + + + 系统中为拥有 cap_sys_admin 权限的用户保留的空闲内存量(KB)。 + 当设置为非零值时,启用块 I/O 调试。 + 仅在启用 CONFIG_COMPACTION 时可用。向该文件写入 1 时,系统将对所有内存域(Zone)进行规整(Compaction),以便尽可能将空闲内存合并为连续的内存块。 + 仅在启用 CONFIG_COMPACTION 时可用。设置为 1 时,允许内存在规整时检查不可回收的 LRU 链表(如被 mlock 锁定的页面)以寻找可规整的页面。设置为 0 则阻止规整功能移动不可回收的页面。默认值为 1。 + 触发内核后台刷新线程(flusher threads)开始回写(Writeback)的脏内存量(字节)。 + 触发内核后台刷新线程开始回写脏数据的页面数量占总可用内存(含空闲页面和可回收页面)的百分比。 + 产生磁盘写入的进程自身开始回写脏数据时的脏内存量。注意:dirty_bytes 与 dirty_ratio 互为对应参数,一次只能指定其中一个。 + 定义脏数据在内存中驻留多长时间后,才允许被内核刷新线程写入磁盘(单位:百分之一秒)。当刷新线程下次唤醒时,在内存中变脏时间超过该间隔的数据将被写回磁盘。 + 产生磁盘写入的进程自身开始写回脏数据时,脏页数量占总可用内存(含空闲页面和可回收页面)的百分比。 + 定义脏 Inode(索引节点)在内存中驻留多长时间后,才允许被内核刷新线程回写。当一个 lazytime Inode 的页面不断变脏时,更新了时间戳的 Inode 将永远没有机会被写回。 + 内核刷新线程会定期唤醒并将“旧”数据写回磁盘。此参数表示这些唤醒之间的时间间隔(单位:百分之一秒)。设置为 0 将完全禁用定期回写。 + 向此文件写入 1、2 或 3 将促使内核释放干净的缓存(Clean Caches)以及可回收的 slab 对象(如 dentries 和 inodes)。释放后,其占用的内存将变为可用空闲内存。 + 此参数影响内核在满足高阶(High-order)分配请求时,是进行内存规整还是直接进行内存回收。数值越接近 0,意味着分配更可能因内存不足而失败;数值越接近 1000,意味着分配失败主要是由内存碎片引起的;而 -1 则意味着只要满足水位线(Watermarks),分配就会成功。\n\n默认值:500。 + 控制是否将高端内存(High Memory)计入脏数据写作者的限流(Throttling)考量中。 + 控制“笔记本模式(Laptop Mode)”的开关。笔记本模式用于尽可能减少磁盘启动旋转的次数,以节省电池电量。 + 如果非零,此 sysctl 将禁用新的 32 位 mmap 布局 —— 内核将对所有进程使用传统的(Linux 2.4)布局。 + 一个进程可以拥有的最大内存映射区域(VMA)数量。虽然大多数应用程序需要的映射少于 1000 个,但某些程序(特别是 malloc 调试器)可能会消耗大量映射(例如每次分配需要一到两个映射)。默认值为 65536。 + 用于强制 Linux 虚拟内存(VM)保留的最小空闲内存量(KB)。设置得过高会使系统立即发生 OOM(内存溢出崩溃)。 + 此文件指示限制用户进程进行 mmap 映射的最低地址空间大小。 + 在支持调整地址空间布局随机化(ASLR)的架构上,此值用于选择在使用 mmap 分配 VMA 区域时,用于确定基地址随机偏移量的位数。该值会受到系统架构支持的最小值和最大值的限制。 + 在支持调整地址空间布局随机化(ASLR)的架构上,此值用于选择在兼容模式下运行的应用程序使用 mmap 分配 VMA 区域时,用于确定基地址随机偏移量的位数。该值会受到系统架构支持的最小值和最大值的限制。 + 启用后,当内核执行 OOM 强杀(OOM-killing)时,会输出系统范围的任务信息转储(不包括内核线程)。如果设置为 0,则不显示这些信息。如果设置为非零值,只要 OOM Killer 杀死了占用大量内存的任务,就会显示这些信息。 + 启用或禁用在内存不足(OOM)时直接杀死触发 OOM 的任务。如果设置为非零值,OOM Killer 会直接杀死触发内存不足条件的那个任务,从而避免耗时的任务列表(tasklist)扫描。 + 当 overcommit_memory 设置为 2 时,已提交的虚拟地址空间不允许超过交换空间(Swap)加上此处的物理内存量(KB)。注意:overcommit_kbytes 与 overcommit_ratio 互为对应参数,一次只能指定其中一个。 + 此值包含启用内存超发(Overcommit)的标志。\n\n当此标志为 0 时,当用户空间请求更多内存时,内核会尝试估算剩余的空闲内存量。\n\n当此标志为 1 时,内核会假定始终有足够的内存,直到内存实际耗尽。\n\n当此标志为 2 时,内核采用“绝不超发”策略,尝试阻止任何内存超发行为。 + 当 overcommit_memory 设置为 2 时,已提交的虚拟地址空间不允许超过交换空间(Swap)加上此百分比的物理内存。 + 控制单次尝试中从交换空间(Swap)中连续读取的最大页面数量。这是交换空间对应的页缓存预读(Readahead)机制。它是一个对数数值 —— 设置为 0 意味着 “1 页”,设置为 1 意味着 “2 页”,设置为 2 意味着 “4 页”,依此类推。\n设置为 0 将完全禁用交换预读。 + 启用或禁用在发生内存不足(OOM)时触发系统崩溃(Kernel Panic)的功能。 + 为每个 CPU 的页面列表分配的、每个内存域(Zone)中最大页面比例的分数。此值的最小值是 8。 + 更新虚拟内存统计信息(VM Statistics)的时间间隔。默认值为 1 秒。 + 用于定义内核使用交换分区(Swap)的积极程度。值越高,使用 Swap 的倾向越强;值越低,Swap 的使用越少。默认值:60。 + + + 唯一标识当前系统启动的 ID。 + 当前可用的熵(比特数)。 + 熵池(Entropy Pool)可容纳的最大比特数限制。 + 允许从随机设备接口(如 /dev/random)读取数据前,必须达到的最小可用熵(比特数)。 + 触发写入熵池的 entropy_avail 阈值。当可用熵低于此值时,会唤醒阻塞的设备向熵池中写入熵。 + + + 套接字(Socket)读取的低延迟繁忙轮询(Busy Poll)超时时间。(需要启用 CONFIG_NET_RX_BUSY_POLL)即在设备队列上忙循环等待数据包的近似时间(微秒)。此项设置 SO_BUSY_POLL 套接字选项的默认值。默认值:0(关闭)。 + poll 和 select 的低延迟繁忙轮询(Busy Poll)超时时间。(需要启用 CONFIG_NET_RX_BUSY_POLL)即忙循环等待事件的近似时间(微秒)。推荐值取决于你轮询的套接字数量:对于几个套接字建议设为 50,数百个则设为 100。默认值:0(关闭)。 + 网络设备默认使用的队列规则(Queuing Discipline)。这允许使用其他规则来替代默认的 pfifo_fast。默认值:pfifo_fast。 + 内核在一次 NAPI 中断中可以处理的最大数据包数量,这是一个 Per-CPU(单 CPU 独立)变量。 + message_burst 与 message_cost 用于限制网络代码向内核日志中写入警告信息的频率。它们通过强制实施速率限制来防止遭受拒绝服务(DOS)攻击。message_cost 系数越高,写入的日志信息就越少。message_burst 控制何时丢弃这些信息。默认设置限制警告信息每 5 秒最多输出一次。 + message_burst 与 message_cost 用于限制网络代码向内核日志中写入警告信息的频率。它们通过强制实施速率限制来防止遭受拒绝服务(DOS)攻击。message_cost 系数越高,写入的日志信息就越少。message_burst 控制何时丢弃这些信息。默认设置限制警告信息每 5 秒最多输出一次。 + [已废弃] 此参数曾用于控制由于网络问题(如 IP 地址冲突或错误的校验和)而在控制台打印的来自网络协议栈的警告消息。 + 在单次轮询循环(NAPI poll)中,能从所有接口中获取的最大数据包数量。 + 每个套接字(Socket)允许的最大辅助缓冲区大小。辅助数据是由 cmsghdr 结构体和附加数据组成的序列。 + 套接字(Socket)接收缓冲区的默认大小(单位:字节)。 + 套接字接收缓冲区的最大大小(单位:字节)。 + 套接字发送缓冲区的默认大小(单位:字节)。 + 套接字发送缓冲区的最大大小(单位:字节)。 + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..6022553 --- /dev/null +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,119 @@ + + 检查 root 权限 + 检查 busybox + 错误 + 设置 + 关于 + 退出 + 内核参数 + 浏览变量 + 浏览 /proc/sys 下的内核参数 + 编辑参数 + 完成 + 无法获取 root 权限。你必须拥有 root 权限才能编辑内核参数。 + 没有关于此参数的文档 + 搜索 + 正在应用内核参数设定 + 正在应用你的内核参数设定 + 将在 %d 秒后应用你的内核参数设定… + 自启动通知 + 正在应用你的内核参数设定 + 导入参数设定失败 + 无法导入参数设定:空文件 + 无法导入参数设定:文件中包含格式错误。 + 编辑 + 移除 + 没有已收藏的参数 + Tasker 列表 + 主列表 + 次级列表 + 主 Tasker 列表 + 次级 Tasker 列表 + 收藏列表 + 启动时应用的列表 + SysctlGUI:Tasker 配置文件 #%d 已应用 + 选择一个任务列表 + 选择一个与 Tasker 配合使用的列表 + 一旦由 Tasker 触发,该插件将立即重新应用所选列表中所有参数及其各自的数值。 + 任务设置 + 撤销 + 正在启动 Sysctl GUI + 启动时自动运行 Sysctl GUI + 需要 root 权限 + 以获得 root 权限 + 文件类型错误 + 由于 IO 错误,参数设定导出失败 + 没有可以导出的参数设定 + 导出参数设定 + 导入、导出或备份内核参数设定 + 浏览 + 导出 + 重试 + 应用 + 恢复 + 参数 + + 收藏 + 预设 + 文件创建失败或已取消 + 文件选取失败或已取消 + 打开文件时出现错误 + 处理文件时出现错误 + 已移除参数设定:%s + 返回 + 查阅有关 \"%1$s\" 的文档 + 目录:%1$s + 参数:%1$s + 参数图标 + 导航到目录 + 添加到收藏 + 切换 %1$s + 收藏 + 切换任务参数 + 参数值设置成功 + 复制到剪贴板 + 长按以复制 + 任务列表: %1$s + 要设定的新参数值 + 更多 + 文档 + 参数值 + 应用预设 + 找到 %1$d 个参数 + 导入 + 加载预设… + 成功 + 预设已成功导入 + 从文件导入预设 + 导出预设到文件 + 搜索内核参数 + 没有建议参数 + 没有找到有关 \"%1$s\" 的结果 + 输入内容以搜索内核参数 + 搜索图标 + 清空搜索 + 最近搜索 + 历史条目 + 清除搜索历史 + 导出完成 + 导入参数设定失败 + 当前不允许设置参数为空值 + 当前提交模式下不接受该值 + 命令执行失败 + 建议 + 已收藏内核参数 + 历史记录已清除 + 启动时的参数设定 + Sysctl 用于在运行时修改内核参数。 可用的参数在 /proc/sys 下已列出,这个应用提供一个图形界面以方便编辑它们。 + 许可条款 + 我们需要你同意以下内容以继续。 一经同意,此应用可用做到和不可做到的内容如下:\n\t + ❌ 执行和 sysctl 工具无关的命令\n\t + ❌ 在没有用户发起操作或许可的情况下执行命令\n\t + ❌ 留下永久的内核参数修改\n\t + ✅ 对选定的参数执行 sysctl 命令\n\t + ✅ 撤销所有修改 + + 我同意以上条款 + 继续 + 由于内核的特性,运行时完成的更改可以通过简单的设备重启来恢复。你可以在应用设置中找到恢复选项。 + diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index 8914394..661724c 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -4,4 +4,5 @@ + diff --git a/data/src/main/java/com/androidvip/sysctlgui/data/db/ParamDao.kt b/data/src/main/java/com/androidvip/sysctlgui/data/db/ParamDao.kt index 968166c..ecf7ee8 100644 --- a/data/src/main/java/com/androidvip/sysctlgui/data/db/ParamDao.kt +++ b/data/src/main/java/com/androidvip/sysctlgui/data/db/ParamDao.kt @@ -28,6 +28,9 @@ interface ParamDao { @Delete suspend fun delete(param: KernelParamDTO): Int + @Query("DELETE FROM $PARAMS_TABLE_NAME where name=:name and path=:path") + suspend fun deleteSingle(name:String,path:String): Int + @Query("DELETE FROM $PARAMS_TABLE_NAME") suspend fun clearTable() } diff --git a/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt b/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt index a75d123..eef17a1 100644 --- a/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt +++ b/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt @@ -53,7 +53,7 @@ class UserRepositoryImpl( } override suspend fun removeUserParam(param: KernelParam) = withContext(coroutineContext) { - paramDao.delete(KernelParamDTO.fromKernelParam(param)) + paramDao.deleteSingle(KernelParamDTO.fromKernelParam(param).name,KernelParamDTO.fromKernelParam(param).path) } override suspend fun clearUserParams() = withContext(coroutineContext) { diff --git a/data/src/main/res/values-zh-rCN/strings.xml b/data/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..937ef65 --- /dev/null +++ b/data/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,43 @@ + + + 常规 + 文件夹优先 + 使用内核参数浏览器时,优先列出文件夹 + 推断输入类型 + 尝试根据内核参数的值,为软键盘设置最匹配的输入类型 + 使用在线文档 + 在显示参数描述时,尝试使用在线文档 + 主题 + 强制暗色模式 + 在可用时强制启用暗色主题 + 动态色彩 + 在可用时使用动态色彩(Material You) + 对比度级别 + 主题颜色的对比度级别 + 操作 + 提交模式 (%s) + 应用参数值时使用的命令 + 使用 Busybox + 如果可用,使用 Busybox 来执行相关命令 + 允许空值 + 开机自启 + 开机自动应用 + 允许应用程序在系统启动时自动应用内核参数 + 自启延迟 + 系统启动后,延迟指定时间(秒)再应用参数 + 管理参数 + 管理将在系统启动时自动应用的参数 + 显示 Tasker 气泡提示 + 当应用 Tasker 参数时显示气泡提示(Toast) + 搜索历史 + 点击清空搜索历史记录 + 其他 + 源代码 + 在 GitHub 上查看本项目源码! + 贡献者 + 翻译贡献 + 协助我们翻译此应用程序 + 恢复修改 + 撤销该应用作出的所有修改 + 受限于 Linux 内核的固有特性,运行时所作的修改只需通过简单地重启设备即可完全恢复。应用将不再尝试在下次系统启动后重新应用这些参数。 + \ No newline at end of file diff --git a/domain/src/main/java/com/androidvip/sysctlgui/domain/usecase/RemoveUserParamUseCase.kt b/domain/src/main/java/com/androidvip/sysctlgui/domain/usecase/RemoveUserParamUseCase.kt index f592deb..d536765 100644 --- a/domain/src/main/java/com/androidvip/sysctlgui/domain/usecase/RemoveUserParamUseCase.kt +++ b/domain/src/main/java/com/androidvip/sysctlgui/domain/usecase/RemoveUserParamUseCase.kt @@ -4,7 +4,7 @@ import com.androidvip.sysctlgui.domain.models.KernelParam import com.androidvip.sysctlgui.domain.repository.UserRepository class RemoveUserParamUseCase(private val repository: UserRepository) { - suspend operator fun invoke(param: KernelParam) { - repository.removeUserParam(param) + suspend operator fun invoke(param: KernelParam): Int { + return repository.removeUserParam(param) } } From 1c73ebd9471fe2b8ed397efc73feda58668c3657 Mon Sep 17 00:00:00 2001 From: BlockXe Date: Thu, 16 Jul 2026 20:03:12 +0800 Subject: [PATCH 2/3] update UserRepositoryImplTest --- .../sysctlgui/data/repository/UserRepositoryImplTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/src/test/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImplTest.kt b/data/src/test/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImplTest.kt index 4290dcc..65e1011 100644 --- a/data/src/test/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImplTest.kt +++ b/data/src/test/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImplTest.kt @@ -46,6 +46,6 @@ class UserRepositoryImplTest { // Then val expectedDto = KernelParamDTO.fromKernelParam(paramToRemove) - coVerify { paramDao.delete(expectedDto) } + coVerify { paramDao.deleteSingle(expectedDto.name,expectedDto.path) } } } From 446e85e96e620309cce5d0307893091a48d71bce Mon Sep 17 00:00:00 2001 From: BlockXe Date: Thu, 16 Jul 2026 20:12:35 +0800 Subject: [PATCH 3/3] Resolve other issues --- .../com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt | 2 +- .../androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt b/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt index 87f7758..3c0abe4 100644 --- a/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt +++ b/app/src/main/kotlin/com/androidvip/sysctlgui/ui/user/UserParamsViewModel.kt @@ -48,7 +48,7 @@ class UserParamsViewModel( private fun removeParam(param: UiKernelParam) { viewModelScope.launch { runCatching { - var count = removeParam.invoke(param) + val count = removeParam.invoke(param) require(count>0) }.onSuccess { setState { copy(userParams = userParams - param) } diff --git a/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt b/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt index eef17a1..2c99ded 100644 --- a/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt +++ b/data/src/main/java/com/androidvip/sysctlgui/data/repository/UserRepositoryImpl.kt @@ -53,7 +53,8 @@ class UserRepositoryImpl( } override suspend fun removeUserParam(param: KernelParam) = withContext(coroutineContext) { - paramDao.deleteSingle(KernelParamDTO.fromKernelParam(param).name,KernelParamDTO.fromKernelParam(param).path) + val dto = KernelParamDTO.fromKernelParam(param) + paramDao.deleteSingle(dto.name, dto.path) } override suspend fun clearUserParams() = withContext(coroutineContext) {