xposed也要熱更新-改

本文同步自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沒啥用,只要知道我很長就夠了(/滑稽).

相關文章
相關標籤/搜索