文章

包体积优化基础

包体积优化基础

包体积优化基础

APK 瘦身背景

包体积或直接或间接地影响着下载转化率、安装时间、运行内存、磁盘空间等重要指标,所以投入精力扫除积弊、发掘更深层次的体积优化项是十分必要的。

1、下载转化率
现在很多大型的 App 一般都会有一个 Lite 版本的 App,这个也是出于下载转化率方面的考虑。 在 2018 年的 Google I/O,Google 透露了 Google Play 上安装包体积与下载转化率的关系图: image.png

2、应用市场
Google Play 应用市场强制要求超过 100MB 的应用只能使用 APK 扩展文件方式 上传。 aab 格式(Android App Bundles
3、渠道合作要求
越大的 App 其单价成本也会越高。如百度浏览器国际版包体积严格控制在 5M 内,5M 是红线,超过 5M 发版要总监审批

4、包过大对 App 性能影响

  1. 安装时间过长。文件拷贝、Library 解压、编译 ODEX、签名校验,特别对于 Android 5.0 和 6.0 系统来说(Android 7.0 之后有了混合编译),微信 13 个 Dex 光是编译 ODEX 的时间可能就要 5 分钟。
  2. 运行时内存占用过大。Resource 资源、Library 以及 Dex 类加载这些都会占用不少的内存。
  3. ROM 空间占用过大。100MB 的安装包,启动解压之后很有可能就超过 200MB 了。对低端机用户来说,也会有很大的压力。在 “I/O 优化 “ 中我们讨论过,如果闪存空间不足,非常容易出现写入放大的情况。

APK 瘦身目标

  1. DuBrowser,明确了包体积要在 5M 以内,超过 5M 红线发版本需总监审批
  2. si,AAB 包不要超过 30M

指标

  • APK 大小
  • AAB 大小

一般统计 release 包的大小,Google Play 下载时的 AAB 大小。

APK 分析

APK 分析工具

Android Studio 自带的 Analyze APK 来做的包体积分析,主要就是做了代码、资源、So 等三个方面的重点优化。

AS Analyze APK

将 APK 拖到 Android Studio 中查看 APK 中的内容了

image.png

脚本

统计的脚本

包体积优化思路

APK 的组成

事实上安装包中无非就是 DexResource(resources.arsc/res/AndroidManifest.xml)AssetsLibrary 以及 签名信息(META-INF/) 这五部分。

image.png

  • 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 结构分析

image.png

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优化]]
  • [[包体积优化-资源优化]]
  • [[包体积优化-其他]]

Ref

本文由作者按照 CC BY 4.0 进行授权