Repository navigation
✨ 新功能
- 配置界面 Material3 重构 + 应用搜索(617f0f4):
引入material/appcompat/recyclerview,Material3 DayNight 主题 + Monet 动态取色(Android 12+ 跟随壁纸),Edge-to-Edge 全面屏;Toolbar + 模式卡片(MaterialSwitch + 服务状态行)+ 列表卡片(搜索框 + 已选计数 + RecyclerView)+ 底部全宽保存按钮;支持应用名/包名双字段实时过滤、空结果占位、加载态;列表项带启动器图标 + DiffUtil 增量刷新,修复原 ListView 索引错位;新增AppRetentionApplication启用动态取色,中英字符串补齐。数据通道零改动,prefs键名不变,与 system_server 端兼容。 - 保活运行态诊断完善(8c33e73):新增配置快照、ROM 分支选择、Hook 安装结果、杀进程决策日志,可区分配置未生效 / Hook 缺失 / 运行时命中;检查脚本合并即时 + 持久日志,按测试窗口过滤
am_kill,区分用户 SwipeUpClean 与自动内存回收。 - RetentionAudit 持久化链路打通(9ba126b):保活全链路统一落盘
/data/system/AppRetention/RetentionAudit.log;SaveLog新增重定向组(HCEntrance/HCInit/RetentionConfig/Heartbeat/ApplyAdjOpt/OomLevels/LmkdParameter 同一时间线);HookInit在配置装载前注册文件条目并启动RetentionHeartbeat(30s 心跳,每 10 拍落盘);广播失败经restoreCache回填重试,消除启动期数据丢失。同时精简冗余日志约一半:saveLogContent不再逐条回显 Debug 状态,广播成功路径静默,HCEntrance仅留[dispatch-ok/fail],RetentionConfig仅留[config-snapshot]。
💥 架构重构(含不兼容变更)
- 能力探测式 Hook 架构(5310f02):删整套按系统版本分发的旧入口,改为按目标进程逐项探测、精确匹配、独立安装的能力注册表(
CapabilityRegistry/Probes/Installer/Ledger);迁移 AOSP/小米/三星/PowerKeeper/辅助能力,统一身份解析、策略决策、安装账本、诊断状态;删除旧版本入口、注解处理器、废弃 Gradle 链路;新增能力注册与进程策略测试。 - 收敛严格单应用保活(a6bbcdc):删除
LEGACY/全局场景/全局策略语义,默认状态、空名单、未知原因、未解析目标统一放行;仅保留带进程/UID 上下文的 AOSP/小米/Samsung 能力;新增目标上下文解析器,修复 shared UID 与 PID 包名校验;移除 OOM/LMKD、全局厂商清理、旧兼容字段;adj 保护仅作用于命中名单的后台进程。同步更新配置界面、诊断运行时、JVM 契约测试。 - 删除废弃链路(30e8e01):移除
CoreCompat、ProcessTasks、collect模块(HookEntrance/HookProcessor)、LogPuppet、各版本旧 Hook(HyperV1/V2、MiuiV14、AndroidS/T/U/V 等)、CacheCompaction、OomLevelsOpt、LmkdParameter、旧data/path/method/field常量表;运行时仅经新能力注册表安装。
🐛 稳定性修复
- adj 钳制前台门控重建(7c67c8d):此前对名单进程不分前后台钳制,前台被误判 BACKUP 致闪退;改为仅
curProcState > 6(后台区间)钳制;ADJ_CLAMP无条件写审计 tag,作为钳制发生的唯一直接判据。 - 消除 OomAdjuster ABBA 死锁(a6d897b):真机整机假死(
FW_SCOUT_BINDER_FULL):applyOomAdjLSP→before→logI→saveLogContent等 SaveLog 类锁,与持 SaveLog 锁卡在sendOrderedBroadcast等 AMS 锁形成互锁。原则 AMS 锁内零日志零广播:热路径ADJ_CLAMP改为recordClamp无锁内存聚合(ConcurrentHashMap/Queue),心跳每拍drainDiagnostics批量输出(5 分钟聚合:次数/最终档位/时间),新增 21 个单测。 - 心跳巡检兜底配置通知断链(5475145):UI 保存后 remotePreferences 写入成功但 hook 进程 listener 收不到回调。新增
RetentionConfig.reloadIfChanged()幂等比对,心跳每拍经单线程执行器异步巡检,最迟 30s 生效,不再依赖跨进程通知、无需重启。 - PID 兼容(f592a63):AOSP 12 起
ProcessRecord.pid更名mPid,硬编码读取恒为 -1 致死亡审计失真。新增pidOf()按mPid→pid→getPid()三顺位回落,新增回落契约用例,fail-open 语义不变。 - 堆阈值哨兵降噪(f26a668):MIUI 全量堆扫描以
pid=-1哨兵调单进程接口,误计HOOK_HIT unresolved;heapThreshold.before()首行识别哨兵记HEAP_SWEEP_SKIP后早退,真 pid 行为不变。 - 死亡审计回补(43aebf9):
audit=false时KILL_DECISION全丢、PID_LOST仅 logcat。recordKillDecision对 BLOCK/UNRESOLVED 常驻入队,recordProcessDeath经findLastPidForPackage回补并双通道上报,心跳mustPersist覆盖新前缀;ALLOW 仍仅审计态保留,热路径无锁不变。 - 配置重试收敛 + Context 早置精简(0254f33):
RetentionConfig.init()每次新建线程池且不关闭,多进程注入泄漏线程,改为命名守护单例复用;HookInit删除 AMS 反射兜底早置,仅留 ActivityThread 路径,二次注入由AOSP_CONTEXT_CAPTURE承担。 - 日志归档改启动路径(f5cd125 + b162a07):原依赖
ACTION_SHUTDOWN广播经常收不到,且新会话resetFile清空遗留文件致历史蒸发;改为systemReady注册 receiver 前归档(此时无写入竞态,不依赖关机时序);后又移除关机路径归档,消除双重归档踩踏(关机拷一次致开机时old/被清空反丢数据),统一收敛到启动单一路径。
🛠️ 诊断 / 脚本 / 构建
- 检查脚本对齐新架构(f554790 / f0bd75b):改用能力探测/安装/命中/决策事件判稳,支持显式观察窗口,事件缺失或进程异常即失败;单应用验收改读
enabled=true配置快照,删除依赖已移除 OOM/LMKD 全局能力的旧脚本。 - 验收新增 fast-5m 快测(3c1e6c5):
--fast-5m将过夜验证压缩为 5 分钟冒烟 + 30 分钟浸泡:强制deviceidleidle,待一个EXCESSIVE_POWER周期后走标准检查,追加FAST_ADJ/FAST_BLOCK/FAST_PID/FAST_HEAP四断言与细分退出码;默认 30m 不变。 - UI 文案修正(0558a92):修复同名应用列表构建被覆盖,改进选择数量与复数资源,删未用资源,中英布局与偏好键保持兼容。
- 构建: 全模块 Java/Kotlin 目标降至 17 以匹配工具链;新增
scripts/check_retention.sh一键状态摘要;版本号升至 6.1.0(a799cbc)。
升级注意:全局保活语义已移除,旧全局策略/OOM-LMKD 配置不再生效,需按严格单应用名单重新确认;
prefs键兼容,无需清数据。