【Xposed模組開發】用Android Studio開發第一個Xposed模組
最近打算學習Xposed模組的開發。
Xposed框架是一款可以在不修改APK的情況下影響程式執行(修改系統)的框架服務,通過替換/system/bin/app_process程式控制zygote程序,使得app_process在啟動過程中會載入XposedBridge.jar這個jar包,從而完成對Zygote程序及其建立的虛擬機器的劫持。
具體瞭解可前往:
下面演示一下如何建立並編寫一個Xposed模組:
首先建立一個工程,新增Xposed依賴,直接在gradle檔案的依賴中新增就可以了:
compileOnly 'de.robv.android.xposed:api:82' compileOnly 'de.robv.android.xposed:api:82:sources'
在AndroidManifest.xml檔案中新增如下內容:
<meta-data android:name="xposedmodule" android:value="true" /> <meta-data android:name="xposeddescription" android:value="Module測試" /> <meta-data android:name="xposedminversion" android:value="54" />
第一個meta-data標識自己是否為一個Xposed模組
第二個meta-data為Xposed模組的描述資訊
第三個meta-data為所支援Xposed框架的最低版本
新建一個Activity,並新增一個按鈕,當點選按鈕時,呼叫toastMessage()方法,彈出一個“我未被劫持”的Toast
public class MainActivity extends AppCompatActivity { private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_main); button = (Button) findViewById(R.id.testButton); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show(); } }); } public String toastMessage() { return "我未被劫持"; } }
我們的模組所要實現的功能就是劫持toastMessage()方法,並返回"你已被劫持"的字串。
新建一個類,並實現IXposedHookLoadPackage介面,並實現IXposedHookLoadPackage介面中的handleLoadPackage方法
public class HookToast implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
}
}
在handleLoadPackage方法中先篩選到我們本程式的包名,然後用XposedHelpers裡的findAndHookMethod方法對MainActivity中的toastMessage方法進行劫持,在其Hook的回撥中的beforeHookedMethod或afterHookedMethod方法裡進行劫持操作,具體程式碼如下:
public class HookToast implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (loadPackageParam.packageName.equals("com.mrglaucus.xposedmoduledemo")) {
Class clazz = loadPackageParam.classLoader.loadClass("com.mrglaucus.xposedmoduledemo.MainActivity");
XposedHelpers.findAndHookMethod(clazz, "toastMessage", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult("你已被劫持");
}
});
}
}
}
現在我們需要告訴Xposed框架模組的主入口類,也就是這裡的com.mrglaucus.xposedmoduledemo.HookToast
新增一個assets資料夾:右鍵點選 app這個module --> new --> Folder -->Assets Folder,然後確認即可。
在assets中new一個file,檔名為xposed_init,並在其中寫上入口類的完整路徑
好了,這樣模組就編寫完成了,其功能是劫持com.glaucus.xposedmoduledemo中的MainActivity中的toastMessage()方法,並返回"你已被劫持".
在執行模組之前要確保手機上已經安裝有Xposed框架,沒有安裝的可以使用這個軟體進行安裝,支援5.0+,需要ROOT許可權,手機有變磚風險,請備份重要資料,部分ROM不支援,如最新版MIUI,三星的ROM等,具體安裝方法和過程這裡不贅述,大家可自行百度。
安裝好Xposed後點擊執行(Run)即可,除錯執行Xposed外掛時請關閉Android Studio的Instan Run功能,否則會報didn't find class的錯誤。
安裝模組後會在Xposed框架的模組列表中顯示:
我們先不勾選它,執行程式,點選按鈕,可見目前是未被劫持狀態
現在勾選,並重啟(重啟才會生效),在執行程式點選按鈕
模組生效,劫持成功。
至此,一個簡單的xposed模組就編寫完成啦,可以看到Xposed模組的功能是十分強大的,大家可以慢慢去發掘。