標籤: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 模組