web-dev-qa-db-ja.com

Gradleで現在のフレーバーを取得する方法

アプリには2つの製品フレーバーがあります。

productFlavors {
    europe {
        buildConfigField("Boolean", "BEACON_ENABLED", "false")
    }

    usa {
        buildConfigField("Boolean", "BEACON_ENABLED", "true")
    }
}

次に、パスを変更するタスク内で現在のフレーバー名(Android Studio)で選択したもの)を取得します。

task copyJar(type: Copy) {
from('build/intermediates/bundles/' + FLAVOR_NAME + '/release/')

GradleでFLAVOR_NAMEを取得するにはどうすればよいですか?

ありがとう

41
Giulio Bider

現在のフレーバー名を取得する方法

現在のフレーバー名を正確に返す以下の関数を開発しました。

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if( tskReqStr.contains( "assemble" ) )
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher( tskReqStr )

    if( matcher.find() )
        return matcher.group(1).toLowerCase()
    else
    {
        println "NO MATCH FOUND"
        return "";
    }
}

あなたも必要です

import Java.util.regex.Matcher
import Java.util.regex.Pattern

冒頭またはスクリプト。 Android Studioでは、[プロジェクトの作成]または[アプリのデバッグ]ボタンでコンパイルすることで機能します。

現在のビルドバリアントを取得する方法

def getCurrentVariant() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find()){
        return matcher.group(2).toLowerCase()
    }else{
        println "NO MATCH FOUND"
        return "";
    }
}

現在のフレーバーapplicationIdを取得する方法

同様の質問は、applicationIdを取得する方法ですか?また、この場合、現在のフレーバーapplicationIdを直接取得する方法はありません。次に、上記で定義したgetCurrentFlavor関数を使用して、次のようにgradle関数を開発しました。

def getCurrentApplicationId() {
    def currFlavor = getCurrentFlavor()

    def outStr = ''
    Android.productFlavors.all{ flavor ->

        if( flavor.name==currFlavor )
            outStr=flavor.applicationId
    }

    return outStr
}

ほら.

62
Poiana Apuana

これを使う

${variant.getFlavorName()}.apk

ファイル名の出力をフォーマットする

12
Timtcng.sen

これは私が少し前に使用したものです。私はそれがまだ最新のGradleプラグインで動作していることを願っています。基本的に、すべてのフレーバーを反復処理し、達成しようとしているものに似た新しい出力ファイルを設定していました。

applicationVariants.all { com.Android.build.gradle.api.ApplicationVariant variant ->
    for (flavor in variant.productFlavors) {
        variant.outputs[0].outputFile = file("$project.buildDir/${YourNewPath}/${YourNewApkName}.apk")
    }
}
7
azertiti

これを使用する必要があります、${variant.productFlavors[0].name}、それはproductFlavors IDEとコマンドラインの両方を取得します。

7
Dartan Li

私の解決策は、gradleの入力パラメータを解析することでした。

Gradle gradle = getGradle()

Pattern pattern = Pattern.compile(":assemble(.*?)(Release|Debug)");
Matcher matcher = pattern.matcher(gradle.getStartParameter().getTaskRequests().toString());
println(matcher.group(1))
5
Nazar Ivanchuk

gradle同期が完了した後、.imlファイルからSELECTED_BUILD_VARIANTを取得します。XMLパーサーを使用して読み込むか、あまり望ましくありませんが、おそらくより高速に実装するには、正規表現を使用して検索します。

<facet type="Android" name="Android">
  <configuration>
    <option name="SELECTED_BUILD_VARIANT" value="your_build_flavorDebug" />
        ...

(テストされていない、このようなもの:)

/(?=<name="SELECTED_BUILD_VARIANT".*value=")[^"]?/
3
Nick

私のフレーバーには大文字が入っているので、Poiana Apuanaの答えを少し変更しました。

[〜#〜] reason [〜#〜]
gradle.getStartParameter().getTaskRequests().toString()には現在のフレーバー名が含まれていますが、最初の文字は大文字です。
ただし、通常、フレーバー名は小文字で始まります。そこで、最初の文字を小文字に変更することを強制しました。

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String taskReqStr = gradle.getStartParameter().getTaskRequests().toString()
    Pattern pattern
    if (taskReqStr.contains("assemble")) {
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    } else {
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
    }
    Matcher matcher = pattern.matcher(taskReqStr)
    if (matcher.find()) {
        String flavor = matcher.group(1)
        // This makes first character to lowercase.
        char[] c = flavor.toCharArray()
        c[0] = Character.toLowerCase(c[0])
        flavor = new String(c)
        println "getCurrentFlavor:" + flavor
        return flavor
    } else {
        println "getCurrentFlavor:cannot_find_current_flavor"
        return ""
    }
}
1
wonsuc

つかいます:

${variant.baseName}.apk"

現在のフレーバー名を返します

完全な回答

Android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.baseName}.apk"
    }
}
1
Ali Asadi

gradle.startParameter.taskNames[0]を使用できます

1
B3n