Xposed也要熱更新

很久沒寫博客了。此次玩一點不同的。css

吐槽&原由

相信熟悉Xposed的小夥伴們都知道,每次寫完Xposed都要從新啓動啊。有木有!反射錯了,寫錯了名字。改一個log,都要從新啓動啊有木有!從新啓動浪費時間啊有木有!一個字母致使一次從新啓動!java

要命啊有木有!android

因此就花時間想了想有木有不從新啓動就立刻生效的辦法呢。git

Xposed每次都需要從新啓動才幹生效,這裏我並不知道詳細緣由,但是大題可以推測爲燒入系統的代碼,因此假設代碼有變更,必須通過從新啓動。那麼有沒有僅僅燒一次。就可以動態變更的方法呢?github

原理

參考android裏classloader實現,發現findClass()最後都是調用了DexFile來loadClass,那咱們也可以偷懶,不包裹classloader。直接拿DexFile來動態載入咱們的代碼呀。markdown

栗子

首先,準備hook一下個人zoomheader,在主界面onCreate()的時候,讓他彈出一個Toast. (事實上作什麼都可以
,這裏僅僅是方便演示)app

此時,打開個人app,就可以彈出「哈哈」這個Toast
post

但是,這時候我發現「哈哈」事實上寫錯了,我想寫成」呵呵」,這時候我不得不改動「哈哈」爲「呵呵」。而後從新啓動。爲了這一個字等上個三五六分鐘。gradle

插件

代碼熱載入。熱更新

因此,這個時候,咱們把需要寫的邏輯代碼單獨放到一個dex裏,而後使用DexFile載入,這時候儘管僅僅燒了一次代碼,但是這個燒了之後的代碼可以依據動態的dex的代碼來進行邏輯變化。

原理很是easy。代碼也很是easy,僅僅需要幾句話。

這裏爲了展現原理,寫了最簡單的。這裏去讀取/sdcard/classes.dex文件。直接導入Hotfix類。調用他的invoke方法。由於彈出toast需要用到activity參數,因此把這個Activity傳入就能夠。

HotFix代碼如圖:把Toast邏輯寫在了裏面。

這個時候,僅僅要把hotfix的apk打包,而後提取dex。經過adb push到sdcard, 就可以實現熱更新了!

本身主動化熱更新

只是這樣未免仍是有些麻煩。因此固然要用gradle幫咱們了。

這裏要感謝下 @小小張 @神來一巴掌 @pighead

觀察application插件,有個叫作transformClassesWithDex的任務,他就是把class文件轉化爲dex的任務,這個時候。咱們去hook這個任務。在他運行完成之後,本身主動把dex push到/sdcard/中。

寫一個任務,叫作pushDex ,並且依賴於transformClassesWithDex。

此時。僅僅要改動完HotFix.java的代碼,而後運行Task pushDex。代碼就本身主動熱更新完成!

推斷adb路徑代碼 使用了AppMethodOrder的代碼,感謝原做者 @三斤-虹貓

項目演示樣例代碼已經上傳至https://github.com/githubwing/HotXposed

認爲實用,能節省時間的話,歡迎star哈。

相關文章
相關標籤/搜索