Repository navigation
Releases: firesahc/AppRetentSel
Releases · firesahc/AppRetentSel
Release list
v6.1.0
✨ 新功能
- 配置界面 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键兼容,无需清数据。
v6.0.0
新增 (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 新增直接包名匹配。
- HyperV2
- 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。
- HookTool
- 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构建验证通过。