Skip to content

Instantly share code, notes, and snippets.

@tw-Frey
Created December 1, 2020 05:09
Show Gist options
  • Select an option

  • Save tw-Frey/8ee7cc4976eae6705a9838b4a645a195 to your computer and use it in GitHub Desktop.

Select an option

Save tw-Frey/8ee7cc4976eae6705a9838b4a645a195 to your computer and use it in GitHub Desktop.
Proguard/R8 and its outputs

通常 Android App 要上架
release 會作 Proguard/R8
可是在 Google Play console 看當機報告
看到的會是混淆結果
其實可以上傳 mappings
方便在 Google Play console 追蹤

既然提到 mappings
多少要了解 Proguard 有哪些產出

  • mapping.txt
  • seeds.txt
  • usage.txt
  • dump.txt (Proguard/舊)
  • configuration.txt (R8/新)
@tw-Frey
Copy link
Copy Markdown
Author

tw-Frey commented Dec 1, 2020

先說總結:最重要的 mapping.txt
不過如果是 打包/上傳 .aab (Android App Bundle)
按照官方說法 Android App Bundle 简介

BUNDLE-METADATA:此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含 ProGuard 映射和应用的 DEX 文件的完整列表。此目录中的文件未打包到您应用的 APK 中。

  • 2021 年 8 月 新上架的 App 只能上傳 .aab 格式
  • 2021 年 11 月 更新的 App 也只能上傳 .aab 格式

還是趁早習慣 .aab
(不過開發期間/公司內部測試還是以 apk 為主)

要安裝 .aab 沒辦法很直接
參考
测试 Android App Bundle
在本地测试模块的安装

@tw-Frey
Copy link
Copy Markdown
Author

tw-Frey commented Dec 1, 2020

(译)理解混淆的输出

2018-07-27

本文对混淆输出的文件及作用进行了介绍。

參考
于卫国 / 理解混淆的输出
Jeb / Reading ProGuard’s Outputs

  • seeds.txt
    混淆的第一件事情就是读取配置的所有文件,然后读取所有的java字节码(.class文件)创建class池。混淆然后查看class池并且将匹配所有keep规则的每个类和成员的列表输出到seeds.txt。这对于调试你写的keep规则是否匹配到了尝试keep的类很有帮助。如果一个类被匹配,会有一行全类名。对于一个成员是全类名后是成员签名。
  • usage.txt
    知道了哪些代码是keep的,混淆将继续在class池查看不需要keep的代码。这是代码压缩阶段,混淆会从应用中移除未使用的代码。正如它所做的这个,它会输出未使用的代码——将会被移除的代码到usage.txt。这对我来说有点不解;我认为它应该叫ununed.txt 或 shrinkage.txt 或者其它什么的。
    这对于理解为什么一个类在运行时不存在很有帮助。你可以检查它是否被移除到了这里,或在下一步中被重命名了。
    如果整个类被移除,会有一行全类名。如果只有类中某些成员被移除,会在下一行输出被移除的成员。
  • mapping.txt
    混淆下一步需要做的是混淆尽可能多的代码,它会重命名类和成员为无意义的名称如“a”,“b”等等。混淆会输出每个类和成员的原名和新名到 mapping.txt。并不是所有的代码被重命名,但所有的代码会被列在mapping.txt。
    如果你在尝试反混淆那你需要这个文件。它可以让你从被混淆的名字映射到原始代码的名字。
    每行的格式是“{原名字} -> {新名字}”。在类名称下面的是类的每个成员。注意构造方法显示为“()”。
  • dump.txt
    然后混淆就完成了它所有的工作(压缩代码和混淆),它输出了最后一个很重要的文件——所有代码被处理后的完整列表。就是所有的class文件,格式并不是最优的,所以它是个巨大的文件。我有一个测试混淆的示例应用,最终应用大小约1MB,但dump.txt接近18MB。
    如果你想看看类文件是什么但不想反编译.class或.dex文件,这将会很有帮助。

@tw-Frey
Copy link
Copy Markdown
Author

tw-Frey commented Dec 1, 2020

缩减、混淆处理和优化应用

Android 开发者 > Android Studio > 用户指南

https://developer.android.com/studio/build/shrink-code?hl=zh-cn

官方文件一定要看(目前最新的是 R8)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment