Android实现动态化的几种形式

学习笔记,仅供自己参考,如有不对欢迎指正

Android常用动态化的几种形式(基本都是依赖于Gradle插件)

1.自动生成文件
配合apt直接生成class文件,通过继承AbstractProcessor类,传入需要生成的文件代码,配置好输出的路径,在build目录下,通过IO流的方式写出文件

2.字节码插桩
使用ASM实现字节码插桩,一般用于自动埋点、统计方法执行时间等等,通过继承ClassVisitor这个类,利用onMethodEnter和onMethodExit方法,写入要插入的字节码指令。
对于字节码指令的编写,很麻烦,一般会在Android Studio上装一个ASM ByteCode Viewer这插件,可以看到每一行java代码具体的字节码指令。

3.热修复
热修复的原理是利用classloader类加载机制,利用双亲委派机制的特性,通过优先加载补丁包(dex文件)中对应的class,从而达到热修复的目的。

3.1 如何实现覆盖
如何做到优先加载补丁包中的类,是利用DexClassLoader修改dexElements中的值,来实现的。

3.2 可能会存在的问题
当一个类A他所有引用的类,比如B、C、D等都是在同一个DEX(A)内,A就会被系统打上一个CLASS_ISPREVERIFIED标记。当A要补丁包DEX(B)被覆盖修改时,就会崩溃,因为系统认为A是不能出现在DEX(B)。
解决方法就是通过字节码插桩的方式,让所有类都引用一个其他DEX的类,这样就可以避免这类问题

你可能感兴趣的:(Android实现动态化的几种形式)