本文同步自wing的地方酒館php
去年很早的時候,就寫過一篇關於xposed熱更新的demo,其實此次的東西早就想寫了,可是一直沒(lan)時(de)間(xie),因此拖到如今纔開始寫。android
此次我把Xposed熱更新寫成了一個庫,只須要簡單兩步,便可完成對xposed不重啓更改代碼的操做。git
庫的連接以下:github.com/githubwing/…github
先來講說怎麼使用,使用的方式很簡單。app
1.在gradle添加庫的依賴,各位老司機確定輕車熟路了。gradle
2.實現IHookerDispatcher,裏面的邏輯就是你自己想寫的hook邏輯。spa
3.在你的入口類裏面調用HotXposed.hook()方法。.net
4.激活模塊重啓手機( = = ! 第一次確定仍是要重啓的,不過之後就不用重啓啦)插件
好了~ 本篇文章到此結束!!3d
纔怪! (做者你原來這麼短!!!!),no no no,做者不但不短,並且還很長,下面的內容就來講下原理。畢竟。。 我很長。
在以前的文章中,介紹了一種熱更新的方式,那就是直接動態加載替換dex。這裏延續以前的方法。
每次安裝之後,去動態調用apk安裝目錄的apk裏面的dex,而後反射調用便可。
因此,咱們須要作的第一件事情就是查找插件apk的安裝目錄。
這裏爲了封裝爲庫,繞了點彎子,那就是在庫裏定義一個接口,叫作IHookerDispatcher
這裏主要是爲了定義反射調用時候的方法名,否則調用者就要在庫外面手寫庫內的方法名了。
以後要作的事情,就是尋找插件apk的安裝目錄,那怎麼尋找呢,確定是根據包名尋找了,包名哪裏來呢? 固然用戶實現的IHookerDispatcher的實現類的包名啦。
哈哈,因此咱們定義一個類,叫作HotXposed,用來反射調用實現者的真實邏輯。他須要傳入兩個參數,一個是實現的具體類,另外一個是LoadPackageParam.
而後咱們就根據類名獲得包名,而後根據包名獲得安裝目錄:
此時,在調用實現類的dispatch方法,便可實現動態替換代碼:
這下安裝完apk,只要殺死宿主app,就能夠不用重啓實現代碼更新了。
哼,你覺得這就完了嗎?
不!
每次都要殺死宿主app,豈不是很蛋疼? 因此,這裏建議在MainActivity 使用adb命令 來殺死宿主app,這樣咱們在編譯安裝完成後,由於會自動打開MainActivity也就天然幫咱們殺死宿主了:
嗯,是否是很方便? 是否是感覺到了自動化的魅力?
不過別忘了。
還有一個問題沒有解決,就是每次都會彈出一個對話框提示重啓,很煩。
因此我在庫內,攔截了這個對話框的彈出,以達到更接近完美的效果!
這下就能夠徹底enjoy不用重啓的xposed的魅力了!!
項目地址以下:github.com/githubwing/…
不用star, star沒啥用,只要知道我很長就夠了(/滑稽).