[TOC]
1.android虚拟机Dalvik与ART
2.DexOpt和DexAot
3.Android中的classLoader与双亲委托机制
4.热修复
1.dvm dalvik;
dvm不能直接运行class文件,是运行.dex文件。dex适合内存和处理器速度有限的系统。
jvm指令集,基于栈的
dalvik指令集,基于寄存器,
ART在安装的时候编译字节码到机器语言,不在是解释运行
安装速度变得很慢
cpu有arm或者x86的,所以在安装的时候才进行机器语言,而不是apk的时候打包成机器语言
Dalvik下 JIT just in time 即时编译
dvm:解释运行,有些代码使用非常频繁时,让频繁运行的代码,热点代码,在运行的时候编译成机器码。
kt文件
art占用空间比dalvik大(字节码变为机器码),空间换时间,对dalvik的优化版
art可以兼容dalvik
预编译也可以提升改善电池续航,应用程序不要每次运行的时候进行编译了,减少cpu的消耗
.dex编译后 -> 变成 .oat 机器语言
预编译的过程中aot
.dex — 通过aot编译 - >变成 .oat — 运行在art中
字节码变成了 .oat文件
- dexopt与dexaot
dx — 》 buildtools中的一个工具
ART执行AOT,
dexopt 将.dex文件优化 为 odex’,然后执行
65535产生的原因?????
dex2aot, dex文件-> odex 然后AOT进行边
ELF格式,机器码文件.so ELF文件
5.0以后就是ART模式了
3.classloader,转载查找类的
android中有几种和java有点区别的, android 运行dex ,java是字节码
jdk当中,secureload/url等是java中的
android 8.0中加入的 *inMemoryDexClassLoader *内存中的,不是磁盘上的
PathClassloader:
dexClassloader: 读取外部dex可以把dex优化为odex,这个就是和PathClassloader的区别,PathClassloader不会优化dex
dex指定odex的路径,path是默认的odex路径
这两个没什么区别,
//dexclassload dex优化为odex目录,必须是私有的路径
MainActivity是pathClassloader加载出来的,pathClassloader加载自己写的类
BootClassloader,是android framework层的class文件。
双亲委托机制:先让父亲找,如果找不到,就自己找,啃老的感觉。这里的父亲是parent的一个成员属性,不是继承的那个父类。
为什么要双亲委托
java中是 Bootstrap类
防止串改系统类,然后使用双亲委托
能不能自己写个类叫java.lang.System?
答案:通常不可以,但可以采取另类方法达到这个需求。
解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统提供的System,自己写的System类根本没有机会得到加载。
但是,我们可以自己定义一个类加载器来达到这个目的,为了避免双亲委托机制,这个类加载器也必须是特殊的。由于系统自带的三个类加载器都加载特定目录下的类,如果我们自己的类加载器放在一个特殊的目录,那么系统的加载器就无法加载,也就是最终还是由我们自己的加载器加载。
c/c++加载的已经加载的,
loadClass, findClass,
aosp下载 androidos
DexElements是什么 -> 是一个element数组,element包含一个dexfile
Dexfile就带表一个dex文件,然后c++函数进行加载工作
Element的findclass如何实现的
DexPathList
dexFile
类加载的时候,插入在dex前,就可以了,修复的时候,直接把修复的dex插入到前面就好了
Tinker, andfix。
qq空间热修复
Native:流派 阿里热修复
java:流派
multidex:(classloader修改dexEelements) tinker , qzone超级补丁 qfix bugly
instant-run:美团的
anfix为什么可以不重启也能生效
instant-run模式可以及时生效
ART模式下也是可以加载dex的,所以还是可以进行热修复的。
父类的属性反射
1.直接反射创建element创建
2.new dexpathclassloader 加载dex文件,在反射new出来的classlaoder中的dexelements
3.反射执行makePathElements 创建Element数组
// apk怎么更新?
热修复
请求服务器,存在补丁包,下载-》修复(反射)
上传一个补丁号:然后进行修复
增量更新
服务器只会维护一定数量的版本,版本太低了。就下载新的版本
修复放到application: Tinker可以修复application,但是非常麻烦
打dex包,用dx命令来进行打dex包
也可以用 fix插件
当前app在后台不会anr
创建一个activity指定另一个进程中
写到splashActivity/WelcomeActivity中
Chrome github插件???
java - > dex
1.先转jar包
javac -> class 文件 jar -cvf bug.jar Bug.class 然后转成jar
jar -cvf bug.jar com/zhousaito/fixdemo/Bug.class 这样打出来带包名
2.jar->dex
1 dx --dex --output fix.dex bug.jar
//dex 有问题
java.io.IOException: No original dex files found for dex location /data/user/0/com.zhousaito.fixdemo/code_cache/fix.dex
一些反常的技术,一直以为对的,现在发现是错误的
1。双锁的静态,2.这个dexClassloader和PathClassloader的一些问题理解