Android 编译到运行APK过程总结
2018-07-10 本文已影响96人
会撒娇的犀犀利
APK编译过程

- Android通过
AAPT工具
将.xml资源文件编译成R.java的二进制文件,除了assets、raw目录下的文件; - 将java文件编译成.class文件;
- 通过dex工具将.class文件转换成.dex文件
- 优化dex文件 : Davlik模式下使用
dexopt
工具将.dex文件优化得到.odex
文件 ; Art模式下使用dexoat
工具将.dex文件优化得到.oat
文件; -
apkbuilder
会将.dex文件和未被编译的文件编译成apk; -
apkSinger
对apk签名; -
zipalign
对签名后的apk进行优化
APK包内容

Android 安装的apk文件实际上是以.zip结尾的压缩文件,解压后的文件内容如上图所示
-
AndroidManifest.xml对应源代码中的AndroidManifest.xml, 但这里是编译过的,文件内容已经不同了;
-
assets对应源代码的assets目录, 是直接复制过来的;
-
classes.dex(classes2.dex、classes3.dex等等)是包含所有Java文件对应的字节码,其中
classes.dex
是程序主包; -
lib目录对应源代码中的libs目录,包含so文件;
-
META-INF目录包含CERT.RSA、CERT.SF、MANIFEST.MF等, 保存了各个资源文件的SHA1值,用于校验资源文件是否被篡改,从而防止二次打包时资源文件被替换;
-
res目录对应源码的res目录, 包含各种图片、xml等;
-
resources.arsc包含了各个资源文件的映射, 可以理解为索引, 通过该文件能找到对应的资源文件信息。
APK运行过程
通过ClassLoader
将.dex文件加载到虚拟机中