Skip to content

Releases: cinitdev/AppOpt

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。