5

build.gradle,我的產品口味設置:的Android,搖籃,產品的口味和清單

productFlavors 
{ 
    AlternateFlavour 
    { 
     applicationId "com.myapp.alternateflavour" 
    } 
} 

然後在sourceSets節,我用不同的資源,資產和清單目錄,對那些口味:

sourceSets { 
    main { 
     manifest.srcFile 'AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res'] 
     assets.srcDirs = ['assets'] 
    } 

    AlternateFlavour { 
     manifest.srcFile 'manifest-tmp/AlternateFlavour/AndroidManifest.xml' 
     java.srcDirs = ['src'] 
     res.srcDirs = ['res-tmp/AlternateFlavour'] 
     assets.srcDirs = ['assets-tmp/AlternateFlavour'] 
     } 
    } 

目前爲止確定。

在該清單正在使用的香料,這是在部分自動生成的,我有:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.myapp" 
    android:versionCode="1010001" 
    android:versionName="V1.1.0.1" > 

但在根項目的原始艙單如下:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.myapp" 
    android:versionCode="1010000" 
    android:versionName="V1.1.0.DEBUG" > 

這導致Gradle失敗:

Error: 
    Attribute [email protected] value=(1010001) from AndroidManifest.xml:4:5-28 
    is also present at AndroidManifest.xml:4:5-28 value=(1010000). 
Attributes of <manifest> elements are not merged. 

爲什麼它試圖merg當我指定它應該看別處?

我該如何解決這個問題?

我希望有人會質疑爲什麼我這樣做,或者爲什麼我不使用建議的風味項目結構。那麼,我需要一個正常的清單在Gradle外部使用,例如從Eclipse部署(請一次一個!),我也需要通過構建過程注入的版本。

回答

0

我會心煩保持什麼@CommonsWare自己回答說,但現在,我已經解決了這個如下:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.myapp.myapp" 
    tools:replace="android:versionName,android:versionCode" 
    android:versionCode="1010001" 
    android:versionName="V1.1.0.1" > 

注意兩個tools片段。

我知道這件事的,可是我被推遲嘗試它,因爲完整的搖籃錯誤提出了3個問題:

  • 的versionCode
  • 的versionName
  • 的地圖API密鑰

所有這些都是自動插入的。然而它只是勉強tools:replace作爲最後一個人的建議,所以我覺得它不適用於manifest屬性。事實上,它確實如此。

4

爲什麼它試圖與原始的清單合併,當我指定它應該看別處?

你說味道清單是在別處。清單合併過程合併所有相關的清單:

  • main
  • 生成類型
  • 的產品風味(S)

清單中main始終是相關的。

我該如何阻止?

只要在main中的清單總是相關的,那麼您不這樣做。

最好的解決辦法,一般是讓來自所有艙單擺脫versionCodeversionName,使他們在build.gradle,你有充分的編程控制。

下一個最好的解決方案是移動versionCodeversionNamemain明顯的融入產品的味道,你不在這裏顯示。我從來沒有見過任何人創造一種產品的味道,因爲AFAIK它是毫無意義的—你只能建立一種產品的味道(因爲一旦你引入口味,AFAIK沒有無味的版本)。產品口味通常爲2+組(例如,使用Play服務的味道google和不包含standalone味道的組)。如果main中的值確實爲非AlternateFlavour的風味,請將您的mainversion...東西移到那裏。

除此之外,歡迎您查看the documentation on the manifest merger process,看看您是否可以在正確的指示下獲得您想要的。

+0

所以首先,這裏有很多味道 - 我只是試圖保持給定的例子簡單。我不能(AFAIK)從原始清單中刪除屬性,因爲這是IDE部署使用的屬性。不過,我可以創建第三個,沒有屬性,並默認使用Gradle。似乎過度! –

+0

@RobPridham:「這是IDE部署使用的那個」 - 如果您使用的是Android Studio,Build Variants工具控制IDE使用的內容。 – CommonsWare

+0

確實。不幸的是 - 仍然使用Eclipse和ADT進行這種開發,以獲得各種優秀(儘管不太好)的原因。 –