前言

  • 热补丁修复技术在Android 圈非常火,大量的热补丁方案开始大量涌现
  • 本文将为你全面介绍热补丁的相关知识(原理、主流库使用),希望您会喜欢

目录


1. 简介


2. 储备知识

  • 热补丁的原理主要基于: Android Dex分包方案 & Android的类加载机制(ClassLoader)
  • 所以,在讲热补丁的原理前,先了解上述2个储备知识

2.1 Android Dex 分包方案

  • 简介

  • 示意图

2.2 Android 类加载机制(ClassLoader)

  • 简介

  • 加载流程说明

  • 示意图

注:若2个Dex文件中有重复的类,当加载时,则优先加载排序较前的Dex文件的类

若所需加载类 = class3,则最终加载的是排序较前的Dex1文件中的class3

  • 源码分析
    由于 具体实现类 PathClassLoaderDexClassLoader都继承自BaseDexClassLoader类,所以此处主要讲解BaseDexClassLoader类中与类加载的相关方法findClass()
 /**    * 加载流程说明    **/// 1. 传入需加载类的名字(classname)// 2. 通过Dex文件,寻找到所需类(findClass) // a. 按顺序遍历ClassLoader的所有Dex文件,即 集合dexElements// b. 每遍历到1个Dex文件,则在该Dex文件中寻找所需加载的类// c. 若在该Dex文件找到该类,则返回;若找不到,则继续遍历下1个Dex文件// 3. 加载所需类  /**    * BaseDexClassLoader的findClass()源码分析    **/    @Override    protected Class<?> findClass(String name) throws ClassNotFoundException {        // 从pathList对象对象中寻找->>分析1        Class clazz = pathList.findClass(name);        if (clazz == null) {            throw new ClassNotFoundException(name);        }        return clazz;    }  /**    * 分析1:DexPathList的findClass()源码分析    **/    public Class findClass(String name) {        // 1. 按顺序遍历ClassLoader的所有Dex文件,即 集合dexElements        for (Element element : dexElements) {            DexFile dex = element.dexFile;                        // 2. 每遍历到1个Dex文件,则在该Dex文件中寻找所需加载的类 ->>分析2            if (dex != null) {                Class clazz = dex.loadClassBinaryName(name, definingContext);                // 3. 若在该Dex文件找到该类,则返回;若找不到,则继续遍历下1个Dex文件                if (clazz != null) {                    return clazz;                }            }        }        return null;    }  /**    * 分析2:DexFile的loadClassBinaryName()源码分析    **/    public Class loadClassBinaryName(String name, ClassLoader loader) {        return defineClass(name, loader, mCookie);    }  /**    * 分析3:DexFile的defineClass()源码分析    **/    private native static Class defineClass(String name, ClassLoader loader, int cookie);

3. 热修复 原理

3.1 具体描述

  1. 把需修复、含Bug的类 独立打包到1个Dex文件中(记为:patch.dex
  2. 将该 Dex文件 插入到ClassLoader中集合 dexElements的最前面

3.2 示意图

3.3 特别注意:CLASS_ISPREVERIFIED 标记

  • 具体描述

  • 解决方案具体描述

  • 示意图

注:需完成上述步骤(防止类被打上 CLASS_ISPREVERIFIED 标记),再实现补丁


4. 热修复 开源库介绍

  • 约在15年下半年开始,热补丁修复技术在 Android 圈非常火爆,热补丁方案开始大量涌现
  • 下面,我将主要介绍当前主流的热修复开源库

4.1 主流的热修复 开源库

库名 作者 Github地址
Tinker 腾讯 微信团队 https://github.com/Tencent/tinker
Nuwa 腾讯 QQ空间团队 https://github.com/Tencent/tinker
Dexposed 阿里 手机淘宝团队 https://github.com/alibaba/dexposed
AndFix 阿里 支付宝团队 https://github.com/alibaba/AndFix

4.2 对比


5. 总结

  • 本文主要讲解 Android中的热补丁相关知识

  • 下面我将继续对 Android中的热补丁的主流框架进行 源码分析,感兴趣的同学可以继续关注carson_ho的微信公众号


请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. 写了一个基于WiFi 的 Android(安卓)手机文件管理程序
  6. Android开发问题之布局(layout)文件图形界面不能显示
  7. Android(安卓)多Module,子module依赖aar文件,app module如何引用aa
  8. 最佳的免费移动设备的原型模板文件下载
  9. Android(安卓)程序的反破解技术

随机推荐

  1. Android应用程序进程启动过程的源代码分
  2. Android加固技术分析与多渠道打包实践
  3. Android App 性能优化之图片优化
  4. Android系统服务接口
  5. 《Java和Android开发实战详解》
  6. 深入讲解Android中Activity launchMode
  7. Android我还可以相信你多少系列文章五之
  8. php与android的简单交互
  9. Android技术博文汇总
  10. Drawable Resources Part I(Drawable 资源