Android Skills R8 Analyzer实战:自动揪出冗余keep rules,让APK体积瘦身50%
2026/9/24 13:45:56 网站建设 项目流程

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.gradlebuild.gradle.ktsgradle.propertieslibs.versions.toml,对照 references/CONFIGURATION.md 检查:

  • release 构建类型是否启用了minifyEnabledshrinkResources
  • 是否使用了官方推荐的proguard-android-optimize.txt
  • gradle.properties中是否残留android.enableR8.fullMode=false(这会关闭 R8 Full Mode,损失大量优化);
  • AGP 版本低于 9.0 时,建议升级以获得构建性能优化。

路径二:定量分析(推荐,数据说话)

条件路径说明
AGP ≥ 9.3.0Path A运行独立 Gradle 任务analyzeReleaseR8Config,产出 protobuf 报告,再转换为 JSON 定量分析
AGP < 9.3.0 且 R8 ≥ 9.3.7-devPath 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. 全包通配(第 1 级,最严重):-keep class com.example.package.** { *; }让包内所有类连成员都无法优化,必须细化到具体类;
  2. 取反运算符(第 2 级):-keep class !com.example.MyClass{*;}会保住整个 App 除了这一个类的所有代码,属于典型误用;
  3. 类 + 通配成员(第 3 级):-keep class com.example.MyClass { *; }钉死整个类及其全部成员;
  4. 仅类名保留(第 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 就会自动走完整流程。

三步拿到瘦身报告

  1. 配置体检:Agent 扫描构建脚本,确认 Full Mode 已开启、资源压缩已启用(依据 CONFIGURATION.md);
  2. 数据生成:按版本执行对应路径——新版本跑./gradlew :app:analyzeReleaseR8Config,再转换为 JSON 与定量结果(CONFIGURATION-ANALYZER.md);
  3. 报告输出:严格按 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询