前言
本文适用于 Xposed 插件开发者,不适用于普通用户。
您需要准备好 Xposed 环境。
编写插件
新建一个工程,在 AndroidManifest.xml 中添加以下 meta-data:
<!-- 是否是 xposed 模块 -->
<meta-data
android:name="xposedmodule"
android:value="true" />
<!-- 模块描述 -->
<meta-data
android:name="xposeddescription"
android:value="测试 Xposed 模块" />
<!-- 最低 xposed 版本号 -->
<meta-data
android:name="xposedminversion"
android:value="53" />
修改 app/gradle 添加依赖:
dependencies {
···
compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
}
新建类实现接口,例如:
package com.hook.runtime;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Hook implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) {
}
}
在 assets 目录下创建 xposed_init 文件,填写刚才类的全类名,标明模块入口:

至此,最基本的框架就搭建完毕了。
下面以 Hook Runtime#exec() 方法为例,完善刚才的接口实现。
Hook Runtime.getRuntime().exec("xxxx")
先编写一个包名为 com.example.hooktarget
的应用:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Runtime.getRuntime().exec("exec test");
} catch (IOException e) {
e.printStackTrace();
}
}
}
接来下完成对 com.example.hooktarget
应用执行 Runtime.getRuntime().exec("exec test")
方法的 Hook:
public class Hook implements IXposedHookLoadPackage {
private static final String PACKAGE_NAME = "com.example.hooktarget";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) {
if (!loadPackageParam.packageName.equals(PACKAGE_NAME)) {
return;
}
XposedBridge.log("hook begin");
XposedHelpers.findAndHookMethod(Runtime.class, "exec", String.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log((String) param.args[0]);
}
});
}
}
编译后,安装到手机,在 Xposed Installer 中启用并重启,当我们运行 com.example.hooktarget
应用时,就可以看到日志输出了:
05-02 15:22:28.807 18438-18438/? I/Xposed: hook begin
05-02 15:22:28.954 18438-18438/? I/Xposed: exec test
网友评论