Skip to content

v6.0.0

Choose a tag to compare

@firesahc firesahc released this 22 Aug 08:46
· 20 commits to new since this release

新增 (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 构建验证通过。