日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

介绍自己的一个Android插桩热修复框架项目QuickPatch

發布時間:2023/12/31 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 介绍自己的一个Android插桩热修复框架项目QuickPatch 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

QuickPatch項目地址:

https://gitee.com/egg90/QuickPatch 和 https://github.com/eggfly/QuickPatch 同步更新

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

QuickPatch項目介紹

年輕人的第一個Android插樁熱修復框架

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

一句話原理

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

protected void onCreate(Bundle savedInstanceState) {if (_QPatchStub != null) {// _QPatchStub.proxy() will check method existance and call itMethodProxyResult proxyResult = _QPatchStub.proxy(this, "onCreate", "(Landroid/os/Bundle;)V", new Object[]{savedInstanceState});if (proxyResult.isPatched) {return;}}// origin implementation belowsuper.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不會有變化

性能優化思路

  • 減少沒有patch的時候所有函數調用損耗
  • 減少有patch時,但沒有走到patch涉及到的類時的損耗
  • 減少有patch時,走到patch類,但是沒走到patch函數時的損耗
  • 減少有patch時,走到patch類,并走到patch函數時的損耗
  • 優化patch函數內不包含反射,和包含native反射或java反射的這三種情況
  • 轉載于:https://blog.51cto.com/13941246/2164761

    總結

    以上是生活随笔為你收集整理的介绍自己的一个Android插桩热修复框架项目QuickPatch的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。