Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

R文件不对!错误找不到符号 #11

Closed
keke521 opened this issue Jun 12, 2019 · 23 comments
Closed

R文件不对!错误找不到符号 #11

keke521 opened this issue Jun 12, 2019 · 23 comments

Comments

@keke521
Copy link

keke521 commented Jun 12, 2019

image
这个R 文件路径不对,不是这个包名下的,不知道为啥一直报找不到这个

@kezong
Copy link
Owner

kezong commented Jun 12, 2019

麻烦发一下使用的fat-aar版本号、gradle plugin版本号以及gradle版本号。

@keke521
Copy link
Author

keke521 commented Jun 12, 2019

com.kezong:fat-aar:1.1.7
com.android.tools.build:gradle:3.3.2
gradle-4.10.1-all
想咨询下,我每个 module 里包名都不一样,且 module 之间有依赖关系,能用这个生成一个 aar 吗

@WindyChZh
Copy link

现在可以使用maven插件上传,也是遇到了R文件问题,R文件确实存在,但是项目中引用的时候提示错误

@kezong
Copy link
Owner

kezong commented Jun 12, 2019

现在可以使用maven插件上传,也是遇到了R文件问题,R文件确实存在,但是项目中引用的时候提示错误

看你的描述应该不是编译aar时的问题吧? 提供一下具体的错误信息吧,然后各个插件版本也提供一下。

@kezong
Copy link
Owner

kezong commented Jun 12, 2019

com.kezong:fat-aar:1.1.7
com.android.tools.build:gradle:3.3.2
gradle-4.10.1-all
想咨询下,我每个 module 里包名都不一样,且 module 之间有依赖关系,能用这个生成一个 aar 吗

可以的,example就是。
我这几天出差,没带电脑,你试一下example里的demo,把gradle和gradle plugin改成你的是否可行,或者你将你自己的工程改成demo中同样的gradle版本试试

@cervy
Copy link

cervy commented Jun 13, 2019

com.kezong:fat-aar:1.1.7
com.android.tools.build:gradle:3.4.1
gradle-5.1.1-all

一样有问题

@zhoujian-official
Copy link

一样有问题,1.1.7版本。我这个com.alibaba.offline.solution.apos.wrapper.R下面本来就没有attr

image

@zhoujian-official
Copy link

我确认问题了,底下某些依赖的aar内的R.txt包含了一些id,但是又没有在pom里带上对应的依赖。而fataar插件是通过把R.txt变成R.java来合并id的。能否考虑下还是使用R.txt的形式而不是搞成一个r-classes.jar?谢谢。

@CCY0122
Copy link

CCY0122 commented Jun 19, 2019

同问题

@kezong
Copy link
Owner

kezong commented Jun 21, 2019

如果出现该问题,很有可能是子module需要整体打包,但是没有在主module中加入embed依赖。
具体可以看看 #14

@keke521
Copy link
Author

keke521 commented Jul 4, 2019

用你的 example 确实可以成功,可在你 example 里加入 新建了个Activity(+layout布局),就开始报错!
另外我按照#14 里所有依赖都embed ,了 但是 还是会报一个 layout 找不到,而且 R 文件路径不对,应该是那个

@keke521
Copy link
Author

keke521 commented Jul 4, 2019

image
image
提示找不到那个 layout, 路径应该是在下面那个 R 文件里面才对

@keke521
Copy link
Author

keke521 commented Jul 4, 2019

我确认问题了,底下某些依赖的aar内的R.txt包含了一些id,但是又没有在pom里带上对应的依赖。而fataar插件是通过把R.txt变成R.java来合并id的。能否考虑下还是使用R.txt的形式而不是搞成一个r-classes.jar?谢谢。

赞同

@kezong
Copy link
Owner

kezong commented Jul 4, 2019

用你的 example 确实可以成功,可在你 example 里加入 新建了个Activity(+layout布局),就开始报错!
另外我按照#14 里所有依赖都embed ,了 但是 还是会报一个 layout 找不到,而且 R 文件路径不对,应该是那个

