xposed也要熱更新-改

本文同步自wing的地方酒館

前言

去年很早的時候,就寫過一篇關於xposed熱更新的demo,其實這次的東西早就想寫了,但是一直沒(lan)時(de)間(xie),所以拖到現在纔開始寫。

這次我把Xposed熱更新寫成了一個庫,只需要簡單兩步,即可完成對xposed不重啓更改代碼的操作。

庫的鏈接如下:https://github.com/githubwing/HotXposed

先來說說怎麼使用,使用的方式很簡單。

用法:

1.在gradle添加庫的依賴,各位老司機肯定輕車熟路了。

2.實現IHookerDispatcher,裏面的邏輯就是你本身想寫的hook邏輯。

3.在你的入口類裏面調用HotXposed.hook()方法。

4.激活模塊重啓手機( = = ! 第一次肯定還是要重啓的,不過以後就不用重啓啦)

好了~ 本篇文章到此結束!!

纔怪! (作者你原來這麼短!!!!),no no no,作者不但不短,而且還很長,下面的內容就來說下原理。畢竟。。 我很長。

原理

之前的文章中,介紹了一種熱更新的方式,那就是直接動態加載替換dex。這裏延續之前的方法。

每次安裝以後,去動態調用apk安裝目錄的apk裏面的dex,然後反射調用即可。

所以,我們需要做的第一件事情就是查找插件apk的安裝目錄。

這裏爲了封裝爲庫,繞了點彎子,那就是在庫裏定義一個接口,叫做IHookerDispatcher

這裏主要是爲了定義反射調用時候的方法名,不然調用者就要在庫外面手寫庫內的方法名了。

之後要做的事情,就是尋找插件apk的安裝目錄,那怎麼尋找呢,肯定是根據包名尋找了,包名哪裏來呢? 當然用戶實現的IHookerDispatcher的實現類的包名啦。

哈哈,所以我們定義一個類,叫做HotXposed,用來反射調用實現者的真實邏輯。他需要傳入兩個參數,一個是實現的具體類,另一個是LoadPackageParam.

然後我們就根據類名得到包名,然後根據包名得到安裝目錄:

此時,在調用實現類的dispatch方法,即可實現動態替換代碼:

這下安裝完apk,只要殺死宿主app,就可以不用重啓實現代碼更新了。

哼,你以爲這就完了嗎?

不!

我很長

每次都要殺死宿主app,豈不是很蛋疼? 所以,這裏建議在MainActivity 使用adb命令 來殺死宿主app,這樣我們在編譯安裝完成後,因爲會自動打開MainActivity也就自然幫我們殺死宿主了:

嗯,是不是很方便? 是不是感受到了自動化的魅力?

不過別忘了。

我很長

還有一個問題沒有解決,就是每次都會彈出一個對話框提示重啓,很煩。

所以我在庫內,攔截了這個對話框的彈出,以達到更接近完美的效果!

這下就可以完全enjoy不用重啓的xposed的魅力了!!

項目地址如下:https://github.com/githubwing/HotXposed

不用star, star沒啥用,只要知道我很長就夠了(/滑稽).

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