赞
踩
Android
虚拟机是什么?
Dalvik
和ART(Android Runtime)
扩展知识
Dalvik
是运行的.dex
文件,一个.dex
文件可以包含多个.class
文件,也就是说一个.dex
是包含多个类的
JVM
运行的是.class
文件,一个.class
文件只包含一个类
寄存器是什么?
寄存器是CPU
中的组成部分,是有存储容量的高速存储部件,用来暂存指令、数据和地址.
Dalvik和ART
Dalvik
虚拟机执行的是dex
字节码文件,解释执行.支持JIT即时编译(Just In Time),在程序的运行过程中进行选择热点代码(经常执行的代码)进行编译或者优化
Dalvik
下安装应用时,会执行一次优化,将dex
字节码文件优化生成odex
文件.
ART
虚拟机运行的是机器码
应用程序(
apk
)在安装的时候,ART
使用设备(手机)自带的dex2oat
工具来编译应用程序(apk
),dex
文件中的文件就会被编译成机器码
Andorid N的运作方式
AOT
编译,运行过程中解释执行,对经常执行的方法进行JIT
,经过JIT
(即时编译)编译的方法将会记录到Profile
配置文件中去profile
文件对常用的代码进行AOT
(通过dex2aot
工具编译成机器码)编译.待下次运行时直接使用(机器码)Android中的各种类加载器
超类
)用于加载Android Framework层class文件,ClassLoader的内部类
)下面两个类的父类
)Android应用程序的类加载器
)额外提供的动态类加载器
)ClassLoader加载类的流程和双亲委托机制
如果某个类加载器在加载类时,首先将加载任务委托给父类加载器,一次递归,如果父类可以完成加载任务,就成功返回;
如果父类加载器无法完成任务加载或者没有父类加载器,才自己去加载
双亲委托机制的作用是什么?
代码加载流程 ClassLoader.java
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { try { //TODO tangkun 这里的parent是BootClassLoader if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. c = findClass(name); } } return c; }
Apk加载对应的class文件
apk——>通过dex文件路径——>关联到PathClassLoader(
父类重新了loadClass方法,父类是BaseDexClassLoader
)——>DexPathList ——>Element[]数组(遍历)——>Element元素——>DexFile ——>loadClassBinaryName()方法——>拿到这个class对象
热修复
原理是什么?
在应用启动阶段,也就是在我们自定义的Application
中,利用Android
类加载机制,也就是PathClassLoader
加载我们已经修复了bug
的dex
文件(这个修复了bug
的dex
文件可以放在sd
卡或者应用的私有目录中(data/data
)),然后利用反射技术调用PathClassLoader
的makeElement
方法生成修复bug
的Element
数组,再将修复bug
的数组插入到原来的Element
数组的前面,每次在加载类的时候,就会先加载我们修复bug
的dex
文件,最终达到热修复的目的.
如何生成已经修复的dex文件?
将已经修复了bug
的代码的类通过编译(make project
)生成class
文件,然后将class
文件打包生成dex
文件,这里需要用到sdk
的dx.bat
工具进行打包,这个工具可以同时打包多个class
文件,或者将多个class
文件打包成jar
包,然后通过打包工具一次性打包生成dex
文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。