[TOC]
## apk组成
apk包含应用所有所需资源的 zip 包,它包含了如下所示的几个组成部分:
![](https://img.kancloud.cn/f9/c7/f9c71d660d549d62efa2ca1f487a9c87_477x309.png)
## 图片资源
对安装包内所有PNG图片进行二次无损压缩,列出大小可被进一步压缩的文件及压缩比例。 注:压缩流程是先使用PngCrush工具优化图片,再使用OptiPNG进行无损压缩。 目前是先用pngcrush进行压缩,然后再用optipng进一步压缩 pngcrush工具链接:https://pmt.sourceforge.io/pngcrush/,压缩命令:"pngcrush source dst" optipng工具链接:http://optipng.sourceforge.net/,压缩命令:"optipng -out dst src"
## dex优化
在 AGP 的构建过程中,Java 或 Kotlin 源代码在经过编译之后会生成 Class 字节码文件,在这个阶段 AGP 提供了 Transform 来做字节码的处理,我们非常熟悉的 Proguard 就是在这个阶段工作的,之后 Class 文件经由 dexBuilder 生成一堆较小的 DEX 文件,再经由 mergeDex 合并成最终的 DEX 文件,然后打入 APK 中。具体过程如下图所示:
![](https://img.kancloud.cn/b8/d7/b8d79a6e044663992e00d8ddeaf59776_1080x255.png)
因此,我们针对 DEX 文件的优化时机可以从分别从三个阶段切入,分别是.kt 或.java 源文件、class 文件、DEX 文件:
* 在源文件进行处理也就是手动改造代码,这种方式对程序设计本身有侵入,并且有较强的局限性;
* 在 class 字节码阶段对开发者无感知,而且基本上能完成大多数的优化,但对于像跨 DEX 引用优化这样涉及 DEX 格式本身的优化无法完成;
* 在 DEX 文件阶段进行优化是最理想的,在这个阶段我们除了能对 DEX 字节码本身进行优化,也可对 DEX 文件格式进行操作。
优化的手段总体上来说也就是冗余去除、内容精简、格式优化等方式。
由于早期抖音 class 字节码修改工具建设比较成熟,我们很多包体积的优化都是通过修改 class 字节码完成的,随着优化的深入,后期也有很多优化是在 DEX 文件阶段处理的。关于 DEX 阶段相关的优化我们后续会有相关文章介绍,这里主要介绍 Class 字节码阶段进行的相关优化,主要分为两大类:
* 单纯去除无用的代码指令,包括**去除冗余赋值,无副作用代码删除**等
* 除了能减少代码指令数量外,同时减少方法和字段的数量,从而有效减少 DEX 的数量。我们知道 DEX 中引用方法数、引用字段数等不能超过 65535,超过之后就需要新开一个 DEX 文件,因此减少 DEX 中方法数、字段数可以减少 DEX 文件数量,像**短方法内联、常量字段消除、R 常量内联**就属于这类优化。
## 动态库优化
在一些需要安全高性能的常见,应用中需要采用native来实现。android平台提供了适配各种cpu架构的可能,包括x86 arm mips等,包活arm也有v7 v8等。针对不同cpu我们可以选择打不同包,gradle脚本中通过api也可以限制。或者损失一些性能,只采用arm最低版本也是可以兼容的。对于某些不常用功能,我们也能用动态加载,运行时再下载so到本地。
## 参考资料
[抖音 Android 包体积优化探索:从 Class 字节码入手精简 DEX 体积](https://juejin.cn/post/7052614577216815134)
- Android
- 四大组件
- Activity
- Fragment
- Service
- 序列化
- Handler
- Hander介绍
- MessageQueue详细
- 启动流程
- 系统启动流程
- 应用启动流程
- Activity启动流程
- View
- view绘制
- view事件传递
- choreographer
- LayoutInflater
- UI渲染概念
- Binder
- Binder原理
- Binder最大数据
- Binder小结
- Android组件
- ListView原理
- RecyclerView原理
- SharePreferences
- AsyncTask
- Sqlite
- SQLCipher加密
- 迁移与修复
- Sqlite内核
- Sqlite优化v2
- sqlite索引
- sqlite之wal
- sqlite之锁机制
- 网络
- 基础
- TCP
- HTTP
- HTTP1.1
- HTTP2.0
- HTTPS
- HTTP3.0
- HTTP进化图
- HTTP小结
- 实践
- 网络优化
- Json
- ProtoBuffer
- 断点续传
- 性能
- 卡顿
- 卡顿监控
- ANR
- ANR监控
- 内存
- 内存问题与优化
- 图片内存优化
- 线下内存监控
- 线上内存监控
- 启动优化
- 死锁监控
- 崩溃监控
- 包体积优化
- UI渲染优化
- UI常规优化
- I/O监控
- 电量监控
- 第三方框架
- 网络框架
- Volley
- Okhttp
- 网络框架n问
- OkHttp原理N问
- 设计模式
- EventBus
- Rxjava
- 图片
- ImageWoker
- Gilde的优化
- APT
- 依赖注入
- APT
- ARouter
- ButterKnife
- MMKV
- Jetpack
- 协程
- MVI
- Startup
- DataBinder
- 黑科技
- hook
- 运行期Java-hook技术
- 编译期hook
- ASM
- Transform增量编译
- 运行期Native-hook技术
- 热修复
- 插件化
- AAB
- Shadow
- 虚拟机
- 其他
- UI自动化
- JavaParser
- Android Line
- 编译
- 疑难杂症
- Android11滑动异常
- 方案
- 工业化
- 模块化
- 隐私合规
- 动态化
- 项目管理
- 业务启动优化
- 业务架构设计
- 性能优化case
- 性能优化-排查思路
- 性能优化-现有方案
- 登录
- 搜索
- C++
- NDK入门
- 跨平台
- H5
- Flutter
- Flutter 性能优化
- 数据跨平台