Как получить текущий аромат в gradle
У меня есть два продукта для моего приложения:
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/')
}
Как я могу получить FLAVOR_NAME в Gradle?
Спасибо
Ответы
Ответ 1
Как получить текущее название аромата
Я разработал следующую функцию, возвращая точно название текущего аромата:
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
в начале или в вашем script.
В Android Studio это работает путем компиляции с помощью кнопки "Сделать проект" или "Отладка приложения".
Как получить текущее приложение flavorId
Аналогичным вопросом может быть: как получить applicationId?
Также в этом случае нет прямого способа получить текущее приложение flavorId. Затем я разработал функцию gradle, используя указанную выше функцию getCurrentFlavor следующим образом:
def getCurrentApplicationId() {
def currFlavor = getCurrentFlavor()
def outStr = ''
android.productFlavors.all{ flavor ->
if( flavor.name==currFlavor )
outStr=flavor.applicationId
}
return outStr
}
Вуаля.
Ответ 2
Я использую это
${variant.getFlavorName()}.apk
отформатировать вывод имени файла
Ответ 3
вы должны использовать это, ${variant.productFlavors[0].name}
, он получит productFlavors как IDE, так и командную строку.
Ответ 4
Это то, что я использовал некоторое время назад. Я надеюсь, что он все еще работает с последним плагином 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")
}
}
Ответ 5
Мое решение заключалось в том, что для синтаксического анализа входных параметров gradle.
Gradle gradle = getGradle()
Pattern pattern = Pattern.compile(":assemble(.*?)(Release|Debug)");
Matcher matcher = pattern.matcher(gradle.getStartParameter().getTaskRequests().toString());
println(matcher.group(1))
Ответ 6
получить SELECTED_BUILD_VARIANT из .iml файла после завершения gradle синхронизации
Вы можете загрузить его с помощью синтаксического анализатора xml или менее желательного, но, вероятно, быстрее реализовать это будет использовать регулярное выражение, чтобы найти его.
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="your_build_flavorDebug" />
...
(не проверено, что-то вроде этого:)
/(?=<name="SELECTED_BUILD_VARIANT".*value=")[^"]?/
Ответ 7
Я немного изменил ответ Poiana Apuana, поскольку мой вкус имеет некоторый капитальный характер.
ПРИЧИНА
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 ""
}
}
Ответ 8
Вы можете использовать gradle.startParameter.taskNames[0]
Ответ 9
Использование:
${variant.baseName}.apk"
Это возвращение текущего имени аромата
Полный ответ
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.baseName}.apk"
}
}
Ответ 10
Следующая команда заработает:
def flavor = android.productFlavors[0].name
Следующая команда будет печатать аромат:
println("Running flavor is " + flavor)