介紹自己的一個Android插樁熱修複架構項目QuickPatch

來源:互聯網
上載者:User

標籤:載入   out   java   turn   obj   說明   stat   ati   編譯   

QuickPatch項目地址:https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新

類似於美團的Robust插樁熱修複,但是代碼可讀性比較強,還在繼續完善,todo list在項目README裡

特性:基於函數插樁,相容性好(Android版本升級不需要做修改),支援熱更新無需重啟app,參考了美團的Robust插樁熱修複架構,精簡了很多實現細節,代碼可讀性高

一句話原理

簡單地講,就是通過編譯時間在每個函數的頭部插入一個if判斷和一個proxy代理,就可以在運行時動態替換實現,無需重啟。代碼如下:

 

protected void onCreate(Bundle savedInstanceState) {    if (_QPatchStub != null) {        // _QPatchStub.proxy() will check method existance and call it        MethodProxyResult proxyResult = _QPatchStub.proxy(this, "onCreate", "(Landroid/os/Bundle;)V", new Object[]{savedInstanceState});        if (proxyResult.isPatched) {            return;        }    }    // origin implementation below    super.onCreate(savedInstanceState);    // ...}

 

設計思路

  • QuickPatch和美團Robust的區別是,Robust的編譯和dex階段分別使用ASM和Smali做了處理,QuickPatch僅在gradle編譯java到class階段使用Javassist處理,邏輯簡單
  • 不支援自動產生dex補丁(複雜度高,代碼可讀性差),所以需要手動產生補丁,但是提供了補丁類模版,寫起來很方便
  • 對於super的處理使用native調用CallNonVirtual##TYPE##Method()系列方法實現
  • 計劃支援建構函式和增加成員函數的熱修複
  • 可能計劃支援非Android的純Java代碼的熱修複

DEMO

使用說明

  • 開啟app/build.gradle中的一行apply plugin: ‘quickpatch.gradleplugin‘
  • 然後使用AndroidStudio或者./gradlew執行下面任務:
    ./gradlew gradleplugin:uploadArchives # 編譯插樁外掛程式 ./gradlew app:installDebug # 使用外掛程式編譯app代碼並插樁
  • 為了方便點擊app內的Enable Patch按鈕可以類比補丁載入效果,實際上是使用原本的ClassLoader載入了apk內打包好的的QPatch類
  • 同包名下尾碼是_QPatch的類是補丁類,如MainActivity類的補丁類對應名字是MainActivity_QPatch
  • 接下來架構代碼會使用一個新的ClassLoader載入dex,然後反射識別並尋找相應的函數是否存在,如果存在則新的函數裡面的邏輯會被調用
  • 補丁檔案名稱一般是patch.dex, 產生dex需要手動使用命令,比如dx --dex --output=patch.dex MainActivity_QPatch.class
  • 補丁檔案需要手動放置到sd卡下,比如adb push patch.dex /sdcard/
  • 然後點擊app內的Enable Patch按鈕即可即時載入補丁,看到pid不會有變化

效能最佳化思路

  1. 減少沒有patch的時候所有函數調用損耗
  2. 減少有patch時,但沒有走到patch涉及到的類時的損耗
  3. 減少有patch時,走到patch類,但是沒走到patch函數時的損耗
  4. 減少有patch時,走到patch類,並走到patch函數時的損耗
  5. 最佳化patch函數內不包含反射,和包含native反射或java反射的這三種情況

介紹自己的一個Android插樁熱修複架構項目QuickPatch

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.