目录abi ==>应用程序二进制接口
定义:应用程序和操作系统之间、
一个应用和它的库之间、
应用的组成部分之间的低接口
ABI与API的区别:
API定义了源代码和库之间的接口
1、同样的代码可以在支持API的任何系统中编译
2、ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行
abi/cpp下目录:
include:cxxabi.h、new、typeinfo
src:
Android.mk
use_rtti.mk
作用:
abi规定了二进制文件的格式、内容,装载/卸载程序的要求,函数调用时的参数传递规则,寄存器、堆栈的使用
实质:
abi定义了运行时的兼容性问题
api定义了静态状态下的兼容性问题
目录art==>Android Runtime
Dalvik虚拟机通过以下方式提高性能
1、Dex代码安装时或第一次动态加载时,odex化处理
2、Android2.2版本提供了JIT机制提升性能
3、提高硬件配置,如更多核CPU、更高频率CPU、更多的RAM
1、Dalvik运行环境使用JIT来进行转译,应用每次运行的时候字节码都需要JIT转化为机器码——>拖慢应用的运行效率
2、ART则使用AOT(Ahead Of Time)进行处理,会在应用程序安装完毕时,进行预先的基础性编译作业——>减去JIT运行时的机器码转化时间,应用的启动和执行都会变得更加快速
ART
优点:
1、系统性能的显著提升
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时
3、更长的电池续航能力
4、支持更低的硬件
缺点:
1、更大的存储空间占用可能会增加10%~20%
2、更长的应用安装时间
总结:ART的功效就是“空间换时间”
art目录下:
compiler:主要负责Dalvik字节码到本地码的转换,编译为libart_compiler.so
dex2oat:完成dex文件到oat文件的转换,编译为dex2oat
runtime:Android ART运行时源代码,编译为libart.so
oatdump:对oat文件进行分析并格式化显示出文件的组成结构
jdwpspy:是java的调试支持部分,即JPWP服务端的实现
ART——>基于Android4.4以后的版本,意味着最低的版本要求为Android4.4
参考Blog:ART运行时无缝替换Dalvik虚拟机的过程分析
关键点:
1、ART虚拟机的启动过程
2、Dex字节码翻译成本地机器码的过程
分析关键1:
ART虚拟机的启动过程
Android系统在启动的时候创建Zygote进程充当应用程序孵化器,Zygote进程在启动的过程中又会创建一个Dalvik虚拟机
Zygote进程是通过复制自己(也就是
fork
)来创建新的应用程序进程,这意味着Zygote进程会将自己的Dalvik虚拟机也复制给应用程序进程
==>Android系统通过将ART运行时抽象成一个Java虚拟机,以及通过系统属性persist.sys.dalvik.vm.lib和一个适配层JniInvocation就可以无缝地将Dalvik虚拟机替换为ART运行
分析关键2:Dex字节码翻译成本地机器码的过程
1、dex字节码优化——>dey文件——>存放odex文件
2、dex2oat——>dex字节码翻译成本地机器码——>oat文件——>存放odex文件
oat:自定义的elf文件,里面包含的都是本地机器指令
字段oatdata:存储原来打包在APK里面的dex文件
字段oatexec:翻译dex文件里面的类方法得到的本地机器指令
最终,APK运行时,生成的oat文件会被加载到内存中,并且ART通过里面的oatdata和oatexec段找到任意一个类的方法对应的本地机器指令来执行
1、调用JNI接口FindClass加载com.android.internal.os.ZygoteInit类
2、调用JNI接口GetStaticMethodID找到com.android.internal.os.ZygotInit类的静态成员函数main
3、调用JNI接口CalStaticVoidMethod开始执行com.android.internal.ZygoteInit类的静态成员函数main的本地机器指令
完成上述的步骤,开始运行ART虚拟机
当然相关的信息存放在dex2oat工具生成的oat文件中,故需要通过分析oat文件才可深入理解上述内容
详见:参考罗升阳Blog ART相关
目录bionic==>系统底层库
针对Android系统定制的仿生C库、链接器等所在目录。Android并没有使用linux的glibc库,bionic C库针对嵌入式系统优化,添加了一些Android特定的函数API,同时大大减少库的体积,也避免了LGPL版权的问题