Android:這是一份全面&詳細的 熱修復 學習指南
前言
熱補丁修復技術在Android 圈非常火,大量的熱補丁方案開始大量湧現
本文將為你全面介紹熱補丁的相關知識(原理、主流庫使用),希望您會喜歡
目錄

image.png
1. 簡介

image.png
2. 儲備知識
熱補丁的原理主要基於: Android Dex分包方案 & Android的類載入機制(ClassLoader)
所以,在講熱補丁的原理前,先了解上述2個儲備知識
2.1 Android Dex 分包方案
簡介

image.png
示意圖

image.png
2.2 Android 類載入機制(ClassLoader)
簡介

image.png
載入流程說明

示意圖

image.png
注:若2個Dex檔案中有重複的類,當載入時,則優先載入排序較前的Dex檔案的類
若所需載入類 = class3,則最終載入的是排序較前的Dex1檔案中的class3

image.png
原始碼分析
由於 具體實現類 PathClassLoader、DexClassLoader都繼承自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 具體描述
把需修復、含Bug的類 獨立打包到1個Dex檔案中(記為:patch.dex)
將該 Dex檔案 插入到ClassLoader中集合 dexElements的最前面
3.2 示意圖

image.png
3.3 特別注意:CLASS_ISPREVERIFIED 標記
具體描述

image.png
解決方案具體描述

image.png
示意圖

image.png
注:需完成上述步驟(防止類被打上 CLASS_ISPREVERIFIED 標記),再實現補丁
4. 熱修復 開源庫介紹
約在15年下半年開始,熱補丁修復技術在 Android 圈非常火爆,熱補丁方案開始大量湧現
下面,我將主要介紹當前主流的熱修復開源庫
4.1 主流的熱修復 開源庫

image.png
4.2 對比

image.png
5. 總結
本文主要講解 Android中的熱補丁相關知識
這些只是我個人的見解和經驗,希望大家踴躍討論,交流一下你們的寶貴經驗,互相提高下!
附加資料:
Android進階

image
移動架構師

image

image
資料領取:
關注+點贊+加群:185873940 免費獲取!
點選連結加入群聊【Android IOC架構設計】: https://jq.qq.com/?_wv=1027&k=5tIZkaU
領取獲取往期Android高階架構資料、原始碼、筆記、視訊。高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)微信小程式、Flutter全方面的Android進階實踐技術

image