包体积优化基础
包体积优化基础
APK 瘦身背景
包体积或直接或间接地影响着下载转化率、安装时间、运行内存、磁盘空间等重要指标,所以投入精力扫除积弊、发掘更深层次的体积优化项是十分必要的。
1、下载转化率
现在很多大型的 App 一般都会有一个 Lite 版本的 App,这个也是出于下载转化率方面的考虑。 在 2018 年的 Google I/O,Google 透露了 Google Play 上安装包体积与下载转化率的关系图:
2、应用市场
Google Play 应用市场强制要求超过 100MB 的应用只能使用 APK 扩展文件方式 上传。 aab
格式(Android App Bundles)
3、渠道合作要求
越大的 App 其单价成本也会越高。如百度浏览器国际版包体积严格控制在 5M 内,5M 是红线,超过 5M 发版要总监审批
4、包过大对 App 性能影响
- 安装时间过长。文件拷贝、Library 解压、编译 ODEX、签名校验,特别对于 Android 5.0 和 6.0 系统来说(Android 7.0 之后有了混合编译),微信 13 个 Dex 光是编译 ODEX 的时间可能就要 5 分钟。
- 运行时内存占用过大。Resource 资源、Library 以及 Dex 类加载这些都会占用不少的内存。
- ROM 空间占用过大。100MB 的安装包,启动解压之后很有可能就超过 200MB 了。对低端机用户来说,也会有很大的压力。在 “I/O 优化 “ 中我们讨论过,如果闪存空间不足,非常容易出现写入放大的情况。
APK 瘦身目标
- DuBrowser,明确了包体积要在 5M 以内,超过 5M 红线发版本需总监审批
- si,AAB 包不要超过 30M
指标
- APK 大小
- AAB 大小
一般统计 release 包的大小,Google Play 下载时的 AAB 大小。
APK 分析
APK 分析工具
Android Studio 自带的 Analyze APK
来做的包体积分析,主要就是做了代码、资源、So 等三个方面的重点优化。
AS Analyze APK
将 APK 拖到 Android Studio 中查看 APK 中的内容了
脚本
统计的脚本
包体积优化思路
APK 的组成
事实上安装包中无非就是 Dex
、Resource(resources.arsc/res/AndroidManifest.xml)
、Assets
、Library
以及 签名信息(META-INF/)
这五部分。
classes.dex: APK 中可能包含一个或多个 classes.dex 文件,应用程序内的 Java/Kotlin 源码最终会以 dalvik 字节码的方式存在于 classes.dex 文件中。
resources.arsc 该文件是包含配置信息的资源查询表,起着链接代码与资源的作用。Dex 文件中的 R.class 仅包含资源 id,AssetManager 会利用 id 到 arsc 表中查询与当前设备信息最匹配的资源文件路径(或资源内容)。
res/ 包含源码工程中 res 目录下除了 values 外的资源文件(drawable、layout、color、raw),这些文件路径同时会体现在
resources.arsc
中。lib/ native libraries。即源码工程 jni 目录下的 so 文件,二级目录必须为 NDK 支持的 ABI。
assets/ 与 res/ 资源目录不同,assets/ 下的资源文件不会在 resources.arsc 中生成查询条目,且 assets/ 下的资源目录可完全自定义,业务代码获取 assets 资源和 res 资源的方式也完全不同。 如:一些资源,礼物动画 mp 4 资源、svga 资源等
META-INF/ 应用签名信息。该目录在应用签名后生成,包含以下三个文件:
MANIFEST.MF:摘要文件,包含 APK 内所有文件的路径及其 SHA1/SHA256 值。
CERT.SF:对摘要的签名文件,包含 APK 内所有文件的路径,及其在 MANIFEST.MF 中对应信息的 SHA1/SHA256 值。
CERT.RSA:保存公钥、加密算法及其私钥加密后的内容。AndroidManifest.xml 应用清单文件,用于描述应用基本信息,主要包括应用包名、应用 id、应用组件、所需权限、设备兼容性等。
根据 Apk 的组成可知,占用 Apk 比较大的主要是 资源(res)
、代码(classesX.dex)
和 so(lib)
这三方面优化
ZIP 结构分析
1、压缩源文件信息 (File Entris)
- Local file header:描述源文件信息。
- File data:源文件数据。
- Data descriptor:校验码及压缩前后大小。
2、中心目录区 (Central directory)
记录 ZIP 目录结构。每一条 file header 对应一个源文件,描述文件相关信息。
3、中心目录结束标识 (EOCD)
End of central directory record
标识 ZIP 包结束,包含 ZIP 包及中心目录的简要信息。
APK 分析工作
apk 压缩包按照资源文件类型分类,主要有:so 资源(程序运行依赖的库,如接入 UC 浏览器内核 SDK 时,引入的 so 达到惊人的 12 M)、图片资源(png、webp、jpg 等)、Java 代码(dex 文件)、xml 代码这几类,此外还可横向统计 flutter 相关资源情况。
由于可以拿到单个文件的信息,所以我们开发了工具解析 apk 包中的内容,从文件类型角度分析包资源占比情况,以及将资源文件按照大小排序展示,并以图表形式直观告诉开发资源情况
现有优化工具
官方指导
Android 混淆工具
见: [[Android混淆工具]]
包体积优化实施
Android 包体积优化手段有很多,比如业务裁剪、插件化、混合开发、资源后下发等
- [[包体积优化-Dex优化]]
- [[包体积优化-资源优化]]
- [[包体积优化-其他]]