Qigsaw icon indicating copy to clipboard operation
Qigsaw copied to clipboard

feature module依赖library module,引用library module资源时报错找不到

Open PengZeHai opened this issue 3 years ago • 6 comments

你好,feature module依赖library module,引用library module资源时报错找不到,得写对应R的全路径。请问有没有更好办法

PengZeHai avatar Jul 08 '21 02:07 PengZeHai

feature模块编译时R文件只从当前模块里面找,这个改当项目缺失比较恶心了

TongWeiLe avatar Jul 11 '21 08:07 TongWeiLe

除了这个问题之外,你可能还会遇到 feature module单独依赖的 library module在引用宿主资源时候,能编译过但会触发运行时崩溃。这两种问题都能通过改R文件路径来解决。 除了改为全路径外,还可以从生成完的R文件下手,有两种策略:

  1. 第一种是将 feature module 里生成的所有 R.java 类都继承 base module里面的 packageName/R.java 类
  2. 第二种是手动将 base module里的 packageName/R.java 文件和 feature module 目录下所有生成的R文件全部合并

Xiaojuanmao avatar Jul 21 '21 13:07 Xiaojuanmao

除了这个问题之外,你可能还会遇到 feature module单独依赖的 library module在引用宿主资源时候,能编译过但会触发运行时崩溃。这两种问题都能通过改R文件路径来解决。 除了改为全路径外,还可以从生成完的R文件下手,有两种策略:

  1. 第一种是将 feature module 里生成的所有 R.java 类都继承 base module里面的 packageName/R.java 类
  2. 第二种是手动将 base module里的 packageName/R.java 文件和 feature module 目录下所有生成的R文件全部合并

================================================== 这个方案在gradle 3.4的时候可行,但在gradle 3.6后,没有R.java这个中间产物了,会直接生成R.jar,这个时候有什么好的策略吗

PengZeHai avatar Aug 19 '21 13:08 PengZeHai

对于没有R.java直接生成R.jar的编译,这边尝试着修改字节码,移除base module的final,让feature module R.class继承base R.class。 测试可行

PengZeHai avatar Aug 27 '21 06:08 PengZeHai

对于没有R.java直接生成R.jar的编译,这边尝试着修改字节码,移除base module的final,让feature module R.class继承base R.class。 测试可行

请问具体怎么实现呢,我在feature module里面 用asm让 feature modue的R继承了base module的R 但是编译期间还是提示找不到符号

hf529270451 avatar Sep 15 '21 09:09 hf529270451

对于没有R.java直接生成R.jar的编译,这边尝试着修改字节码,移除base module的final,让feature module R.class继承base R.class。 测试可行

请问具体怎么实现呢,我在feature module里面 用asm让 feature modue的R继承了base module的R 但是编译期间还是提示找不到符号

用ASM也可以,我是用Javassist,添加个修改R.jar的task,对于base模块,先解压原本的R.jar,然后移除class的final,不然没法继承,再重新打包成R.jar,替换。对于feature模块,就直接修改为继承base的R就好

PengZeHai avatar Sep 16 '21 09:09 PengZeHai