2014-02-25 102 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

相關問題