默认下访问的是宿主App的进程也就是宿主App的资源
知识储备:
Lsposed原理
android插件化技术
在android的插件化技术中得知,android资源是通过AssetManager类的addAssetPath函数去加载的

addAssetPath.png (9.78 KB, 下载次数: 0)
下载附件
2025-3-25 14:18 上传

addAssetPathInternal.png (30.05 KB, 下载次数: 0)
下载附件
2025-3-25 14:19 上传
在loadAssets函数中通过资源管理器加载APK资源

loadAssets.png (19.96 KB, 下载次数: 0)
下载附件
2025-3-25 14:20 上传
并在nativeSetApkAssets去解析apk中的资源
那么思路很简单我们主动调用addAssetPath函数去吧模块的资源加载到宿主App
需要用到xposed的IXposedHookZygoteInit接口
重写initZygote函数
[Java] 纯文本查看 复制代码
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
modulePath=startupParam.modulePath;
}
这个函数用来获取模块apk路径(/data/app/.....)
在handleLoadPackage函数里,通过去hook获取到宿主App的Context去主动调用addAssetPath
[Java] 纯文本查看 复制代码@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是怎么获取的模块路径)

loadModule.png (133.9 KB, 下载次数: 0)
下载附件
2025-3-25 14:21 上传

loadModules.png (71.06 KB, 下载次数: 0)
下载附件
2025-3-25 14:21 上传
可以看到是通过SELinuxHelper.getAppDataFileService服务读取了/data/data/de.robv.android.xposed.installer/conf/modules.list路径的文件读取