如何使用 APK 分析器分析你的 APK
APK 分析器是 Android Studio 自带的一个 APK 分析工具,你可以使用它分析 APK 的组成详情。APK 分析器在我们开发当中最常见的使用场景是定位 APK 组成情况从而减小 APK 的大小。除此之外,还可以使用它减少调试应用的 DEX 文件和资源相关问题所用的时间。下面结合我的使用实践介绍一下 APK 分析器的功能和使用方法。
一行配置导致 APK 变大 7 倍
前不久,我开发新项目蓝牙音乐的过程中,编译 APK 完成后突然发现只有一个界面的蓝牙音乐 APK 包竟然有9M。吓得我直接打开 build/output/apks/ ,双击 APK ,打开APK 分析器界面如下。
我发现异常文件 classes2.dex 和 classes3.dex,可以看到dex文件下全都是 Android SDK 的内容,WTF?为什么这些内容会被打包进 APK?莫非我 build.gradle 配置有问题?于是我又仔细检查了一下 build.gradle 内容,果然发现了罪魁祸首。
我在已经将 framework.jar 加入仅编译的情况下,没有删除开头的这一句配置,导致 framework.jar 包被打包进APK。
我熟练地删除这一行,然后迅速进行了 sync、Clean Project、Build APK 这一连环操作。稍等一会,会看到Android Studio 贴心的提醒。
点击 analyze,我看到了 APK 终于回到了正常大小:1.3M!
介绍一下 APK 的这几个部分:
classes.dex:Java 文件编译生成的可执行文件,用于在 Dalvik 虚拟机上运行。
res 文件夹:资源文件
resources.arsc:Android 编译后生成的产物,主要是用来建立资源映射关系
AndroidManifest.xml:资源清单文件
META-INF:简单说就是一个配置文件
查看文件和大小信息
在上面的图中,可以看到:APK 分析器会显示每个实体的原始文件大小和下载文件大小值,如图 1 所示。Raw File Size 表示实体在磁盘上未经压缩时的大小,而 Download Size 则表示实体由 Google Play 提供时的压缩后大小的估计值。% of Total Download Size 表示实体占 APK 总下载大小的百分比。我的 APK 并没有经过 Google Play 压缩,所以两个 SIZE 看起来差不多大。
打开 res/drawable 你能看到每个图片资源占据的大小,如果你发现有些图尺寸太大,则可以考虑对其进行优化:比如将 png 资源换成 SVG 矢量图或者 webp。
![如何使用 APK 分析器分析你的 APK 如何使用 APK 分析器分析你的 APK](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM4NS9lZDIwOGU5YTJiY2Y2OTQ2ZDc2YTRlNWQ1NzliYTQzOS5wbmc=)
查看 DEX 文件
DEX 文件查看器中提供了类、软件包、总引用和声明计数,这有助于决定是否使用 MultiDex 或如何移除依赖项以避免超出 64K DEX 限制。所谓 64K DEX 限制大致介绍一下,就是单个 DEX 文件可被引用的方法总数被限制为 65536,如果超过这个数,就会无法编译。
Defined Methods 和 Referenced Methods 列中列出了 DEX 文件中每个软件包、类和方法的相关计数。Referenced Methods 列会统计 DEX 文件引用的所有方法。这通常包括代码和依赖项库中定义的方法,以及在代码使用的标准 Java 和 Android 软件包中定义的方法 - 这些方法计入每个 DEX 文件中的 64k 方法限制。Defined Methods 列仅统计在某一个 DEX 文件中定义的方法,所以此数字是 Referenced Methods 的子集。请注意,如果将某个依赖项打包在 APK 中,这两个方法计数都会加上在该依赖项中定义的方法。
比较两个 APK
这个功能可以让你比较直观的看到某个 APK 变大或者变小了,从而方便进行进一步的优化。选择上图中右上角的 Compare With previous APK
可以看到,我这次实践中 apk 的减小完全来自 dex 的缩小。
总结
APK 分析器可以帮助你完成以下操作:
- 查看 APK 中的文件(如 DEX 和 Android 资源文件)的绝对大小和相对大小。
- 了解 DEX 文件的组成。
- 查看 APK 中的文件(如 AndroidManifest.xml 文件)。
- 对两个 APK 进行并排比较。
https://shimo.im/docs/TG8PDh9D96WGTT8W