Подтвердить что ты не робот

Как получить текущий аромат в 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?

Спасибо

4b9b3361

Ответ 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)