Skip to content

Releases: cinitdev/AppOpt

AppOpt v1.7.8

Choose a tag to compare

@cinitdev cinitdev released this 17 Jul 14:57

更新日志

重点

  • C、Rust 守护进程与 App 全面支持新版类 C 区块规则,可在同一应用区块中配置线程、子进程和主进程兜底核心。
  • 完整兼容旧版单行规则和原作者新增的区块写法,原有 applist.conf 无需手动转换即可继续使用。
  • App 设置新增“校准规则生成格式”,可在旧版单行格式与六种区块格式之间选择,C、Rust 校准完成后会按所选格式生成规则。

格式与转换

  • App 启动时会识别现有规则格式并同步当前选择;无法唯一判断的区块会保留已有设置,不擅自改写用户偏好。
  • 切换生成格式时会自动转换现有规则,支持旧版转新版、新版转旧版及不同区块格式之间互转。
  • App 编辑线程或子进程规则后会继续使用用户选择的格式保存,不会重新变回默认单行格式。
  • 六种区块格式均支持子进程规则,可选择将主进程兜底写在区块首行、区块尾部或区块外,并支持空格与紧凑写法。

优化

  • 格式选择弹窗使用完整选项卡点击和居中的选中图标,设置页会显示当前生成格式。
  • 默认规则独立到一次性 rules.sh,刷入模块生成或保留规则后会自动清理安装脚本,避免模块目录残留无用文件。
  • 规则转换保留应用分组、注释和规则语义,C、Rust 与 App 使用统一的区块展开结果。

构建与版本

  • App 与模块版本统一升级到 v1.7.8(178)。

AppOpt v1.7.7

Choose a tag to compare

@cinitdev cinitdev released this 15 Jul 02:01

更新日志

重点

  • 新增线程与子进程规则健康检查:目标应用每次完整进入前台后观察 30 秒,连续两次完整观察都未检测到目标时才标记规则可能无效,提前离开应用不会累计未命中次数,常驻子进程也不会单独触发或维持观察。
  • 已确认有效的规则后续不再重复观察;连续两次未命中的问题规则会被 C、Rust 守护进程共同忽略,避免无效规则继续参与扫描和绑核。
  • C、Rust 守护进程共用 rule_health.tsv 保存健康状态,单独修改 CPU 核心范围会保留原状态,修改线程名或子进程名则会清除旧状态并重新观察。
  • App 的已配置应用列表和规则查看弹窗新增健康状态提示,可区分首次未发现、等待下次复查和连续两次未发现的线程或子进程规则。

修复

  • 修复应用分身、工作资料及 Android 多用户场景下线程与子进程规则可能不生效的问题,守护进程会按 appId 缩小候选范围,并继续用完整进程命令行严格确认包名。
  • 修复 Rust 与 C 在线程名通配符匹配上的行为差异,Rust 版在 Android/Linux 上改用与 C 版一致的 fnmatch 规则。
  • 修复规则写入前校验不完整的问题,App 现在会校验 CPU 范围、包名、子进程名和线程名长度,避免守护进程静默丢弃无效规则。
  • 修复 PID/TID 复用或线程快速退出时可能作用到错误目标的问题,C、Rust 在写入 cpuset 和 affinity 前都会复核进程与线程身份。
  • 修复前台助手监听注册失败后无法恢复的问题,新增自动重试、轮询降级和同一 boot_id 下的前台状态恢复。

优化

  • 规则健康检查继续复用 PID/TID 缓存,只在配置变化、观察到期或受控兜底场景执行完整 /proc 扫描,避免跟随 2 秒主循环高频全量扫描。
  • 规则列表改为线程规则优先、子进程规则随后、主进程规则置底;线程规则按 CPU 核心范围由高到低排列,长名称与状态提示可在同一行滚动查看。
  • 校准历史详情改为分批渐进加载,首次只渲染少量线程记录,滚动接近底部时自动加载后续内容,降低数百条记录展开时的卡顿。
  • C、Rust 守护进程统一裁剪当前设备不存在的 CPU 核心,并补充无效规则、系统限制和目标身份变化的诊断信息。
  • App 会显示当前运行的是 Rust 版还是 C 版守护进程,相关页面统一使用“守护进程”名称,诊断包补充 rule_health.tsv
  • 前台助手写入状态时增加 boot_id、单调时钟和事件时间,减少系统时间变化、助手重启或监听延迟对前台生命周期判断的影响。

构建与版本

  • App 与模块版本统一升级到 v1.7.7(177)。

AppOpt v1.7.6

Choose a tag to compare

@cinitdev cinitdev released this 08 Jul 15:56

