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檔案無法被正常讀取。
補充
XposedHelpers與XposedBridge
這個兩個類的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>