Android热修复三部曲之动态加载补丁.dex文件

本文详细介绍了Android热修复技术,重点讲解如何动态加载补丁.dex文件以实现热修复。通过分析ClassLoader和DexFile的源码,提出了加载流程:生成补丁类、合并dex文件、设置到系统ClassLoader中。示例代码展示了具体实现,包括布局文件的按钮操作和测试修复效果。
摘要由CSDN通过智能技术生成

Android热修复三部曲之动态加载补丁.dex文件

转载请标明出处:
http://blog.csdn.net/lisdye2/article/details/52119602
本文出自:【Alex_MaHao的博客】
项目中的源码已经共享到github,有需要者请移步【Alex_MaHao的github】

该篇作为Andriod热修复三部曲的最后一篇,本篇基于前两篇

在之前的博客中,我们将.java文件打成了三个.dex文件
- classes.dex:程序必须启动的类,保证没问题的(Application,MainActivity
- classes2.dex:业务逻辑的类,如果出问题了可以动态替换。
- classes3.dex:jar包的类,基本上不会出现问题。

那么我们实现热修复的原理:

  • 修改好代码之后打出无bug版的classes2.dex
  • 从服务器下载到移动端。
  • 动态加载classes2.dex,实现覆盖。

如何动态加载.dex文件

在java中,ClassLoader负责加载.class文件。那么在Android中同样存在这样的类即BaseDexClassLoader.

因为其实存在于系统源码中的,我们可以看他的源码,有一个关键字段

/**
 * Base class for common functionality between various dex-based
 * {@link ClassLoader} implementations.
 */
public class BaseDexClassLoader extends ClassLoader {
   
    private final DexPathList pathList; // 关键字段

    /**
     * Constructs an instance.
     *
     * @param dexPath the list of jar/apk files containing classes and
     * resources, delimited by {@code File.pathSeparator}, which
     * defaults to {@code ":"} on Android
     * @param optimizedDirectory directory where optimized dex files
     * should be written; may be {@code null}
     * @param libraryPath the list of directories containing native
     * libraries, delimited by {@code File.pathSeparator}; may be
     * {@code null}
     * @param parent the parent class loader
     */
    public BaseDexClassLoader(String dexPath, File optimizedDirectory,
            String libraryPath, ClassLoader parent) {
        super(parent);
        this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
    }

    //...
}

贴了一部分代码,在BaseDexClassLoader中有着很关键的字段DexPathList,从命名上就能看出,其是存放.dex文件的集合。看一下他的源码


                
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值