更新日志

重点

  • 新增 Rust 守护进程 AppOptRs,模块启动时默认优先运行 Rust 版,连续快速异常退出时本次开机会自动回退到 C 版守护进程。
  • Rust 守护进程读取 package_uid.map 后先按 UID 缩小候选进程,再维护 PID/TID 缓存,减少长期运行时对 /proc 的全量扫描压力。
  • 新增常驻 root app_process 前台助手,持续写入 foreground_task.state,并自动生成 package_uid.map,不再依赖 App 打开后才补齐 UID 映射。
  • C 守护源码按配置、核心循环、FPS、校准、控制 socket、SurfaceFlinger fallback 等功能拆分,保留 C fallback 能力,后续维护更清晰。

修复

  • 修复 Rust 版 FPS 命令读取后只清空、不删除 fps.cmd 的问题,现在与 C 版一样消费命令后直接删除。
  • 修复 PerfEvent 后端在部分设备上帧率偏低或跳动的问题,改为优先读取 eBPF frame_stats 计数 map 计算 FPS。
  • 修复 eBPF 未锁定目标 PID 时可能误统计其它应用帧的问题,现在只对具体目标 PID attach queueBuffer uprobe。
  • 修复 App 读取守护进程版本、ping 守护进程和下发命令时只固定调用 C 二进制的问题,现在会按 Rust 优先、C fallback 的规则选择当前守护进程。
  • 修复 32/64 位 ABI 下 eBPF queueBuffer 参数读取不完整的问题,模块会为 arm64-v8aarmeabi-v7ax86_64x86 分别构建对应 BPF 对象。
  • 修复刷入时只复制 C 守护二进制和默认 BPF 对象的问题,现在会按设备 ABI 同步 AppOptRs 与对应 eBPF 对象。

优化

  • Rust 守护进程对齐 C 版的规则解析、自动校准、FPS 监测、前台判断、控制 socket 和诊断输出主流程。
  • FPS 后端优先使用 eBPF RingBuf,RingBuf 不可用时降级 PerfEvent,eBPF 不可用或长期无目标帧时再走 SurfaceFlinger fallback。
  • PerfEvent 读取增加丢样本日志、事件排序和 Surface/TID 分流,降低短视频、QQ、游戏等场景帧率偏低或混帧概率。
  • 守护进程日志改为更清晰的中文摘要,减少无意义轮询刷屏,同时保留启动、后端、绑定、fallback 和错误原因。
  • 诊断包补充 AppOptRs 进程信息,方便判断当前到底运行的是 Rust 守护还是 C fallback。
  • 文档补充 Rust 守护、ActivityTaskManager helper、package_uid.map、eBPF RingBuf/PerfEvent 和 SurfaceFlinger fallback 的当前架构说明。

构建与版本

  • build_module.sh 编译前会同步 App、module.propDaemonBridge、C 守护进程和 Rust 守护进程版本。
  • 模块构建会同时编译 4 个 ABI 的 AppOptAppOptRs、Rust/aya bridge 和对应 ABI 的 eBPF 对象。
  • 刷入脚本会优先验证 AppOptRs,验证失败才删除 Rust 守护并回退 C 守护。
  • App、模块、DaemonBridge、C 守护进程和 Rust 守护进程版本统一升级到 v1.7.6(176)。

AppOpt v1.7.5

Choose a tag to compare

@cinitdev cinitdev released this 06 Jul 11:13

更新日志

修复

  • 完善配置并发、历史导入与更新流程稳定性。
  • App 与守护进程共享 applist.conf 锁,并改为临时文件原子替换,避免规则互相覆盖、生成半文件或误把读取失败当成空配置写回。
  • 修复历史详情异步加载中断、空记录状态不明确、读取失败后缺少重试入口的问题。
  • 历史日志导入改为完整校验后再入库,损坏会话、空会话、重复会话会保留原文件并输出排查日志。
  • 补充 C 端历史写入结果检查,创建、格式化、临时文件写入和原子替换失败时会输出明确警告。
  • 修复前台检测 helper 重连时旧监听残留、可见任务诊断不完整以及全无信号时悬浮球残留的问题。
  • 移除容易导致离开前台延迟关闭的 stune 前台组路径,保留 cpuset/cpuctl 前台组检测。

