classload 热修复

[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文件

  1. 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

dexopt 与 dex2oat 区别相关面试题解析

Qzone 超级补丁热修复方案原理

美团热修复 Robust 原理解析(二)

一些反常的技术,一直以为对的,现在发现是错误的

1。双锁的静态,2.这个dexClassloader和PathClassloader的一些问题理解