Xposed模組的開發

snowdream86發表於2016-09-02

作者: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`
}

說明:

  1. 請留意,這個82是Xposed Framework API的版本號,叫做xposedminversion。
  2. xposedminversion可以在這裡進行查詢:
    https://bintray.com/rovo89/de.robv.android.xposed/api
  3. 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>

說明:

  1. xposedmodule: 一般設定為true,表示這是一個xposed模組
  2. xposeddescription: 一句話描述該模組的用途,可以引用string.xml中的字串
  3. 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的更多知識,這裡就不展開了。大家可以參考以下兩篇文章:

  1. Helpers
  2. android-hook框架xposed篇

宣告實現

在assets目錄下建立一個空檔案,命名為xposed_init。
在這個檔案中,每一行記錄一個類的完整路徑,來宣告實現類。
在這裡,我們宣告 “de.robv.android.xposed.mods.tutorial.Tutorial”

好了,到這裡,一個簡單的Xposed模組應用專案就構建好了。

模組安裝與使用

  1. 將這個工程,編譯,打包,安裝到已經支援Xposed的手機中。
  2. 開啟Xposed Installer應用,切換到模組介面,你可以看到你開發的Xposed模組。
  3. 通過勾選/取消,來啟用/禁用模組。然後,重啟手機,進行生效。

模組釋出

Xposed模組開發完成後,你可以按照以下步驟釋出分享。

  1. 你首先需要一個XDA論壇帳號。如果沒有,請前往論壇註冊:
    http://forum.xda-developers.com/
  2. 使用XDA論壇帳號,登入xposed官網,按照操作提示進行釋出。
    http://repo.xposed.info/

Xposed模組開發優勢和不足

優勢

  1. 功能強大,既可以修改系統應用,也可以修改其他應用。hook android,hook everything.
  2. 使用靈活,既可以針對一款應用進行Hook,也可以針對所有應用進行Hook。

不足

  1. 無法除錯。只能通過列印日誌進行跟蹤。(例如:XposedBridge.log)
  2. 無法即時生效。啟用/禁用模組,你需要重啟手機。
  3. multidex支援不足。詳見Multidex support

Xposed模組開發例項

Xposed-Keylogger的基礎上,我稍作修改,製作了一個Xposed模組開發例項。
這個模組的作用就是監聽鍵盤按鍵,記錄所有你設定到EditText控制元件的字串。

建議

Xposed是如此的強大,因此,建議重視手機安全的使用者,堅決不要root,不要安裝xposed,發燒友,土豪隨意。

參考

  1. Xposed 官網
  2. Xposed XDA論壇
  3. Development tutorial
  4. Helpers
  5. Replacing resources
  6. Using the Xposed Framework API
  7. DingDingUnrecalled
  8. FakeXX
  9. WechatLuckyMoney
  10. Xposed Framework API
  11. Xposed Framework API in bintray
  12. android-hook框架xposed篇
  13. JustTrustMe


相關文章