Android Skills R8 Analyzer实战:自动揪出冗余keep rules,让APK体积瘦身50%
【免费下载链接】skills项目地址: https://gitcode.com/gh_mirrors/skills27/skills
Android Skills 中的R8 Analyzer(performance/r8-analyzer/SKILL.md)是一款面向 AI Agent 的技能包,它能自动分析你的proguard-rules.pro,揪出冗余 keep rules、过宽的全包规则和全局禁用优化规则,帮你安全地给 APK 瘦身——官方场景就是让 R8 真正发挥混淆、裁剪与优化能力,体积优化幅度最高可达 50%。
为什么 keep rules 是 APK 体积的"隐形杀手"
R8 是 Android 构建工具链中负责**代码混淆(Obfuscation)、裁剪(Shrinking)和优化(Optimization)**的核心引擎。它默认会删除未使用的类、字段、方法,并合并重命名符号以压缩 DEX 体积。
但现实中,很多开发者为了"保险",在配置里堆了大量 keep 规则:
-dontshrink/-dontobfuscate/-dontoptimize:直接全局关闭 R8 的核心优化,APK 瞬间"回生";-keep class com.example.package.** { *; }:把整个包下所有类和成员全部钉死,R8 对此包无能为力;- 为 Activity、Fragment、ViewModel 单独写 keep:AAPT2 和 R8早已自动处理清单与布局中声明的组件,这些规则纯属多余;
- 为 AndroidX、Kotlin、Gson 等库手写 keep:这些库的 AAR/JAR 里自带 consumer keep rules,手写规则往往比官方版本更宽,反而有害。
这些问题规则累积起来,会让 R8 的"可优化代码比例"(Optimization score)持续走低。你以为是包越来越大,其实是被自己写死的规则拖住了。
R8 Analyzer 是如何工作的:3条分析路径
该技能的核心价值在于:它不靠猜,而是按你的工具链版本选择最精确的分析路径,全部定义在 SKILL.md 中。
路径一:配置检查与版本识别(所有路径的第一步)
Agent 会先扫描build.gradle、build.gradle.kts、gradle.properties与libs.versions.toml,对照 references/CONFIGURATION.md 检查:
- release 构建类型是否启用了
minifyEnabled与shrinkResources; - 是否使用了官方推荐的
proguard-android-optimize.txt; gradle.properties中是否残留android.enableR8.fullMode=false(这会关闭 R8 Full Mode,损失大量优化);- AGP 版本低于 9.0 时,建议升级以获得构建性能优化。
路径二:定量分析(推荐,数据说话)
| 条件 | 路径 | 说明 |
|---|---|---|
| AGP ≥ 9.3.0 | Path A | 运行独立 Gradle 任务analyzeReleaseR8Config,产出 protobuf 报告,再转换为 JSON 定量分析 |
| AGP < 9.3.0 且 R8 ≥ 9.3.7-dev | Path B | 执行 references/CONFIGURATION-ANALYZER.md 中的命令,通过构建参数 dump R8 配置分析数据 |
| 以上均不满足 | Path C | 启发式人工评估 + 规则库比对 |
定量路径的优势在于:每条 keep 规则都有实测数据支撑——它保住了多少类/字段/方法、占代码库百分比,Agent 会把这些指标直接写入tmp/keepradius/analysis_result.txt,而不是凭经验猜测。
路径三:启发式评估(老项目兜底)
工具链较老时,Agent 会逐条审阅proguard-rules.pro,比对 references/REDUNDANT-RULES.md 中的"坏规则清单",并结合 references/KEEP-RULES-IMPACT-HIERARCHY.md 的规则影响层级做优先级排序。
规则影响层级:一眼看懂哪条规则最"伤"
KEEP-RULES-IMPACT-HIERARCHY 文档把 keep 规则按"钉死范围"从宽到窄分为 9 级,最典型的几类重灾区:
- 全包通配(第 1 级,最严重):
-keep class com.example.package.** { *; }让包内所有类连成员都无法优化,必须细化到具体类; - 取反运算符(第 2 级):
-keep class !com.example.MyClass{*;}会保住整个 App 除了这一个类的所有代码,属于典型误用; - 类 + 通配成员(第 3 级):
-keep class com.example.MyClass { *; }钉死整个类及其全部成员; - 仅类名保留(第 7 级):
-keep class com.example.MyClass只保类名,R8 仍可清理未使用方法,友好得多。
结论很直接:规则越靠上,"杀伤面积"越大,瘦身收益也越高。
常见冗余规则清单:照着自查
references/REDUNDANT-RULES.md 沉淀了标准 Android 开发与主流库的高频"坏规则",包括:
- 全局禁用规则:
-dontshrink、-dontobfuscate、-dontoptimize,必须删除; - Android 组件规则:为 Activity、Service、View、Fragment 回调写的 keep,AAPT2 自动处理,删;
- 官方库规则:
androidx.**、kotlinx.**、kotlin.**的全包 keep,依赖库自带 consumer rules,删; - Gson 重灾区:整包保留 POJO、全局保留
TypeAdapter实现、处理TypeToken泛型擦除的规则——都会阻止 R8 删除死代码与未用成员,建议移除或细化。
对于真正需要反射的场景,references/REFLECTION-GUIDE.md 给出了 7 类场景的精准规则写法:Class.forName按类名加载、::class.java传递类引用、注解驱动反射、软依赖探测、私有成员访问、手写 Parcelable、枚举混淆等,每种都附"查找特征 + 建议规则",用最小的 keep 面解决最大的兼容问题。
分析报告长什么样:4 个分数 + 逐条行动项
无论走哪条路径,最终都会按 references/REPORT_FORMAT.md 输出一份结构化的 Markdown 报告,包含:
- 优化总结(Optimization Summary):优化分数、裁剪分数、混淆分数三个百分比,直接告诉你"多大比例代码被 keep 规则保护、R8 动不了";
- Keep rules 评估:逐条列出规则保住了多少项(类/字段/方法数量与占比)、典型受影响类名,并给出明确行动——Remove(删除冗余)或Refine(细化为精准规则);
- 被包含的冗余规则(Subsumed Rules):被更宽规则覆盖的"僵尸规则",直接删除;
- 历史对比:若存在上一份报告,会汇总分数变化,例如"裁剪分数从 61% 提升到 84%",让瘦身进度可追踪。
另外技能内置了一条重要约束:只研究与建议,绝不直接改动你的文件——所有删除/细化操作都由你人工确认后执行,安全可控。
实操上手:从安装到拿到报告
一键安装 r8-analyzer 技能
仓库根目录 README.md 说明了统一安装方式,使用 Android CLI 安装到当前项目:
android skills add --skill=r8-analyzer --project=.安装后,Agent 会自动激活该技能。你只需在对话中提出需求,例如"帮我分析 APK 体积,优化 R8 配置",Agent 就会自动走完整流程。
三步拿到瘦身报告
- 配置体检:Agent 扫描构建脚本,确认 Full Mode 已开启、资源压缩已启用(依据 CONFIGURATION.md);
- 数据生成:按版本执行对应路径——新版本跑
./gradlew :app:analyzeReleaseR8Config,再转换为 JSON 与定量结果(CONFIGURATION-ANALYZER.md); - 报告输出:严格按 REPORT_FORMAT.md 输出原始 Markdown 报告,无废话填充,方便你直接存档或提交给团队评审。
验证改动:用基准测试兜底
技能建议:对任何规则改动,用Macrobenchmark + UI Automator(参考 references/android/training/testing/other-components/ui-automator.md)做启动性能与 UI 验证,确保"删规则"没有破坏反射、序列化等运行时行为。
收益预期:哪些场景瘦身最明显
结合技能文档中的规则影响分析,收益最大的场景包括:
- 📦历史包袱重的老项目:
proguard-rules.pro里堆了几年"保险"规则,清理后裁剪分数往往大幅提升; - 📦重度使用 Gson/第三方库:删除整包 POJO keep 后,未使用的数据模型与 getter/setter 全部可被 R8 剥离;
- 📦误用全局禁用规则:仅删除一行
-dontobfuscate就可能让 DEX 体积下降数个百分点; - 📦包级通配泛滥:把
package.**细化到具体类,是层级文档中公认"必须避免、收益最高"的一类修改。
当然,实际比例取决于项目自身,建议以报告中"优化/裁剪/混淆三个分数"的前后对比为准。
写在最后
R8 Analyzer 的思路很清晰:先用工具链版本选准分析路径,再用定量数据或规则库逐条评估,最后给出可执行、可验证的瘦身清单。它不替你改一行代码,但会让每一条"删还是不删"的决策都有数据背书。
如果你想深入了解,可继续查阅技能目录下的完整资料:
- 技能主流程:performance/r8-analyzer/SKILL.md
- 定量分析命令:performance/r8-analyzer/references/CONFIGURATION-ANALYZER.md
- 坏规则清单:performance/r8-analyzer/references/REDUNDANT-RULES.md
- 规则影响层级:performance/r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md
- 反射场景规则指南:performance/r8-analyzer/references/REFLECTION-GUIDE.md
- 报告格式规范:performance/r8-analyzer/references/REPORT_FORMAT.md
跑完一次分析,把报告里的 Remove/Refine 清单逐条落实,你的 APK 大概率会迎来一次实打实的"瘦身"。
【免费下载链接】skills项目地址: https://gitcode.com/gh_mirrors/skills27/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考