Android classloader 加载

Java虚拟机  是基于栈的虚拟机  

Apt dalvik 虚拟机 是基于寄存器的虚拟机

什么是栈虚拟机   每一个运行的线程都有一个独立的栈,每个方法成为一个栈帧 ,基于虚拟机的栈是通过栈帧里面的操作数栈来进行所有操作

什么是寄存器   

寄存器是cpu的一部分  是个存贮单元,可暂存指令和数据

寄存器虚拟机的分类

Android classloader 加载_第1张图片

Dalvik 是字节码解释执行 和JIT(just in Time)即时编译 一起的   dexopt操作将dex

字节码优化转化成odex文件

APT   是通过dex2oat操作 将dex字节码直接转化成当前手机的机器码

Android classloader 加载_第2张图片

 Android classloader 加载_第3张图片

Android N 以上的操作是进行混编  即时编译  jit  加上ART

如果执行ART操作的话   安装app的时候需要将dex字节码文件进行转化为机器码 这样安装apk速度太慢 ,所以7.0之后就用混合编译  开始还是用dalvik加载jit进行操作 jit编译过的方法记录在一个配置文件里面   在设备闲置充电的时候  在后台启用个线程进行dex2oat 进行 转化本地机器码操作   

Android类加载机制 classloader

Android classloader 加载_第4张图片

 

Android classloader 加载_第5张图片

 

双亲委托机制

  1. 避免重复加载
  2. 安全性考虑 禁止改freamewoke层的代码  例如:   自定义String类和系统的String类型一样的,如果没有双亲委托机制  就有可能调用自己的string类的 那么就修改了系统源码的了

Android classloader 加载_第6张图片

 

Android classloader 加载_第7张图片

下面两张图 是介绍 dexElements怎么来的 Dexpathlist构造函数中传入的dex地址  MakepathElement方法通过传入的地址 得到dexElements 是个数据 每个element相当于个dex文件

Android classloader 加载_第8张图片

类加载 时序图

Android classloader 加载_第9张图片

 Android  29   10以及以上版本  Android classloader 加载_第10张图片

当Android10 以及以上版本时候保存文件等就不能直接当道sdcrad中了,需要分区权限

解决上面的问题  有两种方法  

第一种  :    android:requestLegacyExternalStorage="true" 在application中增加前面的代码  禁止禁止分区操作

第二种 :放到私有目录  也就是 sdcard中  Android/data/应用包名路径

你可能感兴趣的:(虚拟机jvm)