Skip to content

Releases: firesahc/AppRetentSel

Release list

v6.1.0

Choose a tag to compare

@firesahc firesahc released this 06 Sep 13:27

✨ 新功能

  • 配置界面 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 分钟浸泡:强制 deviceidle idle,待一个 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 键兼容,无需清数据。

v6.0.0

Choose a tag to compare

@firesahc firesahc released this 22 Aug 08:46

新增 (Added)

保活兼容层(定向模式核心)

  • 保活决策引擎:新增 RetentionCompat(纯 JVM 决策引擎)、RetentionConfig(libxposed 远程首选项桥接与变更监听)、RetentionHooks(面向各 ROM hook 文件的条件挂载入口),以及 RetentionMode / RetentionPrefsKeys / RetentionProcess 值类型。
    • 失效安全规则:空列表时关闭过滤(R1);无法解析的目标进程绝不保护(R2);首选项读取失败时保持最后已知状态(R3);批量过滤遇空集合直接放行(K2);uid 缓存随每次状态更新失效。
  • 全 ROM 杀后台钩子白名单管控:
    • HyperV2 killPackage/killProcess:TARGETED 模式下仅拦截受保护进程,未列入白名单的应用恢复原生清理逻辑。
    • Android S/T/U/V killProcessesWhenImperceptible:从参数数组中剔除受保护 uid 后放行原方法。
    • MIUI V14 / HyperOS V1:镜像 HyperOS V2 的 RunningProcess 形态管控;cleanUpMemory 与 killProcessByMinAdj 在全局开关下保持全局策略。
    • One UI:将所有携带 ProcessRecord 的决策点条件化(activeLaunchKillCheck、killTimeOverEmptyProcess 等),并为 IsForceKillHeavyProcess 新增直接包名匹配。
  • adj 保护(框架侧):ApplyAdjOpt 将白名单内后台进程的 adj 钳制至 BACKUP_APP_ADJ(250),未列出的进程维持 600–799 行为。
  • lmkd deepening level 参数:新增 KEY_ADJ_PROTECT_LEVEL 首选项,合法取值 {250, 300},其他值归一化为 300;替代原先硬编码的 BACKUP_APP_ADJ 常量。
  • LMK_TARGET 白名单感知下限:applyTargetBucketFloor 仅在包负载上将 adj==250 桶的 minfree 减半,不修改输入数组、不回写 ProcessList 字段,避免与上游 /3 折扣逻辑纠缠。

配置 UI 与子开关

  • 配置界面:新增 RetentionConfigActivity 启动器入口(含定向模式总开关与多选已安装应用列表,排除自身、主线程外加载,纯 android.widget 实现,无第三方依赖);配套 RetentionServiceBridge 经 XposedServiceHelper 提供模块侧写入通道,服务未绑定时拒绝写入以避免变更被静默丢弃。提供中英双语字符串资源。
  • adj.protect 子开关:可独立关闭 adj 钳制(默认在 TARGETED 模式下开启),保留白名单以便随时重新启用。
  • filter.kill 子开关:临时关闭时可回退全局拦截行为,同时保留白名单。

诊断与验收工具

  • 审计日志开关:retention.debug.audit 首选项控制逐决策审计日志行(保护命中、uid/名单过滤跳过、adj 钳制事件)走文件日志通道;默认关闭,关闭时热路径零开销。
  • 设备验收脚本:scripts/capture_oom_snapshot.sh 抓取带标签的 dumpsys activity oom 快照及存活检查,用于 LEGACY-vs-TARGETED 对比回归矩阵。
  • 入口点诊断日志:HCEntrance 新增 handleSystemServerStarting / handlePackageLoaded / handlePackageReady 日志,使设备验收期间的分发可见性可审计。

变更 (Changed)

  • 模块入口迁移至 libxposed API:
    • HookTool :tool 纳入构建图并适配 AGP 8.5 构建脚本;新增 META-INF/xposed 入口元数据(java_init.list / module.prop / scope.list),移除旧的 assets/xposed_init。
    • 通过同包 shim 转发到新的 CoreTool/AbsHook API,桥接被移除的旧符号(HCBase/HCEntrance/HCInit/HCData/IHook/ContextTool/InvokeTool 等)。
    • existsXxx 探测与静态工具类链式构建改为 CoreCompat 路由;compileSdk 提升至 36。
  • LSPosed system_server 作用域对齐:scope.list 添加 'system' 条目(LSPosed 据此识别 system_server,缺失则框架不分发);module.prop 设置 staticScope=true 自动应用声明作用域,并启用 autoHotReload=true 支持热重载。
  • 应用与构建产物更名:显示名改为 AppRetentSel,rootProject.name 改为 AppRetentSelHook,APK 输出文件名前缀同步更改。包名 com.hchen.appretention 与 applicationId 保持不变,LSPosed 模块身份不受影响。
  • 日志器迁移:内嵌旧版 com.hchen.hooktool.log.XposedLog 迁移为单一类定义 com.hchen.appretention.log.RetentionLog,完整承载原方法面(android.util.Log 输出 + SaveLog 文件日志集成)。

修复 (Fixed)

  • 保活配置从未生效:此前 RetentionConfig.init() 从未被调用,白名单与模式标志停留在首选项文件中,TARGETED 模式形同虚设;现于 HookInit.onLoadPackage 顶部、任何钩子注册之前调用(幂等,读取失败时保持 LEGACY 默认状态)。
  • release 构建 R8 冲突:消除 app 内嵌副本与 HookTool 库中全限定名重复的 XposedLog 类导致的 R8 处理冲突(debug 构建因混淆仅在 release 运行而未暴露)。
  • Android 11+ 包可见性:清单中声明 LAUNCHER intent 的 <queries>,使配置 UI 能枚举第三方应用;移除导致 LSPosed 模块类型探测器将 APK 误判为旧版的 xposedminversion / xposedsharedprefs 元数据。
  • 版本控制遗漏:修复 app/.gitignore 中模板自带的 /src/test 忽略规则,使单元测试源码(RetentionCompatTest)纳入追踪。

构建 / 杂项 (Build & Chore)

  • .gitignore 清理冗余 .idea 细粒度忽略规则,新增 /.omo/ 排除及 Eclipse Buildship 元数据(.project / .classpath / .settings/ / /bin/ 等)排除。
  • 锁定 io.github.libxposed:service 至 101.0.0(102 版本强制消费方 compileSdk>=37,与本项目工具链锁定 36 冲突;所需 API 面自 101 起未变)。
  • 将保活包名纳入 release minify keep 规则,作为诊断安全网。

质量 (Quality)

  • JUnit 单元测试基础设施:18 个单元测试全部通过,覆盖失效安全规则、子开关独立性、level 归一化与目标桶下限等契约。
  • assembleDebug 与 minifyReleaseWithR8 构建验证通过。