Android 基於Proxy/Delegate 實現bug熱修復

一.概述

       現在越來越多的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

發佈了66 篇原創文章 · 獲贊 15 · 訪問量 78萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章