优化

  • 设置策略保存改为串行队列,并在页面离开、旋转或切到后台前提交最后一次待保存修改。
  • 模块下载支持生命周期取消、30 分钟超时、任务被系统移除检测、临时文件清理和失败模块转移到 Download 目录。
  • 刷入日志改为按缓冲区流式追加刷新,保留类似 Magisk/KernelSU/APatch 的连续输出效果。
  • 查看规则、删除配置和规则编辑流程增加读取中状态、重复点击保护、未保存修改确认和更清晰的错误提示。
  • 悬浮球触控区域扩展到 48dp,视觉尺寸保持不变,并补充标准点击语义与动态无障碍说明。
  • 运行环境加入 ActivityTaskManager helper 状态,诊断包同步导出 helper 日志、状态文件和进程信息。
  • 清理废弃代码资源,移除已被 Markwon 替代的旧 Markdown 轻量解析逻辑。

自动校准

  • 自动校准负载从“线程占应用总负载比例”改为按系统时钟节拍和实际采样间隔计算真实 CPU 使用率,降低轻负载线程被误判成高负载的概率。
  • 主进程继续按线程记录负载;子进程改为按整体负载记录并生成进程级规则,子进程线程摘要只用于历史记录展示。
  • 子进程整体负载达到策略阈值时生成 包名:子进程=核心范围 规则,避免生成不受 C 端解析支持的子进程线程规则。
  • 为线程样本、TID、子进程线程摘要和历史曲线增加数量上限,失效 TID 自动回收,减少长时间校准的内存增长。
  • 规则输出为主进程兜底规则预留空间,避免子进程规则过多时丢失主进程兜底。

前台检测与 FPS

  • 新增常驻 root app_process 前台监听 helper,优先读取 ActivityTaskManager 当前任务状态。
  • ActivityTaskManager 不可用、过期或报错时,自动降级到 UsageStats、cgroup 前台组和 dumpsys 焦点组合判断。
  • 组合兜底改为投票逻辑,两个来源确认目标离开时关闭悬浮球;只有单一来源可用时跟随该来源。
  • 悬浮球前台检测增加会话代号,旧应用的异步检测结果和延迟关闭任务不会再误关新启动的悬浮球。
  • FPS 启停命令改为串行执行,切换目标应用时清理旧 FPS、旧结果浮层和旧前台检测状态。

构建与版本

  • build_module.sh 编译前自动读取 app/build.gradle.ktsversionName/versionCode,同步 DaemonBridge、C 守护进程和 magisk_module/module.prop 版本。
  • 模块构建自动编译并打包 package helper 与 ActivityTaskManager foreground helper。
  • App、模块、DaemonBridge 和 C 守护进程版本统一升级到 v1.7.5(175)。

AppOpt v1.7.4

Choose a tag to compare

@cinitdev cinitdev released this 02 Jul 03:09

悬浮球与前台检测

  • 调整目标应用启动流程,先启动悬浮球服务再拉起应用,避免部分系统因 UsageStats 事件延迟而不显示悬浮球。
  • 前台状态改为 UsageStats、原生 cgroup 前台组和 dumpsys 三级检测,任一检测源不可用时会自动降级。
  • 目标应用离开前台后连续确认两次再关闭悬浮球,减少通知栏、输入法和系统短暂切换造成的误判。
  • 增加前台检测来源、UsageStats 事件、cgroup 包列表、焦点应用和自动关闭原因等详细日志,便于定位悬浮球问题。

FPS 兼容与准确性

  • eBPF FPS 新增 PerfEvent 备用事件通道,RingBuf 创建或映射失败时自动切换,兼容 Android 17 上的 mmap failed
  • 修复 QQ 等多进程应用可能锁定后台子进程而获取不到 FPS 的问题,优先选择目标应用的前台 PID,并在持续没有有效帧率时自动重新确认。
  • 启动日志会显示实际使用的 RingBuf 或 PerfEvent 后端,并分别记录降级原因和真实运行错误。
  • FPS 显示值按设备当前刷新率进行上限校正,避免短视频、QQ、微信等应用出现超过屏幕刷新率的异常数值。
  • 优化目标应用长时间没有新帧时的日志语义,避免继续沿用旧 FPS。

诊断与界面

  • 设置页新增“一键导出诊断包”,可导出 App 日志、模块日志、版本、CPU 拓扑、cpuset、当前规则、Root 管理器和 FPS 后端状态。
  • 常用入口调整为两列布局,集中提供历史记录、C 进程日志、使用说明和诊断包导出。
  • App 回到前台时重新检测 Root 授权和守护进程状态,避免授权或撤销后状态显示过期。
  • 优化运行环境未授权状态和日志页文案显示。

