概述
APK(Android Package)包体积优化对于Android应用开发非常重要。
- 用户体验方面:较小的APK包体积可以使应用程序更快地下载和安装,以及更快地在设备上运行。这可以提高用户体验并减少用户的等待时间。
- 存储空间方面:许多用户设备的存储空间有限,特别是在低端设备上。通过优化APK包的体积,可以节省用户设备上的存储空间,使他们能够安装更多的应用程序。
- 带宽消耗方面:较小的APK包体积可以减少应用程序的下载所需的带宽。尤其是在网络条件不佳的地区或无限流量计划限制的用户,APK包体积优化可以显著减少应用程序的下载消耗。
- 更新和维护方面:较小的APK包体积可以加快应用程序的更新速度。当应用程序有更新时,较小的包体积意味着更少的数据需要下载,从而减少了更新所需的时间和流量。
管理好app的包体积,主要分为两个方面的工作:
- 包体积监控
- 包体积优化
包体积监控
当发布新版app时,通过合适的工具分析出 新包与旧包的体积差具体体现在什么地方,可以给我们的后续包体积优化提供依据。
AndroidStudio的Apk Analyser
它可以具体呈现出 apk中哪个部分占据的空间最大。使用方式也非常简单,就是在androidStudio中双击一个apk文件,会自动出现如下窗口:
上图中,apl analyser将一个apk文件中的各个部分的占用空间进行了从大到小的排序。
实际上,它的作用不止如此,我们甚至可以用它来分析一些优秀的apk,逆向推断出它所用的 目录结构,代码规范,甚至使用了哪些 动态库技术等。
Matrix 中的 Apk Checker
Matrix是腾讯的一款开源库,Apk Checker
则是 Matrix的其中一个组件。主要用来对Android 安装包进行分析检测,并输出较为详细的检测报告。
一般我们需要下载Matrix的源代码,然后单独编译 matrix-apk-cananry
部分。
但是也有速成的办法,在网上下载 ApkChecker.jar
文件,然后配置一个 json文件即可。
ApkChecker
的优势在于,这是一个jar包,它可以用命令行来执行,这意味着我们可以将 apk包的检测动作集成到 自动化系统中(比如 Gradle插件,批处理命令等),并将产出的分析报告发送到指定位置。这样,我们就能对当前版本的apk有一个大概的评估。
Apk Checker 的缺陷
它会自动分析出 apk中打包了,但是实际上没有使用到的资源,但是这种分析,仅针对Java代码中直接引用 的资源。 对于间接引用的,比如 java代码先读取一个json,json中放置了多个图片的路径,然后java代码再去使用这些图片,对于这种情况,它是无法解决的
使用方法演示
文档
点击蓝色matrix-apk-canary-2.1.0.jar
使用注意
注意,使用它时要配置一个config.json
文件,这个json中指定了一些关键参数,
包括
- 要分析的apk文件路径
- 混淆mapping.txt文件路径
- 资源映射文件路径
- 分析报告输出目录
等,还有一些其他的详细配置,参考 使用文档。
安装包体积优化
Lint查看未使用的资源
Lint是一个静态扫描工具,它可以识别出 没有被任何代码使用到的资源文件。
选择whole project
作为目标去扫描,就能得到类似如下的结果:
我们可以酌情删除这些未被使用的资源。
打包时不包含无用文件
-
shirnkResources
能够在打包编译阶段,删除掉所有没有被使用的资源,但是必须同时开启混淆minifyEnable 必须设置为true
-
使用
resConfig
限定国际化资源文件- 这种方式,可以在打包时,仅仅将指定语言的资源文件打到apk内,比如我们按照发布的国家去发包,那么可以通过多渠道配置,来指定每个渠道引用的 限定语言。
文件优化
静态图片优化
优先使用 drawable矢量图,如果不行的话,webp是最优选择。 如下图,androidStudio支持直接将 png或者 jpg等批量转化成 webp格式,缩小体积最大可以到90%
动态gif图片优化
webp也可以做动态图,只不过稳定的第三方库并不多。 谷歌推出了一套 C++依赖库,上层开发人员可以通过封装jni来解析 动态webp图片,并将每一帧封装成一个bitmap,并根据解析出来的时间差值显示对应帧的bitmap呈现动态效果。
如果不想封装JNI,可以直接使用 Github
上的Andorid-WebP
,并使用其中的 WebpImageView
控件并指定图片路径。
合理引用第三方库
在引入第三方依赖之前,需要权衡一下是否需要将依赖中的代码和资源一次性全部引入。
如果仅仅是为了一个小功能的实现,引入一个巨大的框架,就显得很冗余,理想的做法是,阅读第三方的源代码,然后抠出我们需要的部分通过自行编码的方式来实现想要的功能。
Apk Bundle
谷歌官方支持动态发布,ap为了更好的适配多语言,多屏幕,往往会在项目中添加多套 资源配置,但是一台设备局,往往只需要其中一套资源,如果安装一个巨大的包,包含了很多永远不会被用到的资源,就显得很浪费空间。谷歌的动态发布,通过 Google Play Store
也就是谷歌应用商店安装app时,会根据安装设备的属性,只选取所需的资源到apk中。
可惜。这种做法,对于国内,无法尝试。
总结
本文总结了 apk优化的理论知识以及实践经验,
-
安装包监控
- 谷歌官方的 androidStudio
apk analyser
- 腾讯的 matrix 中 的 apk checker
- 后者的定制化功能更强大一些,并且可以集成到自动化系统中
- 谷歌官方的 androidStudio
-
安装包体积优化
- 主要思路是 删减未使用的资源和代码,并且对 资源文件进行相应的体积压缩
- 当然,启用代码资源的混淆也可以节约一定的空间,