Android 为R类中的同一资源生成不同的ID
当编译了一个包含多个apk库的项目时,aapt工具会生成多个R.java。每个库一个,应用程序本身一个 这些R文件中的每一个都将定义相同的id。这在相当长一段时间内没有出现任何问题。事实上,已经有好几年了。但突然之间,不再是了。现在,同一资源有两个不同的ID target/generated sources/r/com/viewpagerindicator/r.java:Android 为R类中的同一资源生成不同的ID,android,android-resources,aapt,Android,Android Resources,Aapt,当编译了一个包含多个apk库的项目时,aapt工具会生成多个R.java。每个库一个,应用程序本身一个 这些R文件中的每一个都将定义相同的id。这在相当长一段时间内没有出现任何问题。事实上,已经有好几年了。但突然之间,不再是了。现在,同一资源有两个不同的ID target/generated sources/r/com/viewpagerindicator/r.java: public static int default_line_indicator_selected_color=0x7f04
public static int default_line_indicator_selected_color=0x7f04000b;
public static final int default_line_indicator_selected_color=0x7f07000b;
target/generated sources/r/net/sourceforge/uiq3/fx602p/r.java:
public static int default_line_indicator_selected_color=0x7f04000b;
public static final int default_line_indicator_selected_color=0x7f07000b;
有人知道可能出了什么问题吗
更新:
public static int default_line_indicator_selected_color=0x7f04000b;
public static final int default_line_indicator_selected_color=0x7f07000b;
我仔细检查了其他项目。在那里我注意到,除了final
之外,R.java文件应该是100%相同的。特别是:每个R.java文件都应该定义所有ID,甚至是不属于库的ID
在我这个麻烦的项目中,情况并非如此。每个库R.java仅定义库使用的ID
快速而肮脏的修复
在我发现真正的问题之前,我使用以下ant任务作为快速而肮脏的修复:
<copy
encoding='${project.build.sourceEncoding}'
file='target/generated-sources/r/net/sourceforge/uiq3/fx602p/R.java'
overwrite='true'
toFile='target/generated-sources/r/com/viewpagerindicator/R.java'
>
<filterchain>
<tokenfilter>
<replacestring
from='net.sourceforge.uiq3.fx602p'
to='com.viewpagerindicator'
></replacestring>
</tokenfilter>
</filterchain>
</copy>
我想知道,当带有搜索和替换功能的副本也可以执行此操作时,为什么会多次调用aapt。请注意,我也不会删除
final
。组装项目时,库资源会被主项目覆盖。
我认为这可以解释为什么库中的R id不是final
所有对default\u line\u indicator\u selected\u color
的引用都将使用新值0x7f07000b
在什么情况下,您对此有问题
当您构建依赖于库项目的应用程序时,SDK工具会将库编译成一个临时JAR文件,并在主项目中使用它,然后使用结果生成.apk。在应用程序和库中都定义了资源ID的情况下,这些工具确保应用程序中声明的资源具有优先级,并且库项目中的资源不会编译到application.apk中。这使您的应用程序能够灵活地使用或重新定义任何库中定义的任何资源行为或值
是的,它们在不同的R.java文件中-我将它们放在彼此的顶部,这样就可以发现一个字符的差异。但你的问题表明这是令人困惑的。我更改了文本。唯一重要的是您正在构建的项目中的文本。