Android Studio 上第一個 Xposed 模塊

jopen 8年前發布 | 118K 次閱讀 Android Studio開發工具 Android Studio

環境:

已root手機一枚

Android Studio一枚

官方文檔參考 這里 .

準備工作

我們需要事先下載一個 Xposed installer 安裝在手機上,用來管理所有的模塊.

安裝完成后打開:

Android Studio 上第一個 Xposed 模塊

點擊 框架 ,

Android Studio 上第一個 Xposed 模塊

點擊 安裝/更新 安裝框架,

Android Studio 上第一個 Xposed 模塊

點擊確定重啟,框架界面是這樣的:

Android Studio 上第一個 Xposed 模塊

編寫新模塊

打開android studio,新建工程,選擇 Add no activity

Android Studio 上第一個 Xposed 模塊

新建完成后,找到 app 目錄下的 build.gradle 文件,將 dependencies 中的

compile fileTree(dir: 'libs', include: ['*.jar'])

改為:

provided fileTree(dir: 'libs', include: ['*.jar'])

下載 XposedBridgeApi-54.jar 并放入app目錄下的libs文件夾.

在 AndroidManifest.xml 文件的 application 中添加如下代碼,其中的54是前面下載的文件中的號碼.

<meta-data
    android:name="xposedmodule"
    android:value="true" />
<meta-data
    android:name="xposeddescription"
    android:value="kiya's test module" />
<meta-data
    android:name="xposedminversion"
    android:value="54" />

新建一個 Test 類,寫入:

package space.kiya.xposedtest;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class Test implements IXposedHookLoadPackage{
    @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        XposedBridge.log("loaded: " + loadPackageParam.packageName);
    }
}

新建 assets 文件夾,在里面新建文件名為 xposed_init ,寫入剛剛的類名,此處應為 space.kiya.xposedtest.Test .

這時就可以編譯安裝了.

測試

因為工程沒有activity,所以在桌面上看不到該應用。

來到 xposed installer 的 模塊 中,可以看到我們的模塊出現在這里,現在勾選它:

Android Studio 上第一個 Xposed 模塊

在重啟使之生效之前,我們在logcat新建一個tag為 Xposed 的過濾器,這樣就可以過濾出模塊輸出的log.

大概是這樣的:

Loading Xposed v54(for Zygote)...
Loading modules from /data/app/space.kiya.xposedtest-1.apk
  Loading class space.kiya.xposedtest.Test
Loaded: android
...

這樣的日志在 xposed installer 的 日志 中也是可以看到的.

Android Studio 上第一個 Xposed 模塊

如果log中出現了錯誤:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

說明是前面步驟中沒有修改 build.gradle 導致的.

xposed怎樣工作?

開機時, ./init.rc 腳本文件會啟動 Zygote 進程,Zygote對應的具體程序是 /system/bin/app_process ,然后加載需要的類,調用初始化的方法,之后啟動的每個應用都是Zygote的拷貝,所以Zygote進程是十分重要的.

通過在類路徑中添加一個jar包,在 app_process 的特定位置調用jar包中的方法,Xposed框架實現了帶擴展功能的 app_process ,然后將原有的 app_process 替換掉.

在 /data/data/de.robv.android.xposed.installer/bin/ 目錄下有一個 XposedBridge.jar 文件,它就是被引用的jar包,源碼在 github ,main函數在 /src/de/robv/android/xposed/XposedBridge.java 中,每個進程每次啟動時都會被調用.加載模塊的功能也是在這里實現.

Xposed真正強大的是它可以hook調用的方法.當你反編譯修改apk時,你可以在里面插入xposed的命令,于是你就可以在方法調用前后注入自己的代碼.

XposedBridge有一個私有的本地方法 hookMethodNative ,代碼實現放在 app_process 中.在調用被hook的方法前會先調用此方法, hookMethodNative 有一個 handleHookedMethod 方法,可以修改傳遞給被hook函數的參數,變量甚至是調用其他方法.

來自: http://kiya.space/2015/12/28/hello-xposed/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!