1. 程式人生 > >淺探熱修復技術

淺探熱修復技術

熱修復是一個為了即時解決緊急bug的技術。
從傳統的開發流程看 修復一個bug 的流程:
重新發布版本 ——> 使用者下載安裝 —–> bug 修復
此流程 存在 bug修復的不及時、且使用者下載安裝成本較高 等缺陷。

熱更新修復一個bug 的流程:
檢測服務端是否存在 patch —存在—>下載 patch 到本地
|
|
|
載入本地patch
|
|
修復完成
由此可以看出 熱修復 去修復一個bug 較為靈活,具有:無需重新發版,使用者無感知修復,實時高效熱修復 等優勢,(熱修復 更新的內容繞過了 應用市場的檢測,具有一定的風險)
目前市面可供選擇的熱修復方案較多:HotFix、AndFix、sopHix,還有微信與美團推出的各自的熱修復方案, 網上也有較多文章介紹各個熱修復方案的優缺點, 在此是將網上的方案進行總結一下,做個備份。
市面上熱修復方案雖然較多,但其內部實現依賴的是這兩種技術:

1、art_method 替換技術
2、class 類載入技術

採用 art_method 替換技術的方案,具有以下優點:

1、可以即時修復 bug方法,無需冷啟動應用
2、因為patch是以 method 為單位 生成的,所以補丁包較小
3、對應用無侵入,幾乎無效能損耗

但其缺點也較為顯著:

1、不支援新增欄位,以及修改<init>方法,也不支援對資源的替換。
2、如果廠商修改了art,有可能導致 修復失效。

市面上使用art_method 替換技術的方案為: AndFix, 阿里百川的熱修復方案與 SopHix
採用class 類載入技術 方案的優點為:

1、可以實現類的替換,相容性高。
2、可以修復資源與so庫

不足:

1、不支援即時生效,必須通過重啟才能生效。
2、為了實現修復這個過程,必須在應用中加入兩個dex,對於patch.dex來說,修復的類到了一定數量,就需要花不少的時間載入。
3、在ART模式下,如果類修改了結構,就會出現記憶體錯亂的問題。為了解決這個問題,就必須把所有相關的呼叫類、父類子類等等全部載入到patch.dex中,導致補丁包異常的大,進一步增加應用啟動載入的時候,耗時更加嚴重。

市面上使用 類載入技術的方案較多,且各自都針對與 類載入的方案進行了不同的優化:
微信Tinker、HotFix 與 SopHix 應該都用到此方案。

在此將通過對比 HotFix、AndFix、SopHix,來看起優缺點:

方案對比 Andfix開源版本 HotFix 阿里最新版(Sophix)
方法替換 支援,除部分情況[0] 支援 支援
方法增加減少 不支援 支援 以冷啟動方式支援[1]
方法反射呼叫 只支援靜態方法 支援 以冷啟動方式支援
即時生效 支援 不支援 視情況支援[2]
多DEX 不支援 支援
資源更新 不支援 支援
so庫更新 不支援 支援
Android版本 支援2.3~7.0 全部支援 全部支援包含7.0以上
已有機型 大部分支援[3] 支援 全部支援
安全機制 加密傳輸及簽名校驗 加密傳輸及簽名校驗
效能損耗 低,幾乎無損耗 低,僅冷啟動情況下有些損耗
生成補丁 繁瑣,命令列操作 繁瑣,命令列操作 便捷,圖形化介面
補丁大小 不大,僅變動的類 較大 不大,僅變動的資源和程式碼[3]
服務端支援 支援服務端控制[4]
是否開源 開源 開源 不開源

[0] 部分情況指的是構造方法、引數數目大於8或者引數包括long,double,float基本型別的方法。
[1] 冷啟動方式,指的是需要重啟app在下次啟動時才能生效。
[2] 對於Andfix能夠支援的程式碼變動情況,都能做到即時生效。而對於Andfix不支援的程式碼變動情況,會走冷啟動方式,此時就無法做到即時生效。
[3] 由於支援了資源和庫,如果有這些方面的更新,就會導致的補丁變大一些,這個是很正常的。並且由於只包含差異的部分,所以補丁已經是最大程度的小了。
[4] 提供服務端的補丁釋出和停發、版本控制和灰度功能,儲存開發者上傳的補丁包。