更新与规则修复

  • 模块刷入失败、未检测到 Root 管理器或无法打开刷入页面时,将原始模块 zip 保存到 Download 并显示手动刷入路径。
  • 刷入成功时显示“重启系统”,刷入失败时显示“返回”,避免失败页面无法退出。
  • 修复非连续 CPU 集合被误当作空字符串处理的问题,保留正确的 CPU 范围回退逻辑。

AppOpt v1.7.3

Choose a tag to compare

@cinitdev cinitdev released this 29 Jun 08:29

eBPF FPS 兼容性

  • eBPF FPS 新增 PerfEvent 备用事件通道,RingBuf 创建或映射失败时会自动切换到 PerfEvent。
  • 兼容 Android 17 上 RingBuf mmap failed 导致 FPS 无法采集的问题。
  • 启动日志会输出当前实际使用后端,例如 RingBufPerfEvent,并单独提示 RingBuf 不可用原因。
  • 优化目标应用长时间没有新帧时的日志语义,避免继续沿用旧 FPS。
  • 新增 queuebuffer_probe_perf.bpf.c,构建时同时打包 RingBuf 和 PerfEvent 两套 eBPF 对象。

Aya Lite 子模块

  • fps_monitor/aya 从本地 vendored 目录改为 AppOpt-aya-lite 子模块。
  • build_module.sh 会自动初始化和更新 Aya Lite 子模块,减少首次构建漏拉依赖的问题。
  • 子模块本地拉取时排除 .githubscripts 目录,保留编译需要的 Aya 代码和文档。
  • 新增 GitHub Actions,用于定期检查 Aya Lite 更新、编译验证通过后自动提交子模块更新 PR。

构建和发布

  • build_module.sh 新增 PerfEvent BPF 对象构建流程。
  • App 包名改为从 app/build.gradle.ktsapplicationId 自动读取,不再在脚本中硬编码。
  • 更新 README 中的子模块拉取、BPF 构建和 release/publish 使用说明。
  • 更新 Cargo.lock 到 Aya 0.14.0 / aya-obj 0.3.0。

App 体验修复

  • App 回到前台时重新检测 Root 授权状态,避免授权或撤销后首页状态过期。
  • 调整运行环境卡片中未授权按钮的高度和内边距,减少未授权状态下的异常留白。

AppOpt v1.7.2

Choose a tag to compare

@cinitdev cinitdev released this 27 Jun 14:33

AppOpt v1.7.2

远程更新

  • 新增 App 内模块更新检查, 自动读取 /data/adb/modules/AppOpt/module.prop 中的 updateJson
  • 支持解析远程 versionversionCodezipUrlchangelog, 使用 versionCode 判断是否需要更新。
  • 设置页新增独立的“远程更新”板块, 显示本地版本和云端版本, 支持自动获取和手动检查。
  • App 启动后会静默检查远程更新, 发现新版本时弹出底部更新面板。
  • 检测到 /data/adb/modules_update/AppOpt/module.prop 中已有待生效新版本时, 提示“新版本已刷入,重启后生效”。

下载与刷入

  • 使用系统 DownloadManager 下载模块 zip, 更新弹窗内显示下载状态和进度。
  • 下载完成后依次提示准备刷入、检测模块管理器、检测到的 Root 管理器。
  • 支持自动检测并调用 Magisk、KernelSU、APatch 刷入模块。
  • 新增刷写日志页面, 以流式方式追加显示模块管理器输出的刷入日志。
  • 刷写过程中禁用返回, 成功后显示“重启系统”按钮; 失败时保留 zip 并提示手动刷入路径。
  • 刷写成功后自动清理原始模块 zip 和 App 内临时 zip; 刷写失败时删除 App 内临时 zip, 并把原始模块转移到系统 Download 目录供手动刷入。

App 内更新兼容

  • App 内刷入模块时写入专用更新标记, 避免刷写过程中覆盖安装 App 导致闪退。
  • 模块脚本识别 App 内更新标记后保留 config/app 内容, 重启后由 service.sh 自动安装/更新 App。
  • 自动清理 AppOpt_app_info.propAppOpt_app_install.prop 等临时文件。

更新日志渲染

  • 更新日志改用 Markwon 渲染 Markdown, 支持表格、任务列表、删除线、HTML、链接等常用语法。
  • changelog 拉取失败时不阻塞下载刷入, 仅提示“更新日志读取失败,可继续下载模块”。

其他优化

  • 优化自动校准规则写回逻辑, 同一应用/子进程规则按块替换并规整空行。
  • 优化 FPS 监测在目标 PID 变化和长时间无帧时的状态处理。
  • 优化悬浮球、前台检测、历史记录和设置页交互细节。
  • 构建脚本支持编译并打包 App 安装辅助工具, 用于模块重启后自动安装 App。