5

В build.gradle, я вкус продукта установить:Android, Gradle, ароматы продуктов и манифест

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. 

Почему т чтобы слиться с оригинальным манифестом вообще, когда я указал, что он должен искать в другом месте?

И как я могу остановить это?

Я ожидаю, что некоторые будут подвергать сомнению, почему я так делаю это вообще, или действительно, почему я не использую предложенную структуру проекта вкуса. Ну, мне нужен нормальный манифест для использования за пределами 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 фрагменты.

Я знал об этом изначально, но я отложу, потому что полная ошибка Gradle называет три проблем:

  • VersionCode
  • versionName
  • Карты API ключом

Все они автоматически вставлены. Однако он только просил tools:replace в качестве предложения для последнего из них, поэтому у меня сложилось впечатление, что он не будет работать с атрибутами manifest. На самом деле это так.

4

Почему он пытается слиться с оригинальным манифестом вообще, когда я указал, что он должен искать в другом месте?

Вы сказали, что аромат манифест находится в другом месте. Проявляется процесс слияния объединяет все соответствующие манифестов:

  • main
  • тип сборки
  • аромат продукта (ов)
  • библиотеки

проявляется в main всегда актуален.

И как я могу остановить это?

Это не так, поскольку манифест в main всегда имеет значение.

Лучшее решение, в общем-то, чтобы избавиться от versionCode и versionName от всех манифестов, и установить их в build.gradle, где у вас есть полный программный контроль.

Следующее лучшее решение - переместить versionCode и versionName из main манифеста в аромат продукта, который вы здесь не показываете. Я никогда не видел, чтобы кто-то создавал только один аромат продукта, поскольку AFAIK бессмысленно —, вы можете только когда-либо создавать этот один вкус продукта (поскольку AFAIK без ароматных сборок нет, как только вы вводите ароматы). Ароматизаторы продукта обычно входят в группы по 2+ (например, аромат google, который использует Play Services и аромат 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 для этой разработки, для множества хороших (хотя и менее хороших с течением времени) причин. –

Смежные вопросы