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的类,这样就可以避免这类问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 11,005评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,546评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 130,648评论 2 7

友情链接更多精彩内容