[轉載] Android Studio 上第一個 Xposed 模組

來源:互聯網
上載者:User

標籤:owa   本地   編寫   idg   nts   package   bsp   應用   set   

本文轉載自: http://www.open-open.com/lib/view/open1451364108964.html

 

環境:

已root手機一枚

Android Studio一枚

官方文檔參考 這裡 .

準備工作

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

安裝完成後開啟:

點擊 架構 ,

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

點擊確定重啟,架構介面是這樣的:

編寫新模組

開啟android studio,建立工程,選擇 Add no activity

建立完成後,找到 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 的 模組 中,可以看到我們的模組出現在這裡,現在勾選它:

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

大概是這樣的:

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

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

如果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函數的參數,變數甚至是調用其他方法.

[轉載] Android Studio 上第一個 Xposed 模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.