Xposed替換了/system/bin/app_process可執行文件,在啓動Zygote時加載額外的jar文件(/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar),並執行一些初始化操做(執行XposedBridge的main方法)。而後咱們就能夠在這個Zygote上下文中進行某些hook操做。java
軟重啓
,真實手機要選擇硬重啓
,千萬不要搞反。 注:手機啓動會比較慢,但若是手機重啓時卡在歡迎界面,能夠經過連續按電源鍵來跳過Xposed加載。###1. Xposed module基礎android
Xposed程序稱爲module,它是包含一些特殊元數據和文件的android項目。建議使用android SDK 4.0.3 (API 15)進行開發。 一個Xposed module項目結構以下:git
其中/assets/xposed_init文件指定了module的入口類,開發者要在這個類中實現須要的hook代碼。這個類要實現特定的XposedBridge接口。 /assets/xposed_init內容:github
com.example.xmodule.car.XModule
AndroidMannifest.xml內容:app
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.Xmodule" android:versionName="1.0" android:versionCode="1"> <uses-sdk android:minSdkVersion="15"/> <application android:icon="@drawable/icon" android:label="@string/app_name"> <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="Xposed模塊示例"/> <meta-data android:name="xposedminversion" android:value="54"/><!-- 對應的XposedBridge版本號 --> </application> </manifest>
注意: Xposed module項目在開發時導入了XposedBridge jar文件,但編譯時要去掉,不然由於在Zygote中已經導入該jar文件而致使類衝突。ide
###2. 一個簡單的示例測試
開發一個xposed module來修改手機imei,imsi。this
public class XModule implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { //只hook測試app if (lpparam.packageName.equals("com.example.test")) { XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return "this is imei"; } }); XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return "this is imsi"; } }); } } }
###3. 運行module module的安裝與普通app同樣,若是沒有編寫Activity,模塊不會顯示在launcher中。但能夠在XposedInstaller應用中看到安裝的module;另外module的啓用與中止都須要在XposedInstaller中進行配置,配置完還須要重啓才能生效。code
###4. 運行結果 test app的Activity代碼xml
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView tv1 = (TextView) findViewById(R.id.tv1); final TextView tv2 = (TextView) findViewById(R.id.tv2); TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); tv1.setText("imei: "+tm.getDeviceId()); tv2.setText("imsi: "+tm.getSubscriberId()); }
運行結果以下: