Xposed也要熱更新

好久沒寫博客了。這次玩一點不一樣的。

吐槽&起因

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

所以就花時間想了想有木有不重啓就立即生效的辦法呢。

Xposed每次都需要重啓才能生效,這裏我並不知道具體原因,但是大題可以猜測爲燒入系統的代碼,所以如果代碼有變動,必須經過重啓。那麼有沒有隻燒一次,就可以動態變動的方法呢?

原理

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

栗子

首先,準備hook一下我的zoomheader,在主界面onCreate()的時候,讓他彈出一個Toast. (其實做什麼都可以
,這裏只是方便演示)

此時,打開我的app,就可以彈出“哈哈”這個Toast

可是,這時候我發現“哈哈”其實寫錯了,我想寫成”呵呵”,這時候我不得不修改“哈哈”爲“呵呵”,然後重啓,爲了這一個字等上個三五六分鐘。。

代碼熱加載,熱更新

所以,這個時候,我們把需要寫的邏輯代碼單獨放到一個dex裏,然後使用DexFile加載,這時候雖然只燒了一次代碼,但是這個燒了以後的代碼可以根據動態的dex的代碼來進行邏輯變化。

原理很簡單,代碼也很簡單,只需要幾句話。

這裏爲了展示原理,寫了最簡單的,這裏去讀取/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哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章