![014e445cfbeded00dcc441faa906472b.png](https://i-blog.csdnimg.cn/blog_migrate/8298830837b84c01184f660e3a02a961.jpeg)
APK 分析器是 Android Studio 自带的一个 APK 分析工具,你可以使用它分析 APK 的组成详情。APK 分析器在我们开发当中最常见的使用场景是定位 APK 组成情况从而减小 APK 的大小。除此之外,还可以使用它减少调试应用的 DEX 文件和资源相关问题所用的时间。下面,结合我的使用实践介绍一下 APK 分析器的功能和使用方法。
一行配置导致 APK 变大 7 倍
前不久,我开发新项目蓝牙音乐的过程中,编译 APK 完成后突然发现只有一个界面的蓝牙音乐 APK 包竟然有9M。吓得我直接打开 build/output/apks/ ,双击 APK ,打开APK 分析器界面如下。
![b4699b3c906b5a4df773b03b3dcefd35.png](https://i-blog.csdnimg.cn/blog_migrate/21ee8373a7d6800c51545068764002c3.jpeg)
我发现异常文件 classes2.dex 和 classes3.dex,可以看到dex文件下全都是 Android SDK 的内容,WTF?为什么这些内容会被打包进 APK?莫非我 build.gradle 配置有问题?于是我又仔细检查了一下 build.gradle 内容,果然发现了罪魁祸首。
![508881f4bc1b5c07ca5a9731f7af55b1.png](https://i-blog.csdnimg.cn/blog_migrate/3bd42576d7aca81f864f5ce80d7527f9.jpeg)
我在已经将 framework.jar 加入仅编译的情况下,没有删除开头的这一句配置,导致 framework.jar 包被打包进APK。
我熟练地删除这一行,然后迅速进行了 sync、Clean Project、Build APK 这一连环操作。稍等一会,会看到Android Studio 贴心的提醒。
![53c7c190a6a17739daf60f16da06cc98.png](https://i-blog.csdnimg.cn/blog_migrate/0ab0fc00d89b5852732f8c4637c2a9fb.png)
点击 analyze,我看到了 APK 终于回到了正常大小:1.3M。
![e60db38711843faf4b23b03b4696bf54.png](https://i-blog.csdnimg.cn/blog_migrate/c78b3401ee5bb3d0eea7755e86ca11d3.jpeg)
介绍一下 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。
![edd77b376fec911e176f87faa6abde35.png](https://i-blog.csdnimg.cn/blog_migrate/b1086df59a8d50926ca7e91fe1d5a2e0.jpeg)
查看 DEX 文件
DEX 文件查看器中提供了类、软件包、总引用和声明计数,这有助于决定是否使用 MultiDex 或如何移除依赖项以避免超出 64K DEX 限制。所谓 64K DEX 限制大致介绍一下,就是单个 DEX 文件可被引用的方法总数被限制为 65536,如果超过这个数,就会无法编译。
![e60db38711843faf4b23b03b4696bf54.png](https://i-blog.csdnimg.cn/blog_migrate/c78b3401ee5bb3d0eea7755e86ca11d3.jpeg)
Defined Methods 和 Referenced Methods 列中列出了 DEX 文件中每个软件包、类和方法的相关计数。Referenced Methods 列会统计 DEX 文件引用的所有方法。这通常包括代码和依赖项库中定义的方法,以及在代码使用的标准 Java 和 Android 软件包中定义的方法 - 这些方法计入每个 DEX 文件中的 64k 方法限制。Defined Methods 列仅统计在某一个 DEX 文件中定义的方法,所以此数字是 Referenced Methods 的子集。请注意,如果将某个依赖项打包在 APK 中,这两个方法计数都会加上在该依赖项中定义的方法。
比较两个 APK
这个功能可以让你比较直观的看到某个 APK 变大或者变小了,从而方便进行进一步的优化。选择上图中右上角的 Compare With previous APK
![4d468b98fbe3a14cea7ab8e93158eff3.png](https://i-blog.csdnimg.cn/blog_migrate/f612f40ebb73a1e4f66335cf4c58766f.png)
可以看到,我这次实践中 apk 的减小完全来自 dex 的缩小。
总结
APK 分析器可以帮助你完成以下操作:
- 查看 APK 中的文件(如 DEX 和 Android 资源文件)的绝对大小和相对大小。
- 了解 DEX 文件的组成。
- 查看 APK 中的文件(如
AndroidManifest.xml
文件)。 - 对两个 APK 进行并排比较。
参考资料 https://developer.android.com/studio/build/apk-analyzer https://medium.com/androiddevelopers/making-the-most-of-the-apk-analyzer-c066cb871ea2#.k0s1s1kgl