Java虚拟机 是基于栈的虚拟机
Apt dalvik 虚拟机 是基于寄存器的虚拟机
什么是栈虚拟机 每一个运行的线程都有一个独立的栈,每个方法成为一个栈帧 ,基于虚拟机的栈是通过栈帧里面的操作数栈来进行所有操作
什么是寄存器
寄存器是cpu的一部分 是个存贮单元,可暂存指令和数据
寄存器虚拟机的分类
Dalvik 是字节码解释执行 和JIT(just in Time)即时编译 一起的 dexopt操作将dex
字节码优化转化成odex文件
APT 是通过dex2oat操作 将dex字节码直接转化成当前手机的机器码
Android N 以上的操作是进行混编 即时编译 jit 加上ART
如果执行ART操作的话 安装app的时候需要将dex字节码文件进行转化为机器码 这样安装apk速度太慢 ,所以7.0之后就用混合编译 开始还是用dalvik加载jit进行操作 jit编译过的方法记录在一个配置文件里面 在设备闲置充电的时候 在后台启用个线程进行dex2oat 进行 转化本地机器码操作
Android类加载机制 classloader
双亲委托机制
- 避免重复加载
- 安全性考虑 禁止改freamewoke层的代码 例如: 自定义String类和系统的String类型一样的,如果没有双亲委托机制 就有可能调用自己的string类的 那么就修改了系统源码的了
下面两张图 是介绍 dexElements怎么来的 Dexpathlist构造函数中传入的dex地址 MakepathElement方法通过传入的地址 得到dexElements 是个数据 每个element相当于个dex文件
类加载 时序图
Android 29 10以及以上版本
当Android10 以及以上版本时候保存文件等就不能直接当道sdcrad中了,需要分区权限
解决上面的问题 有两种方法
第一种 : android:requestLegacyExternalStorage="true" 在application中增加前面的代码 禁止禁止分区操作
第二种 :放到私有目录 也就是 sdcard中 Android/data/应用包名路径