-
Notifications
You must be signed in to change notification settings - Fork 780
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-06-11:简述下热修复的原理? #73
Comments
热修复 一词最早应该是 安卓App热补丁动态修复技术=》有没有办法以补丁的方式动态修复紧急Bug,不再需要重新发布App,不再需要用户重新下载,覆盖安装??QQ空间Android团队提出了一个方案:把有问题的类打包到一个dex(patch.dex)中去,然后把这个dex插入到Elements的最前面,该方案基于第二个拆分dex的方案,方案实现如果懂拆分dex的原理的话,大家应该很快就会实现该方案,如果没有拆分dex的项目的话,可以参考一下谷歌的multidex方案实现。然后在插入数组的时候,把补丁包插入到最前面去。 热修复比较重要的一个点也就是classLoader 我们知道Android系统也是仿照java搞了一个虚拟机,不过它不叫JVM,它叫Dalvik/ART VM他们还是有很大区别的(这是不是我们的重点)。我们只需要知道,Dalvik/ART VM 虚拟机加载类和资源也是要用到ClassLoader,不过Jvm通过ClassLoader加载的class字节码,而Dalvik/ART VM通过ClassLoader加载则是dex。 |
代码修复主要有三个方案,分别是底层替换方案、类加载方案和Instant Run方案。3.1 类加载方案类加载方案基于Dex分包方案,什么是Dex分包方案呢?这个得先从65536限制和LinearAlloc限制说起。 这说明应用中引用的方法数超过了最大数65536个。产生这一问题的原因就是系统的65536限制,65536限制的主要原因是DVM Bytecode的限制,DVM指令集的方法调用指令invoke-kind索引为16bits,最多能引用 65535个方法。 publicClass<?> findClass(String name, List suppressed) { for(Element element : dexElements) {//1 Class<?> clazz = element.findClass(name, definingContext, suppressed);//2 if(clazz !=null) { returnclazz; } } if(dexElementsSuppressedExceptions !=null) { suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions)); } returnnull; } Element内部封装了DexFile,DexFile用于加载dex文件,因此每个dex文件对应一个Element。 Android 8.0的invoke方法,如下所示。 |
刚好之前研究过热修复,说下自己的观点: 资源部分热更新直接反射更改所有保存的AssetManager和Resources对象就行(可能需要重启应用) Native代码部分也很简单,系统找到一个so文件的路径是根据ClassLoader找的,修改ClassLoader里保存的路径就行(可能需要重启应用) Java部分的话目前主流有两种方式,一种是Java派,一种是Native派。
|
一点不懂 这又是催我学习的节奏 |
打卡,有点迷茫了 |
热更新 / 热修复
了解热更新就必须了解 loadeClass() 的类加载过程
|
学习一下 |
我们应用程序中的所有的类在APK打包的时候打包成了classDex文件 classDex文件如果采用分包的形式就会打包成多个classDex 所以需要一个dexElemt[]数组来对classDex做管理 把所有的classDex都存放在dexElemt中 我们应用程序中的类加载都是通过dexElemt去加载的 所以我们做修复时要把修复好的classDex重新存放到dexElemt中 |
No description provided.
The text was updated successfully, but these errors were encountered: