Android 基於Proxy/Delegate 實現bug熱修複,androiddelegate
一.概述
現在越來越多的app開始採用本地app結合html5的設計結構,這樣做不僅可以跨平台,並且在某個業務或模組出了嚴重的bug,可以直接在html5+後台即時修複,省去了發布新包和新版本的步驟.那麼在不是html5結構的android app中怎麼實現不重新打封裝更新版本的情況下實現熱修複bug呢?這裡介紹的一種方法是通過升級dex檔案來修複線上包的緊急bug。
二.執行個體
該執行個體是之前一篇 Android源碼之DeskClock(三) Proxy/Delegate Application 架構應用 的延伸.
這篇講關於熱修複採用的是Proxy/Delegate Application 架構.
主要實現的流程:
1.替換主程式dex檔案為代理啟動程式的dex檔案
2.代理啟動程式啟動後,動態載入主程式dex
3.ProxyApplication替換消除本身Context引用為MyApplication
4.啟動主程式的Application.
經過上述的步驟處理,由於程式啟動dex只是一個代理,而主程式的dex是動態載入的,所以就可以達到不升級主程式不更改版本號碼只升級dex檔案來修複線上緊急bug的目的.
因為這裡使用了兩個dex檔案,所以就要把之前部落格裡面的ProxyApplication整個剝離出來,作為一個Module,跟主程式同級.
之前那篇部落格因為沒有替換ClassLoader的需求,所以在MyProxyApplication中複寫了一個空的attachBaseContext方法,這裡就需要在attachBaseContext反射替換MyProxyApplication的ClassLoader的父類的執行個體為主程式dex的DexClassLoader,這樣既能動態載入主dex,有能讓外部包括DelegateApplication自身都以為DelegateApplication是程式的第一個入口.
ClassLoader curLoader = ctx.getClassLoader(); DexClassLoader parentLoader = new DexClassLoader(dexPath, outputDir.getAbsolutePath(), nativeLibraryDir, curLoader.getParent()); Field f = ClassLoader.class.getDeclaredField("parent"); f.setAccessible(true); f.set(curLoader, parentLoader); 這個時候主程式的dex檔案就在其他路徑下放著,等待代理啟動dex來載入他,這樣就可以通過從伺服器上下載更新dex到該路徑下就OK了.這種修複方式由於只是替換了dex檔案,沒有更新資源檔,所以只能修複一些不牽扯到更改現有資源的緊急bug.相信在大多數情況下也夠用了.並且基於Proxy/Delegate也可以很好得做擴充,例如外掛程式化,多dex技術等.
轉載請註明出處:http://blog.csdn.net/l2show/article/details/46967987