Android APP 编译流程
2020-08-20 本文已影响0人
_喝喝酒吹吹风_
流程
- 编译
- DEX
- 打包
- 签名
- 对齐
对齐的作用
根本目的是帮助操作系统更高效率的根据请求索引资源,可以减少CPU访问内存的次数,但是缺点是增加了存储空间
android 编译流程:

APK包结构
r 文件夹
项目工程中的 res目录,包括图片、字符串等等
该目录下的资源会被映射到R.java文件中
assets 文件夹
文件夹目录保留工程中assets目录,其他工程下的、jar包中的assets也会合并到该assets目录下,该目录下的资源不会被映射到R.java文件中,访问的时候需要AssetManager类
lib 文件夹
包含所有的so文件,so目录的路径保留原有的路径
META-INF目录
信息描述,签名
所有文件的SHA1-Digest 签名,防止其他程序篡改apk包中的文件
AndroidManifest文件
用来做组件查找
classes.dex文件
虚拟机执行的文件
resources.arsc文件
资源文件索引
D8 R8 和 DEX 的区别
D8 和 DX 比较
- 编译速度更快
- 输出的 .dex 文件更小
- 同时却能保持相同乃至更出色的应用运行时性能。
- D8通过脱糖支持Java8,开启android.enableD8.desugaring的话,会影响所有读写.class字节码的开发工具,因为会使用JAVA8格式。如果不想.class文件中有JAVA8则可以将android.enableD8.desugaring关闭,则可以将JAVA8的特性转为JAVA7的特性。
D8脱糖
脱糖合并进D8可以减少编译时间,优化更多代码,但是字节码处理工具必须支持JAVA8
- .class -> desugar -> ... -> D8 -> .DEX
- .class -> [desugar-D8] -> .DEX
Jack编译器
之前的编译
- graph LR
- Java_Source-.Javac.->Java_ByteCode
- Java_ByteCode-.dx.->dex
Jack编译:依赖Java字节码的第三方库在新的编译器体系下就不能使用了,成本偏大
- graph LR
- Java_Source-.Jack_Compiler.-dex
R8
- R8的流程
- desugaring(脱糖)
- shrinking (压缩)
- obfuscating(混淆)
- optimizing (优化)
- dexing (打包成dex)
- R8包含D8所有功能
- R8新增的功能
- 代码压缩:安全地从App及其库依赖项中删除未使用的类,字段,方法和属性。
- 资源压缩:从打包的App中删除未使用的资源,包括应用程序库依赖项中未使用的资源。它与代码压缩一起使用,这样一旦删除了未使用的代码,也可以安全地删除不再引用的资源。
- 代码混淆:使用简短无意义的名称重命名代码里的类,字段和方法,从而减少DEX文件大小。R8和Proguard 相比,R8 可以更快地缩减代码,同时改善输出大小
- 代码优化:删除未使用的代码或重写代码使其更简洁。
dex 拆分
refrence
- [Android D8 编译器 和 R8 工具]https://blog.csdn.net/Mr_dsw/article/details/90141647
- [使用dx将class转dex总结] https://www.jianshu.com/p/16efe657ec7e