アプリには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を取得するにはどうすればよいですか?
ありがとう
現在のフレーバー名を正確に返す以下の関数を開発しました。
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を直接取得する方法はありません。次に、上記で定義したgetCurrentFlavor関数を使用して、次のようにgradle関数を開発しました。
def getCurrentApplicationId() {
def currFlavor = getCurrentFlavor()
def outStr = ''
Android.productFlavors.all{ flavor ->
if( flavor.name==currFlavor )
outStr=flavor.applicationId
}
return outStr
}
ほら.
これを使う
${variant.getFlavorName()}.apk
ファイル名の出力をフォーマットする
これは私が少し前に使用したものです。私はそれがまだ最新の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")
}
}
これを使用する必要があります、${variant.productFlavors[0].name}
、それはproductFlavors IDEとコマンドラインの両方を取得します。
私の解決策は、gradleの入力パラメータを解析することでした。
Gradle gradle = getGradle()
Pattern pattern = Pattern.compile(":assemble(.*?)(Release|Debug)");
Matcher matcher = pattern.matcher(gradle.getStartParameter().getTaskRequests().toString());
println(matcher.group(1))
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=")[^"]?/
私のフレーバーには大文字が入っているので、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 ""
}
}
つかいます:
${variant.baseName}.apk"
現在のフレーバー名を返します
完全な回答
Android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.baseName}.apk"
}
}
gradle.startParameter.taskNames[0]
を使用できます