AndFix
開源:https://github.com/alibaba/AndFix
AndFix 是阿里最早出的 一個熱更新的框架,art_methods 的修復技術就是由此而來的,他的是在native 層實現方法的修復的,他的流程大概為:
1、從服務端獲取patch 包
2、 解析patch 包,獲取new方法,與要替換的類,並以此獲取old 方法。
3、在native 層,使用jni 的 FromReflectedMethod 方法,獲取old 、new 在記憶體中的方法指標
4、將new 、old 方法指標 中的資料對掉。
由此實現了方法替換修復。
他的關鍵方法為:

   void replace_6_0(JNIEnv* env, jobject src, jobject dest) {
//通過Method物件得到底層Java函式對應ArtMethod的真實地址。
art::mirror::ArtMethod* smeth =
        (art::mirror::ArtMethod*) env->FromReflectedMethod(src);
art::mirror::ArtMethod* dmeth =
        (art::mirror::ArtMethod*) env->FromReflectedMethod(dest);
... ...
//把舊函式的所有成員變數都替換為新函式的。
smeth->declaring_class_ = dmeth->declaring_class_;
smeth->dex_cache_resolved_methods_ = dmeth->dex_cache_resolved_methods_;
smeth->dex_cache_resolved_types_ = dmeth->dex_cache_resolved_types_;
smeth->access_flags_ = dmeth->access_flags_;
smeth->dex_code_item_offset_ = dmeth->dex_code_item_offset_;
smeth->dex_method_index_ = dmeth->dex_method_index_;
smeth->method_index_ = dmeth->method_index_;

smeth->ptr_sized_fields_.entry_point_from_interpreter_ =
dmeth->ptr_sized_fields_.entry_point_from_interpreter_;

smeth->ptr_sized_fields_.entry_point_from_jni_ =
dmeth->ptr_sized_fields_.entry_point_from_jni_;

smeth->ptr_sized_fields_.entry_point_from_quick_compiled_code_ =
dmeth->ptr_sized_fields_.entry_point_from_quick_compiled_code_;
}

由此可知 AndFix 是在methods 層級進行修復的,可以即時修復,且對apk效能影響較小,因為其開源,可控性較高,且針對業務需要,可以自己進行定製。但其缺陷也較為明顯,如果廠商對art 進行的修改,那麼此 熱修復框架,不會生效, 無法進行 資源與so的修復,且缺少 服務端控制,需要自己搭建服務端, 因為 此方法的侷限性 , 僅能進行方法層級修復,缺少patch 的安全驗證,無法新增新的方法與欄位,缺陷較多

HotFix
開源:http://www.jianshu.com/p/6f0ae1e364d9
他使用的class 類載入方案, 此方案依賴的 dex 分包技術,他的流程為:
1、下載雲端的patch 包
2、冷啟動應用
3、在開啟引用時,載入本地 patch 包,解析出 patch 包中 dex 檔案
4、將dex 檔案載入到記憶體中
到此修復完成, patch 包中的 dex 檔案,包含了需要修復的類與檔案,因為 如果應用存在多個dex包,系統在呼叫方法時,會遍歷dex 檔案,查詢到對應類,然後去呼叫方法,
class 類載入方案是 將 需要修復的 類搶先載入到,ClassLoader 中的dex 陣列中,遍歷時 會先遍歷到修復後的類,並將其返回,以此達到修復的目的。 其核心是依賴系統的此方法:

/* package */final class DexPathList {
...
public Class findClass(String name, List<Throwable> suppressed) {
        //遍歷該陣列
    for (Element element : dexElements) {
        //初始化DexFile
        DexFile dex = element.dexFile;
        if (dex != null) {
            //呼叫DexFile類的loadClassBinaryName方法返回Class例項
            Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);
            if (clazz != null) {
                return clazz;
            }
        }
    }       
    return null;
}
...
} 

用class 類載入技術,是類層級上的 修復技術,可以新加欄位,新加方法,且也是開源的,可控性也較高,可以針對需求 自己定製,例如微信的Tinker 方案就是 此技術結合差分包技術實現的,但此方案的缺陷也 較為明顯, 修復的類,會在記憶體中存在2份 ,如果修復的類較多,那麼對記憶體有影響, 且因為是以類為單位制作patch的,patch 較大, 需要冷啟動,且也缺少服務端,需要自己實現。

Sophix
Sophix 是 阿里2017年6月份推出的一款商業化的 熱更新修復方案, 他是從AndFix後的第三次改進更新(第二次為阿里百川的方案),雖然不開源,但從其介紹來看 應該是在 art_method 替換技術上進行升級並結合 class 載入技術來實現的,在生成patch時 判斷使用那種方案, 在apk 載入patch包時,解析patch包,根據當前patch 包的方案,判斷是否 需要冷啟動。
SopHix 對art_method 替換技術 進行的升級,不再進行old、new 方法指標的繁瑣的替換操作了,直接進行 memcpy操作,將之前一大堆的替換操作凝縮為了:

memcpy(smeth, dmeth, sizeof(ArtMethod));

而獲取 ArtMethod 的大小sizeof(ArtMethod),是通過自己寫兩個連續的方法,通過方法指標的差值來實現的。
改進後的 art_method 的替換,即使廠商修改art 後也不會有影響,依然會替換成功。

且較為稱道的是,他存在完善的後臺服務端,可以對指定patch 包進行灰度測試,或直接釋出。
但可惜的是不開源啊。

相關推薦

修復技術

熱修復是一個為了即時解決緊急bug的技術。 從傳統的開發流程看 修復一個bug 的流程: 重新發布版本 ——> 使用者下載安裝 —–> bug 修復 此流程 存在 bug修復的不及時、且使用者下載安裝成本較高 等缺陷。 熱更新修復

線上修復技術

images sse idt classes lib 反射 png 兩個 logs 沒學會、沒接觸的時候感覺很難,學會了也就沒那麽難 1.前言 2.相關技術 阿裏巴巴 AndFix、Dexposed QQ空間 超級補丁 微信 Tinker (一)

Android修復技術

android新技術更新版本一直以來是移動端的一大痛點,各大公司也推出了相應的解決方案。1)AndFix(阿裏巴巴):兼容性不太好,親試過,上線反饋崩潰問題特別嚴重。2)Tinker(微信):集成起來是相當的麻煩 看完http://blog.csdn.net/u010983881/article/detai

全面了解Android修復技術

服務 補丁 按順序 體積 及其 試用 sta x文件 犯錯 WeTest 導讀 本文探討了Android熱修復技術的發展脈絡,現狀及其未來。 熱修復技術概述 熱修復技術在近年來飛速發展,尤其是在InstantRun方案推出之後,各種熱修復技術競相湧現。國內大部分成熟的主流

Android修復技術原理詳解(最新最全版本)

總結 核心 桌面圖標 實時 開源 穩定性 安卓 定義 check 本文框架 什麽是熱修復? 熱修復框架分類 技術原理及特點 Tinker框架解析 各框架對比圖 總結 ??通過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各類框架的優缺點以及技術原理,文章末尾簡單描述

Android修復技術原理分析

2015年以來,Android開發領域裡對熱修復技術的討論和分享越來越多,同時也出現了一些不同的解決方案,如QQ空間補丁方案、阿里AndFix以 及微信Tinker,它們在原理各有不同,適用場景各異,到底採用哪種方案,是開發者比較頭疼的問題。本文希望通過介紹QQ空間補丁、Tinker以及基於AndF

修復QZone 、 阿里的AndFix 、 騰訊的Tinker

目前熱修復的技術基本上有  QZone  、  阿里的AndFix   、 騰訊的Tinker  等。 下面我們簡單介紹下這幾種熱修復方案: QZone    採用的是dex分包方案,多dex載入原

2018 深入解析Android修復技術

本文框架 什麼是熱修復? 熱修復框架分類 技術原理及特點 Tinker框架解析 各框架對比圖 總結 通過閱讀本文,你會對熱修復技術有更深的認知,本文會列出各類框架的優缺點以及技術原理,文章末尾簡單描述一下Tinker的框架結構。 一、什麼是熱修復? 正常開發流

Android外掛化框架和修復技術的資料收集和彙總

外掛化框架 一個APP功能的堆疊和業務的蓬勃發展,導致APP越來越龐大和臃腫,每一個APP都有一顆超級APP的理想和成為系統第二的願望,如何減少APP的釋出成本和更新成本,外掛化的方式是一條不錯的捷徑。 外掛化的介紹與原理 開源的外掛化框架

