阿里百川HotFix2.0热修复初体验

本文介绍了热修复的基本概念,阐述了其在应对紧急bug修复时的优势。详细讲解了ClassLoader在Android中的作用,特别是DexClassLoader在热修复中的关键角色。最后,作者分享了使用阿里百川HotFix2.0进行热修复的步骤,包括SDK集成、配置以及补丁生成过程。
摘要由CSDN通过智能技术生成

一、什么是热修复

热修复说白了就是”打补丁”,比如你们公司上线一个app,用户反应有重大bug,需要紧急修复。如果按照通
常做法,那就是程序猿加班搞定bug,然后测试,重新打包并发布。这样带来的问题就是成本高,效率低。于是,热
修复就应运而生.一般通过事先设定的接口从网上下载无Bug的代码来替换有Bug的代码。这样就省事多了,用
户体验也好。(如下图所示:Android 插件化技术的三个技术点以及它们的应用场景)


二、热修复原理


ClassLoader

在 Java 中,要加载一个类需要用到 ClassLoader 。

Android 中有三个 ClassLoader, 分别为 URLClassLoader 、 PathClassLoader 、 DexClassLoader 。其中

  • URLClassLoader 只能用于加载jar文件,但是由于 dalvik 不能直接识别jar,所以在 Android 中无法使用这个加载器。
  • PathClassLoader 它只能加载已经安装的apk。因为 PathClassLoader 只会去读取 /data/dalvik-cache 目录下的 dex 文件。例如我们安装一个包名为 com.allan.xxx 的 apk,那么当 apk 安装过程中,就会在 /data/dalvik-cache 目录下生产一个名为 data@app@com.allan.xxx-1.apk@classes.dex 的 ODEX 文件。在使用 PathClassLoader 加载 apk 时,它就会去这个文件夹中找相应的 ODEX 文件,如果 apk 没有安装,自然会报 ClassNotFoundException 。
  • DexClassLoader 是最理想的加载器。它的构造函数包含四个参数:

    1.dexPath,指目标类所在的APK或jar文件的路径.类装载器将从该路径中寻找指定的目标类,
      该类必须是APK或jar的全路径.如果要包含多个路径,路径之间必须使用特定的分割符分隔,
      特定的分割符可以使用System.getProperty(“path.separtor”)获得.
    2.dexOutputDir,由于dex文件被包含在APK或者Jar文件中,因此在装载目标类之前需要先从APK或Jar文件
      中解压出dex文件,该参数就是制定解压出的dex 文件存放的路径.在Android系统中,
      一个应用程序一般对应一个Linux用户id,应用程序仅对属于自己的数据目录路径有写的权限,
      因此,该参数可以使用该程序的数据路径.
    3.libPath,指目标类中所使用的C/C++库存放的路径
    4.classload,是指该装载器的父装载器,一般为当前执行类的装载器


framework源码 中的 dalvik.system 包下,找到 DexClassLoader 源码,实际内容是在它的父类 BaseDexClassLoader 中,顺带一提,这个类最低在API14开始有用。包含了两个变量:

private final String originalPath;
private final DexPathList pathList;
//pathList就是多dex的结构列表,查看 其源码:
/** class definition context */
private final ClassLoader definingContext;

/** list of dex/resource (class path) elements */
private final Element[] dexElements;

/** list of native library directory elements */
private final File[] nativeLibraryDirectories;
dexElements 就是一个dex列表,那么我们就可以把每个 Element 当成是一个 dex。 

看下PathClassLoader代码

public class PathClassLoader extends BaseDexClassLoader {
   

    public PathClassLoader(String dexPath, ClassLoader parent) {
        super(dexPath, 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值