Многофункциональное приложение, основанное на библиотеке с несколькими вкусами в 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.

Ответ 1

Наконец, я узнал, как это сделать, я объясню это для других, столкнувшихся с одной и той же проблемой:

Ключевой частью является установка 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')
}

Теперь вы можете выбрать панель приложения и панель "Готовые варианты", и библиотека будет выбрана соответствующим образом, и вся сборка и запуск будут выполняться на основе выбранного вкуса.

Если у вас есть несколько модулей приложений, основанных на библиотеке, Android Studio будет жаловаться на конфликт выбора варианта, это нормально, просто проигнорируйте его.

введите описание изображения здесь

Ответ 2

Есть одна проблема с ответом Ali. Мы теряем одно очень важное измерение в наших вариантах сборки. Если мы хотим иметь все параметры (в моем примере ниже 4 (2 x 2)), нам просто нужно добавить пользовательские конфигурации в файле main build build.gradle, чтобы иметь возможность использовать все мульти-вкусовые мульти -buildType в Build Variants. Мы также должны установить publishNonDefault true в файле build.gradle библиотечного модуля.

Пример решения:

Lib build.gradle

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}

App 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')

}

Ответ 3

Обновление для 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 и выше.

Ответ 4

Чтобы получить ароматы, работающие над библиотекой AAR, вам необходимо определить defaultPublishConfig в файле build.gradle вашего модуля библиотеки Android.

Для получения дополнительной информации см. Публикация библиотеки.

Публикация библиотеки

По умолчанию библиотека публикует только свой вариант выпуска. Этот вариант будут использоваться всеми проектами, ссылающимися на библиотеку, независимо от того, вариант они строят сами. Это временное ограничение из-за Gradle ограничения, которые мы делаем для удаления. Ты можешь контроль, какой вариант публикуется:

android {     defaultPublishConfig "debug" }

Обратите внимание, что это имя конфигурации публикации ссылается на полный вариант имя. Отпуск и отладка применимы только тогда, когда нет ароматизаторы. Если вы хотите изменить опубликованный вариант по умолчанию, пока используя ароматы, вы должны написать:

android {     defaultPublishConfig "flavor1Debug" }

Ответ 5

На данный момент это невозможно, хотя, если я правильно помню его функцию, которую они хотят добавить. (Изменить 2: ссылка, ссылка2)

Изменить: На данный момент я использую параметр defaultPublishConfig, чтобы объявить, какой вариант библиотеки будет опубликован:

android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease 
}

Ответ 6

Я знаю, что этот вопрос был закрыт, но только обновление с gradle 3.0, см. это: https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware и grep matchingFallbacks и missingDimensionStrategy. Теперь проще описать зависимости между модульными атрибутами.

... и в этом конкретном случае с gradle3.0, так как ароматы имеют одно и то же имя, gradle отобразит их магически, нет необходимости в настройке.

Ответ 7

Я также столкнулся с проблемой компиляции модулей для различных опций.

Что я нашел:

Похоже, нам не нужно добавлять publishNonDefault true в файл lib 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.

Итак, последний вариант файла app 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')

Ответ 8

Вы также можете использовать это, чтобы иметь зависящие от вкуса компиляции:

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.+'
    }

Ответ 9

Мой плагин для 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: enter image description here