Приложение с несколькими ароматами на основе библиотеки с несколькими ароматами в Android Gradle
Мое приложение имеет несколько разновидностей для систем выставления счетов в приложениях.
У меня есть одна библиотека, которая разделяет базовый код для всех моих проектов. Поэтому я решил добавить эти платежные системы в эту библиотеку в качестве разновидностей продукта.
Вопрос в том, может ли библиотека Android иметь вкусы продукта?
Если так, как я могу включить различные ароматы в соответствующий аромат приложения?
Я много искал и ничего не мог найти по этому сценарию. Единственное, что я нашел, было в http://tools.android.com/tech-docs/new-build-system/user-guide:
dependencies {
flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}
Я изменил конфигурацию на разные вещи, но это не сработало!
Я использую Android Studio 0.8.2.
11 ответов
Наконец, я узнал, как это сделать, я объясню это здесь для других, сталкивающихся с той же проблемой:
Ключевой частью является установка для publishNonDefault значения true в библиотеке build.gradle. Затем необходимо определить зависимости в соответствии с рекомендациями руководства пользователя.
Весь проект будет выглядеть так:
Библиотека build.gradle:
apply plugin: 'com.android.library'
android {
....
publishNonDefault true
productFlavors {
market1 {}
market2 {}
}
}
проект build.gradle:
apply plugin: 'com.android.application'
android {
....
productFlavors {
market1 {}
market2 {}
}
}
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
Теперь вы можете выбрать вариант приложения и панель Build Variants, и библиотека будет выбрана соответствующим образом, и все сборки и запуск будут выполнены на основе выбранного варианта.
Если у вас есть несколько модулей приложения, основанных на библиотеке, Android Studio будет жаловаться на конфликт выбора вариантов, это нормально, просто проигнорируйте его.
Есть одна проблема с ответом Али. Мы теряем одно очень важное измерение в наших вариантах сборки. Если мы хотим иметь все параметры (в моем примере ниже 4 (2 x 2)), нам просто нужно добавить пользовательские конфигурации в основной файл build.gradle модуля, чтобы иметь возможность использовать все multi-flavor multi-buildType в Build Variants
, Мы также должны установить значение publishNonDefault в файле библиотеки build.gradle модуля модуля.
Пример решения:
Lib build.gradle
android {
publishNonDefault true
buildTypes {
release {
}
debug {
}
}
productFlavors {
free {
}
paid {
}
}
}
Приложение build.gradle
android {
buildTypes {
debug {
}
release {
}
}
productFlavors {
free {
}
paid {
}
}
}
configurations {
freeDebugCompile
paidDebugCompile
freeReleaseCompile
paidReleaseCompile
}
dependencies {
freeDebugCompile project(path: ':lib', configuration: 'freeDebug')
paidDebugCompile project(path: ':lib', configuration: 'paidDebug')
freeReleaseCompile project(path: ':lib', configuration: 'freeRelease')
paidReleaseCompile project(path: ':lib', configuration: 'paidRelease')
}
Обновление для Android Plugin 3.0.0 и выше
В соответствии с официальной документацией по Android - перенос конфигураций зависимостей для локальных модулей,
Благодаря разрешению зависимостей, зависящему от варианта, вам больше не нужно использовать специфичные для варианта конфигурации, такие как freeDebugImplementation, для локальных зависимостей модулей - плагин позаботится об этом за вас.
Вместо этого вы должны настроить свои зависимости следующим образом:
dependencies {
// This is the old method and no longer works for local
// library modules:
// debugImplementation project(path: ':library', configuration: 'debug')
// releaseImplementation project(path: ':library', configuration: 'release')
// Instead, simply use the following to take advantage of
// variant-aware dependency resolution. You can learn more about
// the 'implementation' configuration in the section about
// new dependency configurations.
implementation project(':library')
// You can, however, keep using variant-specific configurations when
// targeting external dependencies. The following line adds 'app-magic'
// as a dependency to only the "debug" version of your module.
debugImplementation 'com.example.android:app-magic:12.3'
}
Так что в ответе Али поменяй
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
в
implementation project(':lib')
И плагин позаботится о конкретных конфигурациях варианта автоматически. Надеюсь, что это поможет другим обновить плагин Android Studio до 3.0.0 и выше.
Мой плагин для Android - 3.4.0, и я обнаружил, что ему сейчас не нужны конфигурации. Все, что вам нужно, - убедиться, что в приложении flavourDimensions и productFlavors содержится один productFlavor с одинаковыми flavourDimensions и productFlavors. Например:
В build.gradle моей библиотеки
apply plugin: 'com.android.library'
android {
....
flavorDimensions "mylibFlavor"
productFlavors {
market1
market2
}
}
build.gradle приложения:
apply plugin: 'com.android.application'
android {
....
flavorDimensions "mylibFlavor", "appFlavor"
productFlavors {
market1 {
dimension "mylibFlavor"
}
market2 {
dimension "mylibFlavor"
}
common1 {
dimension "appFlavor"
}
common2 {
dimension "appFlavor"
}
}
}
dependencies {
....
implementation project(path: ':mylibrary')
}
После синхронизации вы можете переключить все параметры в окне Build Variants:
Я также столкнулся с проблемой компиляции модулей для различных опций.
Что я нашел:
Похоже, нам не нужно добавлять publishNonDefault true
в библиотеки build.gradle
файл, начиная с Gradle 3.0.1.
После декомпиляции класса BaseExtension
нашел это:
public void setPublishNonDefault(boolean publishNonDefault) {
this.logger.warn("publishNonDefault is deprecated and has no effect anymore. All variants are now published.");
}
И вместо:
dependencies {
...
Compile project(path: ':lib', configuration: 'config1Debug')
}
Мы должны использовать:
dependencies {
...
implementation project(':lib')
}
Единственная важная вещь, это добавить configurations {...}
часть к build.gradle
,
Итак, окончательный вариант приложения build.gradle
файл:
buildTypes {
debug {
...
}
release {
...
}
}
flavorDimensions "productType", "serverType"
productFlavors {
Free {
dimension "productType"
...
}
Paid {
dimension "productType"
...
}
Test {
dimension "serverType"
...
}
Prod {
dimension "serverType"
...
}
}
configurations {
FreeTestDebug
FreeTestRelease
FreeProdDebug
FreeProdRelease
PaidTestDebug
PaidTestRelease
PaidProdDebug
PaidProdRelease
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':lib')
...
}
Также вы можете использовать варианты фильтров, чтобы ограничить варианты сборки.
Ps не забудьте включить модули в settings.gradle
файл, как:
include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')
Чтобы заставить разновидности работать с библиотекой AAR, вам нужно определить defaultPublishConfig в файле build.gradle вашего модуля библиотеки Android.
Для получения дополнительной информации см.: Публикация библиотеки.
Публикация библиотеки
По умолчанию библиотека публикует только свой вариант выпуска. Этот вариант будет использоваться всеми проектами, ссылающимися на библиотеку, независимо от того, какой вариант они создают сами. Это временное ограничение из-за ограничений Gradle, над которыми мы работаем. Вы можете контролировать, какой вариант будет опубликован:
android {defaultPublishConfig "debug"}
Обратите внимание, что это имя конфигурации публикации ссылается на полное имя варианта. Выпуск и отладка применимы только в том случае, если нет вариантов. Если вы хотите изменить опубликованный вариант по умолчанию при использовании ароматов, вы должны написать:
android {defaultPublishConfig "flavour1Debug" }
Я знаю, что эта тема была закрыта, но только обновление с Gradle 3.0, посмотрите это: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html и grep matchingFallbacks
а также missingDimensionStrategy
, Теперь стало проще объявить зависимости между разновидностями модулей.
... и в этом точном случае с gradle 3.0, поскольку ароматы имеют одно и то же имя, gradle волшебным образом отобразит их, конфигурация не требуется.
На данный момент это невозможно, хотя, если я правильно помню, это функция, которую они хотят добавить. (Изменить 2: ссылка, ссылка2)
Изменить: на данный момент я использую defaultPublishConfig
возможность объявить, какой вариант библиотеки будет опубликован:
android {
defaultPublishConfig fullRelease
defaultPublishConfig demoRelease
}
В этой ситуации. Как мне импортировать зависимость для конкретной сборки. Например: market1Common1Debug market1Common1DebugImplementation 'androidx.appcompat:1.2.0'
Для версий Gradle 3.0 и выше
Когда в вашем основном проекте используются модули или библиотечные модули (AAR), которые имеют размерности вкуса, ваше приложение не знает, какой из них использовать. Вы должны использовать missingDimensionStrategy в defaultConfig блоке build.gradle файла вашего приложения , чтобы указать аромат по умолчанию. Например :
missingDimensionStrategy 'dimension', 'flavor1', 'flavor2'
Пожалуйста, проверьте эту ссылку для получения более подробной информации.
Вы также можете использовать это для компиляции, зависящей от флейвора:
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.+'
}