Как определить разные зависимости для разных вкусов продукта
Я конвертирую одно из своих приложений в Gradle и хотел бы использовать новые возможности сборки, чтобы иметь платный и бесплатный рекламный вариант.
Я хочу, чтобы только рекламная версия зависела от admob SDK.
Мой файл сборки выглядит так:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
}
apply plugin: 'android'
repositories {
mavenCentral()
}
android {
compileSdkVersion 18
buildToolsVersion "18.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 18
}
productFlavors {
Pro {
packageName "de.janusz.journeyman.zinsrechner.pro"
}
Free {
dependencies {
}
}
}
}
dependencies {
compile 'com.android.support:support-v4:18.0.+'
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
compile fileTree(dir: 'libs', include: '*.jar')
}
Есть ли способ настроить зависимость в бесплатной версии продукта, чтобы иметь свою собственную папку libs, которая объединена с основной папкой libs, которая содержит общие библиотеки для обоих вариантов?
Если это возможно, как бы я определил эту папку?
7 ответов
Для определения зависимости от вкуса вы можете использовать proCompile
вместо compile
в вашем разделе зависимости. Когда вы запускаете свойства gradle, вы получаете обзор автоматически созданных конфигураций.
Правильный файл сборки выглядит так:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
apply plugin: 'com.android.application'
repositories {
mavenCentral()
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 22
}
productFlavors {
pro {
packageName "de.janusz.journeyman.zinsrechner.pro"
}
free { }
}
}
dependencies {
compile 'com.android.support:support-v4:22.2.0'
freeCompile 'com.google.android.gms:play-services-ads:7.5.0'
}
Перенесемся в середину 2018 года. Вам нужно будет добавить flavorDimensions
,
android {
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "dimensionName"
productFlavors {
pro {
dimension "dimensionName"
}
free {
dimension "dimensionName"
}
}
}
dependencies {
implementation 'com.android.support:support-v4:22.2.0'
freeImplementation 'com.google.android.gms:play-services-ads:15.0.1'
}
Также обратите внимание:
Конфигурация 'compile' устарела и была заменена на 'реализация' и 'api'. Он будет удален в конце 2018 года. Для получения дополнительной информации см.: http://d.android.com/r/tools/update-dependency-configurations.html
Просто:
dependencies {
....
....
gradle.startParameter.getTaskNames().each { task ->
if(task.contains("free")) {
implementation 'com.google.android.gms:play-services-ads:17.2.0'
}
}
....
....
}
или просто:
FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Вам нужно вручную добавить конфигурацию для каждого аромата. пример
configurations {
proCompile
freeCompile
}
dependencies {
compile 'com.parse.bolts:bolts-tasks:1.3.0'
proCompile 'com.android.support:design:23.1.1'
freeCompile 'com.parse:parse-android:1.12.0'
}
Изменить: я рекомендую использовать один из других методов!
Альтернатива принятому ответу такова:
ext {
flavorType = ""
}
gradle.startParameter.getTaskNames().each { task ->
if(task.contains("flavor1")){
flavorType = "flavor1"
} else if (task.contains("flavor2")){
flavorType = "flavor2"
} else {
flavorType = "flavor3"
}
}
if(flavorType == 'flavor1' || flavorType == 'flavor2') {
compile 'com.android.support:support-v4:18.0.+'
}
Если вы используете Gradle с Kotlin, зависимости для пользовательских вариантов можно добавить следующим образом:
dependencies {
"freeImplementation"("com.google.android.gms:play-services-ads:7.5.0")
}
Этот способ будет работать в многомодульных проектах.
создайте файл Gradle сборки (например, build_flavor_config.gradle) и определите в нем свою конфигурацию следующим образом
android {
flavorDimensions 'resource_type'
productFlavors {
create("flavor1") {
dimension 'resource_type'
versionName "$app_version_name - flavor1"
}
create("flavor2") {
dimension 'resource_type'
versionName "$app_version_name - flavor2"
}
}
}
и примените этот файл Gradle для каждого модуля, который вам нужен, например, модуля приложения или функционального модуля, например:
apply from: rootProject.file("build_flavor_config.gradle")
после проекта синхронизации вы можете получить доступ к конкретным реализациям каждого варианта следующим образом:
flavor1Implementation("flavor1Library")
flavor2Implementation("flavor2Library")