2014-02-25 151 views
5

当编译具有多个apk库中的一个的项目时,则多于一个R.java由aapt工具生成。每个库一个,应用程序本身一个。为R类中的相同资源生成不同的ID

每个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。

快速和肮脏的修复

,直到我发现我使用下面的蚂蚁任务作为快速和肮脏的修复,真正的问题是什么:

  <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

是的,他们在不同的R.java文件 - 我已经把那么在彼此的顶部,这样可以发现一个字符的区别。但是你的问题表明这很混乱。我改变了文字。 – Martin

+1

唯一重要的是你正在建设的项目中的一个。 – njzk2

回答

1

当您组装项目时,库资源将被主项目覆盖。 我认为这解释了为什么库中的R ID不是final

default_line_indicator_selected_color的所有引用将使用新值0x7f07000b

在什么情况下你有这个问题?

当你构建依赖于库项目的应用程序,SDK工具编译库到一个临时JAR文件,并使用它的主要项目中,然后使用结果生成.apk文件。在应用程序和库中都定义资源ID的情况下,这些工具可确保在应用程序中声明的资源具有优先权,并且库项目中的资源不会编译到应用程序.apk中。这使您的应用程序能够灵活地使用或重新定义在任何库中定义的任何资源行为或值。

http://developer.android.com/tools/projects/index.html

相关问题