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

    • 主要思路是 删减未使用的资源和代码,并且对 资源文件进行相应的体积压缩
    • 当然,启用代码资源的混淆也可以节约一定的空间,
相关推荐
SynthWriter5 分钟前
Trae 帮我生成了一个贪吃蛇的游戏,好玩儿
前端
用户214118326360218 分钟前
dify案例分享-Dify+RSS 聚合 8 大平台实时热点,新闻获取效率飙升 300%
前端
百锦再20 分钟前
Razor编程中@Html的方法使用大全
前端·html
啪叽23 分钟前
JavaScript可选链操作符(?.)的实用指南
前端·javascript
Ian在掘金24 分钟前
bat+python实现easy connect自动连接
前端·python
代码搬运媛26 分钟前
【react实战】如何实现监听窗口大小变化
前端·javascript·react.js
小桥风满袖28 分钟前
Three.js-硬要自学系列30之专项学习环境光
前端·css·three.js
Luckyfif31 分钟前
🤯由 性能指标 散发开来的 Performance API 被问爆了呀
前端·面试·性能优化
咸虾米34 分钟前
在uniCloud云对象内使用unipay的微信退款出现错误“uniPayCo.refund Error: token校验未通过”的解决方案
前端·后端
前端Hardy41 分钟前
HTML&CSS:产品卡片动画效果
前端·javascript