Как настроить gradle в Android Studio, чтобы предоставить два варианта с разными минимальными версиями SDK?

Проблема: мне нужны два варианта продукта: БЕСПЛАТНАЯ версия с рекламой и ПРО версия без рекламы. Для рекламы требуется Google Play с минимальным SDK 9, поэтому я установил его БЕСПЛАТНО, но я хочу, чтобы моя профессиональная версия имела минимальный SDK 8.

Сборка БЕСПЛАТНОЙ версии работает, а сборка ПРО - нет.

Я использую (стабильную) Android Studio 1.1.0.

Я настраиваю новый проект с пустой активностью (пример Hello World). Затем я изменил файл build.gradle (ниже), включив в него два варианта и зависимость компиляции, специфичную для FREE, а затем изменил файловую структуру, чтобы переместить файлы java и макета xml активности в структуры ароматов. Таким образом, проект имеет следующую файловую структуру:

 
app\src\
  free\
    java\com\sample\adexample\MainActivity.java  - This is Hello World.
    res\layout\activity_main.xml - This is the Hello World layout.
    res\values\strings.xml  - Unique Hello World string for free version.
    res\AndroidManifest.xml - This is a copy of the manifest in main.
  main\
    java\com\sample\adexample\ - empty
    res\layout\ - empty
    res\AndroidManifest.xml - This is the Hello World manifest.
  pro\
    java\com\sample\adexample\MainActivity.java  - This is Hello World.
    res\layout\activity_main.xml - This is the Hello World layout.
    res\values\strings.xml  - Unique Hello World string for free version.
    res\AndroidManifest.xml - This is a copy of the manifest in main.

Вот мой файл build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.sample.adexample"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        pro {
            applicationId "com.sample.adexample.pro"
            minSdkVersion 8
            versionName "1.0-Pro"
        }
        free {
            applicationId "com.sample.adexample.free"
            minSdkVersion 9
            versionName "1.0-Free"
            dependencies {
                compile 'com.google.android.gms:play-services:6.+'
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

Создание варианта freeDebug отлично работает. Но я получаю следующую ошибку при сборке proDebug:

    :app:processProDebugManifest
C:\Users\Jeff\AndroidStudioProjects\AdExample\app\src\main\AndroidManifest.xml:0:0 Error:
    uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library C:\Users\Jeff\AndroidStudioProjects\AdExample\app\build\intermediates\exploded-aar\com.google.android.gms\play-services\6.5.87\AndroidManifest.xml
    Suggestion: use tools:overrideLibrary="com.google.android.gms" to force usage

Есть ли способ выполнить требования?

Спасибо за ваше время.


person Jeff George    schedule 23.02.2015    source источник
comment
Я думаю, что у вас могут быть специфические зависимости. Снимите закрытие dependencies с free. Переместите этот compile 'com.google.android.gms:play-services:6.+' в существующую застежку dependencies и сделайте ее freeCompile вместо compile. Посмотрите, поможет ли это.   -  person CommonsWare    schedule 23.02.2015
comment
Это сработало! Большое тебе спасибо. Не могли бы вы скопировать свой комментарий в ответ?   -  person Jeff George    schedule 23.02.2015


Ответы (1)


Снимите закрытие dependencies с free. Переместите этот compile 'com.google.android.gms:play-services:6.+' в существующее закрытие dependencies и сделайте его freeCompile, а не compile.

Префикс в операторе compile — это то, как вы привязываете зависимости к вариантам сборки, а не используете их все время, как compile. Таким образом, debugCompile будет объявлять зависимость только для типа сборки debug, а freeCompile будет объявлять зависимость только для варианта продукта free.

Насколько я знаю, это должно работать для нескольких измерений ароматов, поэтому, если у вас есть зависимость, которая актуальна только для аромата bird (в одном измерении) и аромата free (в другом измерении), вы можете использовать freeBirdCompile 'com.skynyrd.lynyrd:raised-lighter:1.0.0', чтобы получить это.

person CommonsWare    schedule 23.02.2015