我这边试验过example里加Activity和layout是没有问题的,我有时间会更新example。
aar打包过程中,会将所有资源都合并到主lib下,所以会在主lib中真正生成R.class,R文件路径不是错的,这个步骤是将子module中对应的R import转接到主lib中的R,你有时间可以看一下源码。

查看一下activity_ebl_wxentry所在的子module是否有被主library embed。

@zhoujian-official
Copy link

用你的 example 确实可以成功,可在你 example 里加入 新建了个Activity(+layout布局),就开始报错!
另外我按照#14 里所有依赖都embed ,了 但是 还是会报一个 layout 找不到,而且 R 文件路径不对,应该是那个

我这边试验过example里加Activity和layout是没有问题的,我有时间会更新example。
aar打包过程中,会将所有资源都合并到主lib下,所以会在主lib中真正生成R.class,R文件路径不是错的,这个步骤是将子module中对应的R import转接到主lib中的R,你有时间可以看一下源码。

查看一下activity_ebl_wxentry所在的子module是否有被主library embed。

你说的正常情况,是不会出错的。

我们遇到的都是底下aar不规范的情况(R.txt带了一堆id,但是没有把对应的pom打进来),而且无法把这些缺失的依赖打进来(比如我这边定位到是support包,肯定不能embed进来)。

问题还是出在合并子aar的R.txt到r-classes.jar这个做法,会使这种不规范的aar在这种情况下引起错误。
而google本身工具链反正合并的是R.txt,并不是个类,所以这些不规范的aar在一般情况下不会引起错误。

临时的解法, @keke521 可以试试把这个aar的R.txt给清空,重新打一下这个aar,是可以成功的。

@kezong
Copy link
Owner

kezong commented Jul 4, 2019

@zhoujian365
我了解你的意思了,现在确实没有办法解决这种问题,因为一个aar中只能包含一个R.txt,如果仅仅只是将R.txt合并是不够的,因为这样会在打包apk的时候,将所有R.txt中的资源全都生成在该aar的packageName的包名下,这样就导致原来子module中import的其实是子module包名下的R,而在最后apk中,R却变到了主aar的包名下,导致子module中R类找不到。

现在插件的做法是做了两步:

  • 将所有R.txt合并,这样最后生成apk时,会统一生成主module包名下的R.class文件
  • 根据所有子module的R.txt生成r-classes.jar,目的是做一层映射,将所有的子module包名下的R全部映射到主module的R。

所以直接使用R.txt是无法实现资源合并的;
至于你的这种情况,我现在能想到的是能不能做一个资源检查,查看R.txt中的资源是否真正存在,如果不存在的话将该行过滤掉。
目前的话,建议你们手动过滤下R.txt文件。

@keke521
Copy link
Author

keke521 commented Jul 5, 2019

用你的 example 确实可以成功,可在你 example 里加入 新建了个Activity(+layout布局),就开始报错!
另外我按照#14 里所有依赖都embed ,了 但是 还是会报一个 layout 找不到,而且 R 文件路径不对,应该是那个

我这边试验过example里加Activity和layout是没有问题的,我有时间会更新example。
aar打包过程中,会将所有资源都合并到主lib下,所以会在主lib中真正生成R.class,R文件路径不是错的,这个步骤是将子module中对应的R import转接到主lib中的R,你有时间可以看一下源码。

查看一下activity_ebl_wxentry所在的子module是否有被主library embed。

我已经再三确认了 !
这是我主 module:
image

tac_module_wechat依赖 tacsdk module
所以我在主 module 里 embed他俩 没问题吧。
image

这个找不到的 layout id 就在这个 module 里! 实在不知道是为啥呢!求个 解决问题的方向

@keke521
Copy link
Author

keke521 commented Jul 5, 2019

用你的 example 确实可以成功,可在你 example 里加入 新建了个Activity(+layout布局),就开始报错!
另外我按照#14 里所有依赖都embed ,了 但是 还是会报一个 layout 找不到,而且 R 文件路径不对,应该是那个

