2013-05-03 26 views
4

我有一個項目A,由庫B引用,A和B具有相同的名稱和類型,但它們的值不同。我認爲aapt應該處理這個問題,以確保項目和圖書館獲得正確的價值。除了重命名項目或庫中的所有資源外,還應該做些什麼來解決這個問題?爲什麼Android無法處理Project和Library之間的資源名稱衝突?

+0

「A」和「B」的類路徑應該不同。不是嗎? – Raptor 2013-05-03 03:10:09

+0

@ShivanRaptor類路徑和包是不同的 – handrenliang 2013-05-03 03:14:52

回答

7

構建系統有意使所有項目資源重疊在庫資源之上。這是爲了能夠根據使用它的應用以不同方式自定義庫資源而完成的。

如果您想在不知情的情況下防止這種情況發生,我們一直建議用戶在庫資源中使用前綴。

改變此時的行爲將會破壞許多人的項目。我們已經考慮過讓它成爲一個選項,但是在新的構建系統完成之前它不會發生。

+0

我認爲它應該是一個選項。假設一個庫有數千個沒有前綴的資源,我們不能確保名稱衝突不會發生。 – handrenliang 2013-05-03 03:49:07

+0

我同意,我們已採取措施在新的構建系統中實現這一目標。雖然需要更多的工作。 – 2013-05-03 03:50:11

+0

順便說一句,爲什麼aapt不能收集東西在斷言庫的目錄到apk中? – handrenliang 2013-05-03 04:00:03

1

根據Android Building process,所有項目和庫(以及所有這些庫中的所有資源)被合併爲apkbuilder進程的一部分。如果您的項目和庫(或兩個庫之間)存在衝突,則最終構建將不知道要共享相同名稱的引用。當然,這樣做的好處在於,您可以通過名稱引用項目中的庫資源,即使基礎構建過程與基礎ID相沖突。

+0

所以你的意思是我應該重命名項目或庫中衝突的所有資源?有成千上萬的資源需要重新命名!我的天啊! – handrenliang 2013-05-03 03:27:53

0

導入相應的R.java文件來解決資源衝突。

  1. 請確保您的包名稱和庫的包名稱不同。

  2. 如果你需要那麼你的圖書館資源,通過library.packagename.R.drawable.resourceId,而不是指它們通過R.drawable.resourceId

  3. 檢查你的根文件,如果它有2個R.java文件。

+1

1.包裝絕對不同。 2. library.packagename.R.drawable.resourceId和R.drawable.resourceId在編譯aapt時是相同的 – handrenliang 2013-05-03 03:36:37

+0

3. gen dir有2個R.java並且它們在不同的包中 – handrenliang 2013-05-03 03:40:48

+0

然後就跟在2.請參考你的資源packagename.R.drawable.resourceID。 – 2013-05-03 03:41:40