Соглашение об именах папок для gradle вариантов сборки

Я некоторое время боролся с gradle и создавал варианты.

У меня есть эти типы построения:

  • отладки
  • релиз

И эти вкусы:

  • бесплатно
  • заплатил

Как я могу определить уникальные ресурсы и активы для определенного варианта сборки, т.е. FreeDebug? Например, я хочу четыре разных имени приложения в зависимости от варианта сборки и другой значок для каждого варианта.

Ответ 1

Я боролся с той же проблемой. Сначала я использовал две ветки в моем исходном контроле, но это было болью, когда они синхронизировались. Gradle - очень гибкая система сборки, но соглашения по умолчанию не всегда достаточно. Вот как я, наконец, разрешил это в моей базе кода.

В итоге я получил, по существу, следующую структуру каталогов (упрощенную):

+ src
  + main
  | + res
  | | + values
  | |   - strings.xml
  | + java
  |    ...  
  + debug
  | + free
  | | + res
  | |   + values
  | |     - strings.xml
  | + paid
  |   + res
  |    + values
  |      - strings.xml
  + free
  | + res
  | | + values
  | |   - strings.xml
  | + java
  |    ...  
  + paid
    + res
    | + values
    |   - strings.xml
    + java
       ...  

В основной папке я держу все, что является общим для обоих вкусов. В бесплатной папке я сохраняю все, что уникально для бесплатной версии (то же самое для платных). Файлы в папке с ароматом будут наложены поверх основного.

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

Если я создал папку для отладки с той же структурой, что и папки с ароматом, она будет наложена поверх используемой в настоящее время папки с ароматом. Это привело к тому же debug-name для обоих вкусов, но мне нужны разные имена отладки в зависимости от вкуса. После некоторых исследований я придумал следующую модификацию моего файла сборки.

...

android {
    buildTypes {
        debug {
            ...
        }
        release {
            ...
        }
    }

    productFlavors {
        free {}
        paid {}
    }
}

android.applicationVariants.all { variant ->
    if (variant.buildType.name == "release") {
        ...
    }
    else if (variant.buildType.name == "debug") {
        switch (variant.name) {
            case "FreeDebug":
                variant.mergeResources.doFirst {
                    android.sourceSets.debug.setRoot("src/debug/free")
                }
                break;
            case "PaidDebug":
                variant.mergeResources.doFirst {
                    android.sourceSets.debug.setRoot("src/debug/paid")
                }
                break;
        }
    }
}

...

Теперь вариант сборки будет создан путем первого наложения следующих папок:

PaidRelease -> /src/main + /src/paid
PaidDebug   -> /src/main + /src/paid + /src/debug/paid

FreeRelease -> /src/main + /src/free
FreeDebug   -> /src/main + /src/free + /src/debug/free

Ответ 2

В соответствии с Gradle Sourcesets and Dependencies guide вы можете добавить новую папку src/freeDebug/res или src/paidRelease/res и т.д., чтобы настроить отдельные атрибуты для каждой сборки Вариант.

Ответ 3

Структура папок при создании вариантов сборки должна быть:

app
   |
   ->src
        |
        ->buildvariantname1(as defined in gradle)
                            |
                            ->java (follow the same structure here, as in main folder)
                            ->res (follow the same structure here, as in main folder)       

Теперь при выборе конкретного варианта, например buildVariantname1debug, будут выбраны изменения, записанные в папке res в этом варианте.

Имя приложения должно быть определено в файле string.xml под папкой res- > values, чтобы имя приложения получалось в зависимости от значения в xml в каждом варианте сборки. То же самое касается значков приложений.

Первое изображение показывает, как объявлять варианты сборки (ароматы с разными именами пакетов)
введите описание изображения здесь

Второе изображение показывает, как выглядит структура проекта, если вы хотите, чтобы каждый вкус имел другой код, чертежи и манифест. Имейте в виду, что MainActivity удаляется из основной папки, чтобы она существовала в каждом варианте сборки

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