我这边试验过example里加Activity和layout是没有问题的,我有时间会更新example。
aar打包过程中,会将所有资源都合并到主lib下,所以会在主lib中真正生成R.class,R文件路径不是错的,这个步骤是将子module中对应的R import转接到主lib中的R,你有时间可以看一下源码。
查看一下activity_ebl_wxentry所在的子module是否有被主library embed。

我已经再三确认了 !
这是我主 module:
image

tac_module_wechat依赖 tacsdk module
所以我在主 module 里 embed他俩 没问题吧。
image

这个找不到的 layout id 就在这个 module 里! 实在不知道是为啥呢!求个 解决问题的方向

刚刚发现 我新建个项目 把这两个模块导进去,然后居然合并成功了!!
可是在我原始的项目里为什么就不成功呢?什么原因呢?

@keke521
Copy link
Author

keke521 commented Jul 5, 2019

用你的 example 确实可以成功,可在你 example 里加入 新建了个Activity(+layout布局),就开始报错!
另外我按照#14 里所有依赖都embed ,了 但是 还是会报一个 layout 找不到,而且 R 文件路径不对,应该是那个

我这边试验过example里加Activity和layout是没有问题的,我有时间会更新example。
aar打包过程中,会将所有资源都合并到主lib下,所以会在主lib中真正生成R.class,R文件路径不是错的,这个步骤是将子module中对应的R import转接到主lib中的R,你有时间可以看一下源码。
查看一下activity_ebl_wxentry所在的子module是否有被主library embed。

你说的正常情况,是不会出错的。

我们遇到的都是底下aar不规范的情况(R.txt带了一堆id,但是没有把对应的pom打进来),而且无法把这些缺失的依赖打进来(比如我这边定位到是support包,肯定不能embed进来)。

问题还是出在合并子aar的R.txt到r-classes.jar这个做法,会使这种不规范的aar在这种情况下引起错误。
而google本身工具链反正合并的是R.txt,并不是个类,所以这些不规范的aar在一般情况下不会引起错误。

临时的解法, @keke521 可以试试把这个aar的R.txt给清空,重新打一下这个aar,是可以成功的。

我这些模块都是 项目里的 module 没有 R.txt, 如果全打成 aar ,再清空 R.txt 再合并,工作量太大了,我们是组件化的,module 异常的多😂

@keke521
Copy link
Author

keke521 commented Jul 5, 2019

最终成功了!不知道为什么之前那个 主 lib 怎么都不成功,我又写个一毛一样(gradle 配置全一样)的 lib ,在新的 lib 里做合并,完美成功!可是最终都不知道 那个失败的 lib 出了什么问题!
感谢作者!!!
感谢作者!!!
感谢作者!!!
小小 star 不成敬意😂

@PiYun01
Copy link

PiYun01 commented Jul 9, 2019

@zhoujian365
我了解你的意思了,现在确实没有办法解决这种问题,因为一个aar中只能包含一个R.txt,如果仅仅只是将R.txt合并是不够的,因为这样会在打包apk的时候,将所有R.txt中的资源全都生成在该aar的packageName的包名下,这样就导致原来子module中import的其实是子module包名下的R,而在最后apk中,R却变到了主aar的包名下,导致子module中R类找不到。

现在插件的做法是做了两步:

  • 将所有R.txt合并,这样最后生成apk时,会统一生成主module包名下的R.class文件
  • 根据所有子module的R.txt生成r-classes.jar,目的是做一层映射,将所有的子module包名下的R全部映射到主module的R。

所以直接使用R.txt是无法实现资源合并的;
至于你的这种情况,我现在能想到的是能不能做一个资源检查,查看R.txt中的资源是否真正存在,如果不存在的话将该行过滤掉。
目前的话,建议你们手动过滤下R.txt文件。

请问这个手动怎么过滤R.txt文件,这个R.text文件是在哪个文件夹下的

@zhoujian-official
Copy link

zhoujian-official commented Jul 9, 2019 via email

@kezong kezong closed this as completed Aug 10, 2019
@qwe134679
Copy link

最后怎么解决的?我用最新的fat-aar也出现了这个问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants