18

フレーバー+ buildTypeに応じてbuildConfigVariableを定義しようとしています。理想的には、これは私が望むものです

productFlavors {
    strawberry {
        buildConfigField "String", "WS_API_KEY", name + variant.buildType.name
    }
    ... more flavors ..
}

nameには「strawberry」が含まれていますが、バリアントbuildTypeにアクセスできるかどうかはわかりません。

Androidクロージャーの外側に配置すると、 BuildTypevariantにアクセスできますが、呼び出すことはできませんbuildConfigField

android.applicationVariants.all { variant ->
    println "****************************"
    println "variant: ${variant.name}"
    println "flavor: ${variant.flavorName}"
    println "****************************"

    if (variant.buildType.name == 'release') {
        if (variant.flavorName == 'strawberry') {
            buildConfigField "String", "WS_API_KEY", '"strawberry_release"'
        } else {
            buildConfigField "String", "WS_API_KEY", '"chocolate_release"'
        }
    } else if(variant.buildType.name == 'debug') {
        if (variant.flavorName == 'strawberry') {
            buildConfigField "String", "WS_API_KEY", '"strawberry_debug"'
        } else {
            buildConfigField "String", "WS_API_KEY", '"chocolate_debug"'
        }
    }


****************************
variant: strawberryRelease
flavor: strawberry
****************************
org.gradle.api.internal.MissingMethodException: 
    Could not find method buildConfigField() 
    for arguments [String, WS_API_KEY, "strawberry_release"]

Java ファクトリを簡単に作成し、API_KEYいくつかの定数に応じて適切なものを返すことができますBuildConfigが、コード構成にとらわれないようにしたいと考えています。

4

2 に答える 2

16

Edit2: 0.14.2 以降のバージョンでは、これを行うことができます。

applicationVariants.all { variant ->
    variant.buildConfigField "int", "VALUE", "1"
}

したがって、次のようなことができます(元の質問と一致させるため):

applicationVariants.all { variant ->
    variant.buildConfigField "String", "WS_API_KEY", variant.productFlavors.get(0).name + '_' + variant.buildType.name
}

編集:現在不可能です。このための API がありません。バグ: https://code.google.com/p/android/issues/detail?id=67416

これを試して:

applicationVariants.all { variant ->
    variant.mergedFlavor.buildConfigField "String", "NAME", '"VALUE"'
}

于 2014-03-19T15:58:39.007 に答える
0

警告: これは脆弱なソリューションである可能性があります。自己責任で使用してください。https://code.google.com/p/android/issues/detail?id=67416を参照してください

これが私が望んでいたことを達成した方法です。タスクが実行される直前に値を変更する必要があるため、そこにコードをフックする方法が必要でした。

final projectName = project.name
gradle.taskGraph.beforeTask { Task task ->
    if (task.path ==~ /:$projectName:generate.*BuildConfig/) {
        //extracts flavor and buildType name. See http://stackoverflow.com/a/7594052/218473 for regex
        final values = task.name.replace("generate","").replace("BuildConfig","").split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")

        final flavorName = values[0].toLowerCase()
        final buildTypeName = values[1].toLowerCase()

        com.android.build.gradle.api.ApplicationVariant variant;
        android.applicationVariants.all { currentVariant ->
            if (currentVariant.getVariantData().getVariantConfiguration().getBuildType().getName() == buildTypeName) {
                if (currentVariant.getVariantData().getVariantConfiguration().getFlavorName() == flavorName) {
                    variant = currentVariant;
                }
            }
        }

        if(variant != null) {
            com.android.builder.internal.ClassFieldImpl apiKeyField
            if (flavorName == 'strawberry') {    
                if (buildTypeName == 'release') {
                    apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"strawberry_release"')
                } else {
                    apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"strawberry_debug"')
                }
            } else if (flavorName == 'chocolate') {                        
                if (buildTypeName == 'release') {
                    apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"chocolate_release"')
                } else {
                    apiKeyField = new com.android.builder.internal.ClassFieldImpl("String", "WS_API_KEY", '"chocolate_debug"')
                }
            }

            variant.getVariantData().getVariantConfiguration().getFlavorConfigs().get(0).addBuildConfigField(apiKeyField)
        }
    }
}

これが機能する理由を理解するには、AOSP ソース コードをダウンロードし、VariantConfiguration.getBuildConfigItems()を確認してください。

Xavier の回答を使用すると、MethodMissingError がスローされます。variant.mergedFlavor.addBuildConfigField()を使用するとエラーは発生しませんが、変数は追加されません。

于 2014-03-19T16:40:23.313 に答える