自研代码实现热修复问题

来源:10-10 实战:效果展示【自研代码实现热修复】

慕勒4168567

2021-01-21

1.代码执行报错:

Unable to instantiate application com.imooc.hotfix.App: java.lang.RuntimeException: kotlin.TypeCastException: null cannot be cast to non-null type java.lang.Class<kotlin.Any>

断点调试的时候发现是在执行下面这段代码报的错:
// DexPathList 类里面 makeDexElements 方法
val makeDexElements = ReflectUtil.findMethod(
dexPathList,
“makeDexElements”,
List::class.java,
File::class.java,
List::class.java,
ClassLoader::class.java
)
是反射获取方法不被允许吗?

2. 5.0及其以上的系统本课程介绍的热修复代码应该无效,对吗?

之前老师说5.0及其以上的系统(art虚拟机)会在“安装包安装的时候”将dex文件合并编译成机器码,上面的热修复实现是在程序运行的时候执行的,基于这个逻辑是应该无效吗?

写回答

1回答

allenfeng

2021-01-21

  1. 建议根据具体的Crash堆栈确认具体报错的代码行号。根据你的描述可能是上一步获取到的dexPathList为null,可以打印确认下。

  2. ART虚拟机中,被提前编译的,只有安装包内根目录下的的 classes.dex、classes2.dex ... 这些dex,这是APK安装过程中执行的。我们自己生成的补丁dex不在安装包内,是安装后,才被推送到手机内存中,不会被系统提前编译。当应用启动后,我们会手动将自己的补丁dex插入到PathClassLoader内dexElements数组的最前方,后续查找类会优先命中我们的补丁类,从而达到热修复生效的效果。因此,5.0及其以上的系统中,我们的机制也是可以生效的。


0
3
慕勒4168567
回复
allenfeng
明白了,3q!查源码的网站挺好,收藏。
2021-01-21
共3条回复

Android 应用程序构建实战+原理精讲

深度掌握 Gradle 使用,系统性学习 Android 应用构建知识

450 学习 · 116 问题

查看课程