一.概述
現在越來越多的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