很久沒寫博客了。此次玩一點不同的。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幫咱們了。
觀察application插件,有個叫作transformClassesWithDex的任務,他就是把class文件轉化爲dex的任務,這個時候。咱們去hook這個任務。在他運行完成之後,本身主動把dex push到/sdcard/中。
寫一個任務,叫作pushDex ,並且依賴於transformClassesWithDex。
此時。僅僅要改動完HotFix.java的代碼,而後運行Task pushDex。代碼就本身主動熱更新完成!
推斷adb路徑代碼 使用了AppMethodOrder的代碼,感謝原做者 @三斤-虹貓
項目演示樣例代碼已經上傳至https://github.com/githubwing/HotXposed
認爲實用,能節省時間的話,歡迎star哈。