自研代码实现热修复问题
来源: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
建议根据具体的Crash堆栈确认具体报错的代码行号。根据你的描述可能是上一步获取到的dexPathList为null,可以打印确认下。
ART虚拟机中,被提前编译的,只有安装包内根目录下的的 classes.dex、classes2.dex ... 这些dex,这是APK安装过程中执行的。我们自己生成的补丁dex不在安装包内,是安装后,才被推送到手机内存中,不会被系统提前编译。当应用启动后,我们会手动将自己的补丁dex插入到PathClassLoader内dexElements数组的最前方,后续查找类会优先命中我们的补丁类,从而达到热修复生效的效果。因此,5.0及其以上的系统中,我们的机制也是可以生效的。
032021-01-21
相似问题