Shadow
Shadow copied to clipboard
跨插件访问资源不支持
我插件A里面用了一个sdk,sdk里面有个layout文件。 现在插件B对插件A进行depandsOn,然后插件B就使用不到插件A的资源了
dependsOn
只影响ClassLoader的parent逻辑,不会影响Resources的逻辑的。
但是做资源的依赖关系也是可行的,Android系统本身就支持。可以在构建aar模块时用public.txt
固定一些资源ID,然后在其他Apk中引用固定的资源ID。还需要用aapt2
的参数在构建时修改资源ID的分区。
构造插件的Resources对象时也需要将被依赖的apk添加到android.content.pm.ApplicationInfo#sharedLibraryFiles
字段中。可以通过修改Shadow的这个方法修改构造Resources对象的逻辑com.tencent.shadow.core.loader.blocs.CreateResourceBloc#create
,将dependsOn引入到这里来。
这里可能有些坑,Android大概是8.0或者9.0,android.content.pm.PackageManager#getResourcesForApplication(android.content.pm.ApplicationInfo)
这个API构造的Resources对象才能正确识别sharedLibraryFiles
中的资源ID的分区号。旧版本的Android系统还是需要反射AssetsManager才能正确构造。
仔细一想 其实插件之间共用资源的场景也不是特别多,因为本身资源互相引用就违背了解耦,所以目前我还是先改成native去画布局好了。
目前通过固定id加aapt2的时候import 需共享的resources.ap_,在代码中使用共享资源已经解决,在xml文件中,发现无论带或者不带共享来源的包名来使用资源,都无法通过id找到资源,看了一下android源码,在xml中inflate来的资源,是通过Typedarray再间接通过Resources的一些非public方法加载的,shadow的MixResources无法override这些非public方法。
只能通过sharedLibraryFiles或者反射AssetsManager来解决这个问题,但这本来应该是框架的事情,却又需要业务来处理,总是很纠结
dependsOn
只影响ClassLoader的parent逻辑,不会影响Resources的逻辑的。但是做资源的依赖关系也是可行的,Android系统本身就支持。可以在构建aar模块时用
public.txt
固定一些资源ID,然后在其他Apk中引用固定的资源ID。还需要用aapt2
的参数在构建时修改资源ID的分区。构造插件的Resources对象时也需要将被依赖的apk添加到
android.content.pm.ApplicationInfo#sharedLibraryFiles
字段中。可以通过修改Shadow的这个方法修改构造Resources对象的逻辑com.tencent.shadow.core.loader.blocs.CreateResourceBloc#create
,将dependsOn引入到这里来。这里可能有些坑,Android大概是8.0或者9.0,
android.content.pm.PackageManager#getResourcesForApplication(android.content.pm.ApplicationInfo)
这个API构造的Resources对象才能正确识别sharedLibraryFiles
中的资源ID的分区号。旧版本的Android系统还是需要反射AssetsManager才能正确构造。
https://juejin.cn/post/6844903893130821640
这里面提到的:“关于跨插件依赖资源,代码还没有上传,需要整理一下。请关注com.tencent.shadow.core.loader.blocs.CreateResourceBloc#create方法的实现变化。”
请问这部分关于跨插件依赖资源的修改还有支持的计划吗?或者有没有临时代码提交可以参考?
@shifujun