二十四、Apk包体积优化

概述

APK(Android Package)包体积优化对于Android应用开发非常重要。

  1. 用户体验方面:较小的APK包体积可以使应用程序更快地下载和安装,以及更快地在设备上运行。这可以提高用户体验并减少用户的等待时间。
  2. 存储空间方面:许多用户设备的存储空间有限,特别是在低端设备上。通过优化APK包的体积,可以节省用户设备上的存储空间,使他们能够安装更多的应用程序。
  3. 带宽消耗方面:较小的APK包体积可以减少应用程序的下载所需的带宽。尤其是在网络条件不佳的地区或无限流量计划限制的用户,APK包体积优化可以显著减少应用程序的下载消耗。
  4. 更新和维护方面:较小的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代码再去使用这些图片,对于这种情况,它是无法解决的

使用方法演示

文档

官方文档

jar包下载地址

点击蓝色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
    • 后者的定制化功能更强大一些,并且可以集成到自动化系统中
  • 安装包体积优化

    • 主要思路是 删减未使用的资源和代码,并且对 资源文件进行相应的体积压缩
    • 当然,启用代码资源的混淆也可以节约一定的空间,
相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐4 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄5 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、5 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser7 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la7 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui7 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui