Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.47k stars 1.31k forks source link

相同资源如何共享,不能打包到base插件吗,必须要每个业务插件都要打包一份吗 #1255

Closed boboZeng closed 1 year ago

boboZeng commented 1 year ago

Shadow/projects/sample/source/sample-plugin/sample-app/src/main/res/layout/layout_provider_db.xml:24: AAPT: error: resource dimen/base_lib (aka com.tencent.shadow.sample.host:dimen/base_lib) not found.

我在sample-base-lib定义了40dp>

在sample-app里面layout_provider_db.xml使用了base_lib,但是报错了


我想做的是如果有3个业务插件sample-app1,sample-app2,sample-app3他们需要用到同一个资源,共享资源打包到sample-base这个插件里面,另外3个业务插件不用存放相同资源

shifujun commented 1 year ago

现有的代码是不支持的。Android系统在不断开发中一直在完善这个能力,所以跨apk共享资源的api不稳定。想要在大部分低版本系统上支持这个特性几乎是不可能的。实际上目前的插件Resources构造本身就是插件可以访问宿主资源的。实现就是根据api高低有两套实现。高api的实现依赖的就是aapt的资源id分区设计。但是这个开发中也能测试到很多接口在不同oem系统的不同版本上支持情况也不一致。这个特性基本上只是为系统app服务的,因为它们不需要安装到其他系统上。

所以总的来说,针对较高Android版本,具体多少忘了,差不多至少api 28以上吧。是可以利用aapt本身的资源id分区来实现跨插件复用资源的。这一方案和shadow现有代码没什么冲突,是比较容易二次开发的。

业务中实际上更多是采用Java接口共享已经从Resources中取出的资源。

boboZeng commented 1 year ago

目前我们需要拆分多个sample-app插件,但是都引用了sample-base-lib资源,如果使用pluginCompileOnly project(":sample-base-lib"),插件app里有资源引用直接打包报错,不通过pluginImplementation依赖,有什么建议方式可以让打包通过吗