(图是从别地儿抠过来的,所以不清晰 =。=)
AAPT:
首先,安卓APP的资源这一块,会通过aapt进行一个编译,这个工具编译的时候,会首先会把我们的这个xml文件生成这一个R.java,然后再就是像manifest清单文件,它会通过编译把生成一个二进制文件,资源文件,他会去生成一个resource.arsc文件等等。
AIDL:
右边这一块的话,有一个AIDL。AIDL主要针对程序中跨进程的文件处理,帮你把用aidl这样的接口描述语言写的文件转换成或者说生成这一个Java文件。
APT:
这个里面其实还有像比方说apt,它实际上也是通过APT工具按照我们的一个规则,通过注解去生成Java文件,这个过程也是在这一块做的。
Java Compiler:
做完上述可以看到就相当于有三种这样的Java文件,资源生成R.java,aidl这样的工具生成的Java,再就是我们自己写的Java文件,这些都会通过Javac直接编译成.class文件.
dex:
Dex工具会把class文件,还有我们的第三方的这样的依赖库和.class文件,进行编译生成.dex文件,.dex主要是用来在我们的虚拟机运行,当然这个过程也会去消除一些冗余信息、压缩常量值等等做这样的一些简单的处理,相当于简单的优化一下。
apkbuilder:
生成的.dex就通过apkbuilder编译工具,把由AAPT生成的编译的资源文件,.dex文件,还有其他的一些资源,把它合并生成我们的.apk包。
jarsigner
生成我们的.apk包后就通过运行模式(debug/release)进行签名,生成签名之后生成的signed.apk
zipalign(release模式)
生成签名apk后一般还会做一个字节对齐,那么一般是四字节对齐,主要是为了减少运行时的内存,包括像mmap,对齐了字节后,可以直接访问资源文件,让资源的访问速度更快。
整个APK编译流程大致就是这样。