具體的配置環(huán)境和手機環(huán)境就不再贅述了。
電腦端:
Android studio
Android sdk
XposedBridgeApi jar包
手機端:
root
安裝了xposed installer
已安裝并激活xposed框架
創(chuàng)建Android工程
其實就是一路next,創(chuàng)建工程完成后等待gradle加載完畢。
導入XposedBridgeApi jar包
導入完成后,修改下app/build.gradle中的依賴聲明。將XposedBridgeApi的依賴由implementation改成provided。改完后記得sync一下gradle。
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
provided files('lib/XposedBridgeApi-54.jar')
}
修改AndroidManifest
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="這里填寫xposde說明" />
<meta-data
android:name="xposedminversion"
android:value="54" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
xposedmodule: 表示這是一個xposed模塊
xposeddescription: 描述該模塊的用途,可以引用string.xml中的字符串
xposedminversion:要求支持的Xposed Framework最低版本
模塊實現(xiàn)
創(chuàng)建一個或者幾個類,并實現(xiàn)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;
import android.util.Log;
public class TestDemo implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
Log.d("YOUR_TAG", "Loaded app: " + lpparam.packageName )
}
}
XposedBridge.log會將日志輸出到logcat,并寫入日志文件
也可以用 android.util.Log輸出到logcat
開始hook
這里舉個例子,實現(xiàn)一下xposed的模塊自檢,檢查自己的模塊是否啟動。就是在程序啟動時,判斷模塊是否激活了。如果激活了就彈個toast提示模塊已開啟,如果因為某種未知原因?qū)е录せ钍。敲淳脧梻€toast提示模塊未開啟。
實現(xiàn)也很簡單,就是在MainActivity實現(xiàn)一個boolean方法,然后用xposed hook自己。能hook成功,自然代表模塊成功啟動了,反之亦然。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!isModuleActive()){
Toast.makeText(this, "模塊未啟動", LENGTH_LONG).show();
}
else {
Toast.makeText(this, "模塊已啟動", LENGTH_LONG).show();
}
}
private boolean isModuleActive(){
return false;
}
hook isModuleActive函數(shù)
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
// Xposed模塊自檢測
if (loadPackageParam.packageName.equals("com.johnhao.testdemo")){
XposedHelpers.findAndHookMethod("com.johnhao.testdemo.MainActivity", loadPackageParam.classLoader, "isModuleActive", XC_MethodReplacement.returnConstant(true));
}
}
這樣就ok了
聲明xposed入口
我們需要新建一個assets文件夾,并創(chuàng)建文件xposed_init,在里面填上xposed模塊的入口.
這里我們聲明自己的類“com.johnhao.testdemo.TestDemo”
到這里,這個簡單的模塊就算開發(fā)完了。
模塊安裝
將這個工程,編譯,打包,安裝到已經(jīng)支持Xposed的手機中。
需要注意的是,要關(guān)閉instant run功能!!!
下面看下實際效果(為什么gif不能自己動呢,還得點擊圖片查看):
勾選激活模塊,重啟設(shè)備
我們再來啟動試試(gif怎么弄才能自動循環(huán)播放呢)
是不是ok了呢?
關(guān)于xposed簡單的介紹就到這兒了