Xposed是一个针对Android Framework的hook框架, 通过/system/bin/app_process修改Zygote的行为, 从而实现hook应用。
Xposed框架安装
完整的Xposed框架包含三个部分
详见
- Xposed Installer
- Xposed Framework
- Xposed Module
插件开发
通过自定义插件hook目标应用,避免了对目标应用的反编译、修改和重新打包。
导入Xposed API依赖
Android Studio通过gradle添加依赖
因Xposed框架本身包含Xposed API,为避免在插件中重复导入jar, 使用provided或compileOnly导入依赖。
声明插件应用
Xposed Installer通过插件应用AndroidManifest.xml的meta-data查找插件,故需在application中添加meta-data信息。
<application
...
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="my demo for xposed"/>
<meta-data
android:name="xposedminversion"
android:value="82"/>
</application>
声明插件入口类
新建文件assets/xposed_init,写入插件所在的类名。
插件类的具体实现
public class MyModule implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(!lpparam.packageName.equals("目标packageName"))
return;
XposedBridge.log("Loaded app: " + lpparam.packageName);
XposedHelpers.findAndHookMethod("目标className", lpparam.classLoader, "目标methodName", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
//...
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Context context = (Context) param.thisObject;
Toast.makeText(context, "You are hooked", Toast.LENGTH_SHORT).show();
}
});
}
}