Как перечислить все варианты в buildConfig через Gradle в Android

Это простой gradle с тремя разновидностями:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.apipas.app.listallflavor"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {

        au {
            applicationId 'com.apipas.app.listallflavor.au'
            resConfigs 'en-rAU'
        }
        es {
            applicationId 'com.apipas.app.listallflavor.es'
            resConfigs 'es'
        }

        de {
            applicationId 'com.apipas.app.listallflavor.de'
            resConfigs 'de'
        }

    }
    productFlavors.all {
        flavor ->
            println( flavor.name)
            buildConfigField 'String', 'var_'+flavor.name, '\"'+flavor.name+'\"'
    }
}

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

BuildConfig.java - это:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com.apipas.app.listallflavor;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.apipas.app.listallflavor.au";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "au";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from product flavor: au
  public static final String var_au = "au";
}

Что я ожидал:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com.apipas.app.listallflavor;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.apipas.app.listallflavor.au";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "au";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from product flavor: au
  public static final String var_au = "au";
  public static final String var_de = "de";
  public static final String var_es = "es";
}

Странная вещь, что я вижу все ароматы в журналах: au de es

но у меня нет полей в buildConfig для 'de' и 'es', как я ожидал... есть подсказка, ребята?

3 ответа

Решение
  productFlavors.all {
        flavor ->
            defaultConfig.buildConfigField 'String', 'var_'+flavor.name, '\"'+flavor.name+'\"'
    }

Вы видите этот файл, потому что в вашей IDE (я думаю, Android Studio) вы выбираете вариант сборки AuDebug, Если вы хотите увидеть другой вариант. Вы можете выбрать Build -> Select Build Variant... затем выберите, какой вариант вы хотите построить. Затем пересоберите, и вы увидите изменение файла BuildConfig.

Каждый BuildConfig генерируется на основе каждого варианта (разновидность и тип сборки). Вы можете увидеть свой BuildConfig в [каталоге вашего приложения]/[вашем приложении]/build/generate /source/[вашем вкусе]/[типе вашей сборки]/[вашем пакете]/BuildConfig.java

Я понял, как это решить.. спасибо Пи Винчи

решение зациклить все варианты для каждого варианта и использовать ссылки на варианты, чтобы установить buildConfig

код внутри Android в Gradle:

applicationVariants.all { variant ->
    android.productFlavors.all {
        flavor ->
            println(flavor.name)
            variant.buildConfigField 'String', 'var_' + flavor.name, '\"' + flavor.name + '\"'
    }
}

Основываясь на принятом решении, у меня есть слегка измененная версия, которая создает имена контентов в верхнем регистре, например

public static final String FLAVOR_BETA = "beta"; public static final String FLAVOR_DEV = "dev"; public static final String FLAVOR_PRODUCTION = "production";

 applicationVariants.all { variant ->
    android.productFlavors.all {
        flavor ->
            println(flavor.name)
            variant.buildConfigField 'String', 'FLAVOR_' + flavor.name.toUpperCase(), '\"' + flavor.name + '\"'
    }
}
Другие вопросы по тегам