当编译包含一个或多个apk库的项目时, aapt 工具会生成多个R.java。每个库一个,一个用于应用程序本身。
每个R文件都会定义相同的ID。现在已经有一段时间没有问题了。多年来实际上。但突然间不再了。现在,相同的资源有两个不同的ID。
目标/生成来源/ R / COM / viewpagerindicator / R.java:
public static int default_line_indicator_selected_color=0x7f04000b;
目标/生成来源/ R /净/ sourceforge的/ UIQ3 / fx602p / R.java:
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
。
答案 0 :(得分:1)
组装项目时,主项目会覆盖库资源。
我认为这可以解释为什么库中的R id不是final
。
您对default_line_indicator_selected_color
的所有引用都将使用新值0x7f07000b
。
你在什么情况下遇到这个问题?
当您构建依赖于库项目的应用程序时,SDK工具会将库编译为临时JAR文件并在主项目中使用它,然后使用结果生成.apk。如果在应用程序和库中都定义了资源ID,则这些工具可确保应用程序中声明的资源获得优先级,并且库项目中的资源不会编译到应用程序.apk中。这使您的应用程序可以灵活地使用或重新定义任何库中定义的任何资源行为或值。