|
|
在使用xposed进行hook宿主App的时候,有时候需要调用模块内的Resources
默认下访问的是宿主App的进程也就是宿主App的资源
知识储备:
Lsposed原理
android插件化技术
在android的插件化技术中得知,android资源是通过AssetManager类的addAssetPath函数去加载的
在loadAssets函数中通过资源管理器加载APK资源
并在nativeSetApkAssets去解析apk中的资源
那么思路很简单我们主动调用addAssetPath函数去吧模块的资源加载到宿主App
需要用到xposed的IXposedHookZygoteInit接口
重写initZygote函数
- @Override
- public void initZygote(StartupParam startupParam) throws Throwable {
- modulePath=startupParam.modulePath;
- }
复制代码 这个函数用来获取模块apk路径(/data/app/.....)
在handleLoadPackage函数里,通过去hook获取到宿主App的Context去主动调用addAssetPath
- @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路径的文件读取
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +1
金币 +2
|