Xposed模組的開發
作者:snowdream
Email:yanghui1986527#gmail.com
Github: https://github.com/snowdream
QQ 群: 529327615
原文地址:https://snowdream.github.io/blog/2016/09/02/android-develop-xposed-module/
注: 根據Development tutorial 整理完成
建立Android專案
如果準備從零開始建立Xposed模組,首先應該建立一個Android應用工程。
引入 Xposed Framework API
在 app/build.gradle
檔案中宣告Xposed Framework API 的jar包依賴。
repositories {
jcenter();
}
dependencies {
provided `de.robv.android.xposed:api:82`
//如果需要引入文件,方便檢視的話
provided `de.robv.android.xposed:api:82:sources`
}
說明:
- 請留意,這個82是Xposed Framework API的版本號,叫做xposedminversion。
- xposedminversion可以在這裡進行查詢:
https://bintray.com/rovo89/de.robv.android.xposed/api - Xposed Framework API文件請參考:http://api.xposed.info/reference/packages.html
修改AndroidManifest.xml
在AndroidManifest.xml檔案中新增以下程式碼。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.robv.android.xposed.mods.tutorial"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="Easy example which makes the status bar clock red and adds a smiley" />
<meta-data
android:name="xposedminversion"
android:value="53" />
</application>
</manifest>
說明:
- xposedmodule: 一般設定為true,表示這是一個xposed模組
- xposeddescription: 一句話描述該模組的用途,可以引用string.xml中的字串
- xposedminversion: 沒錯,這個就是上面提到的xposedminversion。我理解為要求支援的Xposed Framework最低版本。
模組實現
建立一個或者幾個類,並實現IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子介面。
package de.robv.android.xposed.mods.tutorial;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
}
}
注: XposedBridge.log會將日誌輸出到logcat,並寫入日誌檔案”/data/data/de.robv.android.xposed.installer/log/debug.log”.
好了,現在可以開始Hook了。
大部分的Hook工作,主要通過XposedHelpers類的一些輔助函式來實現。比如:findAndHookMethod
package de.robv.android.xposed.mods.tutorial;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class Tutorial implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.android.systemui"))
return;
findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// this will be called before the clock was updated by the original method
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// this will be called after the clock was updated by the original method
}
});
}
}
注:根據名稱不難發現,beforeHookedMethod/afterHookedMethod會在被Hook函式之前/之後執行。
關於使用Xposed來進行Hook的更多知識,這裡就不展開了。大家可以參考以下兩篇文章:
宣告實現
在assets目錄下建立一個空檔案,命名為xposed_init。
在這個檔案中,每一行記錄一個類的完整路徑,來宣告實現類。
在這裡,我們宣告 “de.robv.android.xposed.mods.tutorial.Tutorial”
好了,到這裡,一個簡單的Xposed模組應用專案就構建好了。
模組安裝與使用
- 將這個工程,編譯,打包,安裝到已經支援Xposed的手機中。
- 開啟Xposed Installer應用,切換到模組介面,你可以看到你開發的Xposed模組。
- 通過勾選/取消,來啟用/禁用模組。然後,重啟手機,進行生效。
模組釋出
Xposed模組開發完成後,你可以按照以下步驟釋出分享。
- 你首先需要一個XDA論壇帳號。如果沒有,請前往論壇註冊:
http://forum.xda-developers.com/ - 使用XDA論壇帳號,登入xposed官網,按照操作提示進行釋出。
http://repo.xposed.info/
Xposed模組開發優勢和不足
優勢
- 功能強大,既可以修改系統應用,也可以修改其他應用。hook android,hook everything.
- 使用靈活,既可以針對一款應用進行Hook,也可以針對所有應用進行Hook。
不足
- 無法除錯。只能通過列印日誌進行跟蹤。(例如:XposedBridge.log)
- 無法即時生效。啟用/禁用模組,你需要重啟手機。
- multidex支援不足。詳見Multidex support
Xposed模組開發例項
在Xposed-Keylogger的基礎上,我稍作修改,製作了一個Xposed模組開發例項。
這個模組的作用就是監聽鍵盤按鍵,記錄所有你設定到EditText控制元件的字串。
建議
Xposed是如此的強大,因此,建議重視手機安全的使用者,堅決不要root,不要安裝xposed,發燒友,土豪隨意。
參考
- Xposed 官網
- Xposed XDA論壇
- Development tutorial
- Helpers
- Replacing resources
- Using the Xposed Framework API
- DingDingUnrecalled
- FakeXX
- WechatLuckyMoney
- Xposed Framework API
- Xposed Framework API in bintray
- android-hook框架xposed篇
- JustTrustMe
相關文章
- Android逆向開發 | 小米5刷Xposed過程Android
- nginx模組開發Nginx
- Xposed 常用
- Js模組化開發的理解JS
- 開發更好用的 JavaScript 模組JavaScript
- Xposed框架的安裝框架
- 模組化開發(二)
- 前端模組化開發前端
- Laravel 模組化開發Laravel
- Yaf多模組開發
- struts多模組開發
- 解剖Nginx·模組開發篇(4)模組開發中的命名規則和模組載入與執行流程Nginx
- Xposed原理分析
- JavaScript模組化開發的那些事JavaScript
- 使用typescript開發angular模組(編寫模組)TypeScriptAngular
- 解剖Nginx·模組開發篇(1)跑起你的 Hello World 模組!Nginx
- Flutter外掛開發《iOS原生模組開發》FlutteriOS
- 淺談模組化開發
- 聊聊前端模組化開發前端
- ModStartCMS模組開發介紹
- 模組化開發淺析
- apache模組開發之helloworldApache
- gradle多模組開發Gradle
- Java 開發中常用的日誌模組Java
- 元件化開發和模組化開發概念辨析元件化
- 開發ejb如何劃分模組,使模組粒度合理
- Javascript模組化開發基礎JavaScript
- 評論模組開發總結
- 上傳模組開發總結
- 前端開發練習:快報模組前端
- angular模組庫開發例項Angular
- 詳解JavaScript模組化開發JavaScript
- 模組化JavaScript元件開發指南JavaScript元件
- DNN模組開發—分析設計DNN
- 基於Laravel5.5的模組化開發Laravel
- 【轉】前端模組化開發的價值 #547前端
- JavaScript模組化開發的演進歷程JavaScript
- 基於 Composer 的 PHP 模組化開發PHP