Android编译过程分析
从下图可得出,Android编辑过程分为:
编译字节码 -> 混淆 -> .class字节码转化dex字节码 -> 打包apk并签名
-> 运行apk -> 执行机器码。
那么,在Android执行机器码的过程中,又发生了什么呢?
Android运行时会读取apk中的dex字节码,并重新编译成机器码,获得更快的执行速度,在Android平台上时OAT文件。
那Android又会使用什么虚拟机来编译代码呢?
android中有DVM(Dalvik Virtual Machine)和 ART(Android RunTime)两种虚拟机。
ART是android 4.4发布的,用来替换Dalvik虚拟,但Android4.4默认采用DVM。系统会提供一个选项来开启ART。在Android 5.0时,默认采用ART。
这两种虚拟机之间的区别:
第一,在运行效率上:
DVM:每次运行,字节码都需要通过JIT进行编译为机器码,运行效率低。
ART:应用在安装时,会进行预编译(AOT),将字节码预先编译成机器码存储在本地。这样程序在每次运行时就不需要编译了,提升运行效率。
ART存在的缺点:其一,安装时间长;其二,字节码预先编译成为机器码占用空间过多。
ART的改进:Android7.0版本中加入了JIT,作为AOT的补充。其一,安装的时候,不会全部编译成机器码,减少安装的时间。其二,在运行时将热点代码编译成机器码,节省空间。
第二,在CPU的设计上:
DVM:是为32位CPU设计的。
ART:支持64位,同时也兼容32位。
第三,在GC(垃圾回收机制)上:
ART进行改进,更加频繁的执行并行垃圾收集。
第四,ART运行时堆上:
其中,Zygote Space 和 Image Space是进程间共享的。除了这4个Space,ART的Java堆还包括2个Mod Union Table,1个Card Table,2个Heap Bitmap,2个Object Map,以及3个Object Stack。
想了解更多,可参考以下:
学习资源一:理解Android编译过程
学习资源二:Android各类虚拟机JVM,DVM,ART区别
学习资源三:Android虚拟机Dalvik ART