深入探索Android修復技術原理讀書筆記——第一章:修復技術介紹

第一章 熱修復技術介紹 1.1 什麼是熱修復 傳統開發流程: 重寫釋出版本代價太高 使用者下載安裝成本太高 bug修復不及時,使用者體驗差 有許多開發者找到了合適的解決辦法,比如: 經常變更的業務用H5獨立出來,但是增加

包建強的培訓課程(15):Android App修復技術

Android外掛化和熱修復 一.簡介 本課程是目前對Android熱修復技術最全的整理和講解,涉及熱修復的歷史、技術流派,詳細介紹了業界各種熱修復技術的原理和接入方式,並對每種熱修復技術的優缺點進行評測。 本課程系列適合於: l從事Android開發2-3年的中高階技術人

Android補丁動態修復技術(二):實戰!CLASS_ISPREVERIFIED問題!(修復技術

在apk安裝的時候,虛擬機器會將dex優化成odex後才拿去執行。在這個過程中會對所有class一個校驗。 校驗方式:假設A該類在它的static方法,private方法,建構函式,override方法中直接引用到B類。如果A類和B類在同一個dex中,那麼A類就會被打上CLASS_ISPREVERIFIED標

Android修復技術Tinker在Android中的實踐

Tinker初體驗 先到Github上下載Tinker原始碼,裡面包含了tinker-sample-android,使用AndroidStudio匯入該例子工程即可。 匯入工程後,執行程式 ,出現如下錯誤: Error:A problem oc

Android修復技術Tinker VS AndFix

流行的熱修復技術有哪些 時下比較流行的熱修復技術有Tinker、QZone、AndFix、Robust。 前面兩個是騰訊開發的,AndFix源於阿里,Robust是美國一家公司開發的。那麼我們應該選用哪一款呢?網上有個它們之間的對比 Tink

《深入探索Android修復技術原理》安卓修復原理寶典出爐,阿里技術大牛聯袂推薦

繼《阿里巴巴Java開發手冊》後,阿里為開發者帶來了第二份重磅大禮:業界首部安卓熱修復原理書籍——,該書為阿里巴巴手淘技術團隊撰寫,現已免費開放下載。  熱修復技術,可以看做是Android平臺發展成熟至一定階段的必然產物。它是一種維護流量、對使用者打攪極小的技術

OCR技術(轉)

傳統 lns usr src clas 明顯 獲得 lock move 網址:https://spaces.ac.cn/archives/3785 OCR技術淺探 作為OCR系統的第一步,特征提取是希望找出圖像中候選的文字區域特征,以便我們在第二步進行文字定位和第三步進行識

2018.11.10 FCC java分享大會《android修復背後的java技術

1、類是如何被jvm載入的      (1)由類載入器載入       (2)類載入器分類,基於雙親委派原則(建議)    (3)關鍵程式碼      先去判斷是否已經載入,如果沒有沒載入

秘手淘高可用平臺(三)——修復和開發流程

中一 實現思路 全部 框架 一次 atl 高級 mat 模塊 本系列文章根據手機淘寶客戶端基礎架構高級開發工程師非臺在安卓綠色聯盟開發者大會上的分享,共分三篇,介紹手淘技術團隊性能和穩定性系統化提升方案EMAS-MOTU的設計原理以及實現思路。 本文重點介紹手淘高可用平臺

OCR技術二: 文字定位和文字切割

文字定位經過前面的特徵提取,我們已經較好地提取了影象的文字特徵,下面進行文字定位。 主要過程分兩步:1、鄰近搜尋,目的是圈出單行文字;2、文字切割,目的是將單行文字切割為單字。 鄰近搜尋我們可以對提取的特徵圖進行連通區域搜尋,得到的每個連通區域視為一個漢字。 這對於大多數漢字

談Android修復

前言: 很多時候測試完的產品上線後,突然發現一個小的bug。這時候考慮到使用者體驗、和時間成本,不能為了一點點bug而重新發布新版本。於是就有了熱修復這個概念的產生!它可以在不釋出版本的情況下修復出bug的程式碼。我們來一探究竟。 看完他們的簡介,基本可以瞭解到,他們都是