1. 程式人生 > >Xposed模組開發學習記錄

Xposed模組開發學習記錄

Xposed模組相關API可以參考線上文件:

https://api.xposed.info/reference/packages.html

   

入門教程可以參考:

https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API

https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

   

以下是基於AS 3.2.1開發的一個例子。

以"XposedDemo"為名,新建一個"Empty Activity"模板工程。

開啟app/build.gradle,新增xposed依賴:

   

compileOnly'de.robv.android.xposed:api:82'

compileOnly'de.robv.android.xposed:api:82:sources'

第一個依賴是必須的;第二個依賴用於顯示API的文字提示,非必須。

注意必須使用compileOnly(低版本的gradle使用provided),不然使用模組時 ,會有包依賴衝突。

   

在AndroidManifest.xml檔案的<application>標籤中,新增3個<meta-data>宣告:

含義如下:

  • xprosedmodule,值必須為true
  • xposeddescription,對模組的描述資訊
  • xposedminversion,使用Xposed API的版本(gradle新增依賴時,末尾的數字)

   

新建一個類,實現IXposedHookLoadPackage介面,該介面有個handleLoadPackage()抽象方法需要實現。

如果模組啟用,每個app的包被系統載入時,都會呼叫模組的handleLoadPackage()方法,入口引數lpparam通過參考線上API文件,得知可以獲取以下資訊:

可以使用以下程式碼,過濾非目標app:

   

XposedBridge.log()是Xposed框架使用的日誌工具,會同時向logcat(TAG為Xposed)和/data/data/de.robv.android.xposed.installer/log/debug.log(該檔案可以通過Xposed Installer的日誌功能檢視)檔案寫入日誌資訊。

   

通過一定手段,獲取hook的目標方法(包名 、類名、方法名),通常使用Xposed.findAndHookMethod()方法,hook目標方法:

該方法與Java反射的語法類似,需要4個引數:

第1個引數:目標方法所在類的全名(包名+類名);

第2個引數:目標方法所在類使用的類載入器,可以使用lpparam.classLoader獲取;

第3個引數:目標方法的名稱;

第4個引數:為一個Object型別的變長引數,分兩部分。前一部分是目標方法的引數列表,與Java反射語法一樣,使用引數的Class型別描述,例子中hook的是無參方法,故沒有這一部分;後一部分是一個XC_MethodHook()的子類,這個子類是hook的核心,通過重寫beforeHookedMethod()afterHookedMethod(),向目標方法插入程式碼。通過方法名很容易理解,一個方法將程式碼插入在目標方法前,一個方法將程式碼插入到目標方法之後。在這兩個方法裡,可以像正常開發一樣寫程式碼,可以通過入參param獲取目標方法的基本資訊,該引數的型別為MethodHookParam,檢視線上API文件,我們可以獲取以下資料:

目標方法的引數、this引用、返回值(通常用於afterHookedMethod())等基本資訊 ,都可以通過該方法獲得。

   

編寫完hook程式碼後,需要在main資料夾下,新增一個asset檔案,並新建一個文字檔案,命名為Xposed_init(必須是這個名字),該資料夾下錄入IXposedHookLoadPackage介面實現類的類名

   

完成這一切後就可以編譯了,安裝該apk後,Xposed Installer會自動提示是否棄用該模組,啟用並重啟手機後,即可實現對目標方法的hook。

如果是通過除錯的方式安裝apk,需要在編譯器關閉Instant Run功能。開啟這個功能,編譯後的apk會被切分成多個檔案,會導致Xposed_init檔案無法被正常讀取。

   

補充

XposedHelpersXposedBridge

這個兩個類的hook操作的核心類,提供了hook的基本方法。想深入瞭解Xposed模組開發,可以從這兩個類入手。

   

獲取Context

編寫hook程式碼時,如果需要使用Context例項(例如使用Toast時),可以通過AndroidAppHelper類獲取

AndroidAppHepler類還可以獲取以下資訊:

   

修改SharedPreferences

Xposed API提供了XSharedPreferences類,用於修改SharedPreference檔案。

   

替換資源

Xposed API提供了IXposedHookInitPackageResources介面,該介面需要實現handleInitPackageResources()方法 。當app載入app自身的資源時,會呼叫該方法。替換資源的例子,可以參考:

https://github.com/rovo89/XposedBridge/wiki/Replacing-resources

 

最後,在CSDN上發現個大神,有一系列的Xposed開發教程,有需要可以去圍觀:

 2.改為OV機型流暢玩耍高幀率王者農藥

From <https://blog.csdn.net/coder_pig/article/details/80031291>

 

3.微信運動佔領封面出售廣告位

From <https://blog.csdn.net/coder_pig/article/details/80074687>

 

4.猜拳投骰子你能贏算我輸

From <https://blog.csdn.net/coder_pig/article/details/80173216>

 

5.我自己刷的Xposed憑什麼不給我用(反Xposed檢測)

From <https://blog.csdn.net/coder_pig/article/details/80586601>

 

6.你的表白撤不回了

From <https://blog.csdn.net/coder_pig/article/details/80786185>