Xposed模块注入资源原理以及思路
在使用xposed进行hook宿主App的时候,有时候需要调用模块内的Resources
默认下访问的是宿主App的进程也就是宿主App的资源
知识储备:
Lsposed原理
android插件化技术
在android的插件化技术中得知,android资源是通过AssetManager类的addAssetPath函数去加载的
在loadAssets函数中通过资源管理器加载APK资源
并在nativeSetApkAssets去解析apk中的资源
那么思路很简单我们主动调用addAssetPath函数去吧模块的资源加载到宿主App
需要用到xposed的IXposedHookZygoteInit接口
重写initZygote函数
[Java] 纯文本查看 复制代码
?
1
2
3
4
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
modulePath=startupParam.modulePath;
}
这个函数用来获取模块apk路径(/data/app/.....)
在handleLoadPackage函数里,通过去hook获取到宿主App的Context去主动调用addAssetPath
[Java] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Context context = (Context) param.args[0];
ClassLoader classLoader = context.getClassLoader();
XposedHelpers.callMethod(context.getResources().getAssets(),"addAssetPath",modulePath);
}
});
}
然后后面我们可以随意去使用我们的资源(drawable,mipmap,values,layout....)
注意使用的时候,调用的context是使用的宿主App的
(initZygote是怎么获取的模块路径)
可以看到是通过SELinuxHelper.getAppDataFileService服务读取了/data/data/de.robv.android.xposed.installer/conf/modules.list路径的文件读取

浙公网安备 33010602011771号