Android classloader 加载

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

 

 

双亲委托机制

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

 

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

类加载 时序图

 Android  29   10以及以上版本  

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值