Как настроить имя файла APK для вкусов продуктов?

Я настраиваю имя APK-файла моего приложения для Android в сценарии build.gradle следующим образом:

android {
    defaultConfig {
        project.ext.set("archivesBaseName", "MyApplication");
    }
}

Теперь, когда я использую ароматизаторы продукта:

android {
    productFlavors {
        green {
            applicationId "com.example.myapplication.green"
        }

        blue {
            applicationId "com.example.myapplication.blue"
        }
    }
}

Есть ли способ настроить имя каждого APK? Я безуспешно экспериментировал с archiveBaseName и baseName. В итоге хочу получить следующие файлы:

build/outputs/apk/Blue-debug-1.2.1.apk
build/outputs/apk/Blue-debug-unaligned.apk
build/outputs/apk/Blue-release-1.2.1.apk
build/outputs/apk/Blue-release-unaligned.apk
build/outputs/apk/Green-debug-1.2.1.apk
build/outputs/apk/Green-debug-unaligned.apk
build/outputs/apk/Green-release-1.2.1.apk
build/outputs/apk/Green-release-unaligned.apk



Ответы (12)


Попробуйте поместить это в закрытие build.gradle для Android.

buildTypes {
    debug {
        // debug buildType specific stuff
    }
    release {
        // release buildType specific stuff
    }
    applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release") &&
            variant.productFlavors[0].name.equals("green") &&
            variant.zipAlign) {
                def apk = variant.outputFile;
                variant.outputFile = new File(apk.parentFile, "green.apk");
        } else if(variant.buildType.name.equals("release") &&
            variant.productFlavors[0].name.equals("blue") &&
            variant.zipAlign) {
                def apk = variant.outputFile;
                variant.outputFile = new File(apk.parentFile, "blue.apk");
        }
    }
}

Теперь выходные данные должны быть такими, как green.apk и blue.apk.

person Lakshman Chilukuri    schedule 04.08.2014
comment
Почему вы проверяете название вкуса продукта, если вы все равно делаете то же самое и для freeflavor, и для proflavor? Что я действительно хочу, так это изменить имя модуля, как в вашем примере, а не добавлять что-то. - person JJD; 05.08.2014
comment
Тем не менее: по какой причине у вас есть два блока if, как я уже спрашивал ранее? - person JJD; 05.08.2014
comment
Да. Здесь он не служит особой цели и может быть дополнительно упрощен. - person Lakshman Chilukuri; 05.08.2014
comment
Круглые скобки оператора if не завершены... Хотя даже их размещение не имеет для меня никакого значения - person Quintin Balsdon; 17.05.2016
comment
Это не сработало, отсутствует парен и, по-видимому, несовместимо с плагином для Android? Я получал сообщение об ошибке о неопределенном атрибуте outputFile. Смотрите мой ответ ниже, который показывает, как я это исправил. - person William T. Mallard; 09.07.2017

Это поможет вам в 2021 году.

android {
    
//........
flavorDimensions "version"
productFlavors {
    Free {
        dimension "version"
        applicationId "com.exampleFree.app"
    }
    Paid {
        dimension "version"
        applicationId "com.examplePaid.app"
    }
}

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def appId = variant.applicationId// com.exampleFree.app OR com.examplePaid.app
        def versionName = variant.versionName
        def versionCode = variant.versionCode // e.g 1.0
        def flavorName = variant.flavorName // e. g. Free
        def buildType = variant.buildType.name // e. g. debug
        def variantName = variant.name // e. g. FreeDebug

        //customize your app name by using variables
        outputFileName = "${variantName}.apk"
    }
}}

Имя приложения FreeDebug.apk

Доказательство введите здесь описание изображения

введите здесь описание изображения

person Happy Singh    schedule 03.01.2020
comment
У меня не работает, ничего не делает. Я добавил println outputFileName, и он печатается правильно, но по какой-то причине gradle не использует значение outputFileName для имени файла. Кстати, я пытаюсь использовать его для пакета приложений, а не для APK. - person thiagolr; 18.01.2020

Для Android Gradle Plugin 0.13.+ вы должны использовать что-то вроде этого:

android{
    buildTypes {
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def apk = output.outputFile;
                def newName = "mysms-" + variant.baseName.replace("-release", "") + "-" + defaultConfig.versionName + ".apk";
                output.outputFile = new File(apk.parentFile, newName);
            }
        }
    }
}
person notz    schedule 01.10.2014
comment
Это перестало работать в Android Gradle 3.0.0-alpha1. Кажется, вы больше не можете получить доступ к outputFile. - person Sky Kelsey; 20.05.2017
comment
Действительно полезно, если вы не хотите обновлять свою версию Gradle! - person AtomicBoolean; 18.02.2019

Для Android Studio 3.0 вы должны перейти с:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = new File(output.outputFile.parent, "whatever" + ".apk")
    }
}

To:

android.applicationVariants.all { variant ->
        variant.outputs.all { 
            outputFileName = "whatever" + ".apk")
    }
}
person J.Stange    schedule 26.10.2017

Я сделал это так:

productFlavors {
        production {
            applicationId "com.example.production"
        }

        staging {
            applicationId "com.example.production.staging"

        }

        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                if(variant.productFlavors[0].name.equals("staging")){
                    output.outputFile = new File(output.outputFile.parent,
                            output.outputFile.name.replace("app-staging-release",  "test"));

                }else{
                    output.outputFile = new File(output.outputFile.parent,
                            output.outputFile.name.replace("app-production-release",  "production"));
                }

            }
        }
    }
person user1252459    schedule 05.08.2015
comment
Что такое выходной файл?? - person IgorGanapolsky; 20.12.2018

Странно, что вам это нужно, потому что по умолчанию имя файла apk уже отличается.

Если вы посмотрите здесь в строке 1346 вы можете видеть, что variantData.variantConfiguration.baseName используется в outputFile.

variantData.outputFile = project.file("$project.buildDir/apk/${project.archivesBaseName}-${variantData.variantConfiguration.baseName}.apk")

И документация для baseName есть

/**
 * Full, unique name of the variant, including BuildType, flavors and test, dash separated.
 * (similar to full name but with dashes)
 */
private String mBaseName;

Таким образом, запуск gradle assembleFreeDebug должен дать вам файл ProjectName-free-debug.apk.

Но если это не так или вам нужно другое имя файла, вы можете использовать следующий код для его настройки.

android {
    buildTypes {
        debug {}
        alpha {}
        release {}
    }
    productFlavors {
        free{}
        paid{}
    }
    applicationVariants.all { variant ->
        def newApkName = variant.name + "my-custom-addition" + ".apk";
        variant.outputFile = new File("${project.buildDir}/outputs/apk/", newApkName);
    }
}
person Jelle    schedule 05.08.2014
comment
Почти готово. (1) По какой-то причине файлы -unaligned.apk в build/outputs/apk по-прежнему имеют префикс MyApplication. (2) Вариант не пишется с заглавной буквы. - person JJD; 08.08.2014
comment
Любая идея, как это сделать? - person JJD; 25.08.2014
comment
(1) В соответствии со строкой 1316 в ссылке BasePlugin.groovy вы можете изменить project.archivesBaseName и variantData.variantConfiguration.baseName, чтобы адаптировать имя невыровненного вывода. Но я уверен, что это не будет мешать другим шагам сборки. Тем не менее, вы не должны использовать невыровненную версию, а скорее окончательный apk (из которого вы можете полностью контролировать имя apk). (2) variant.name.capitalize() - person Jelle; 25.08.2014

Вот мой вариант (хех) ответа Лакшмана выше, не знаю, зачем мне понадобился «variants.outputs.each», но я это сделал.

defaultConfig {
    applicationId "my.company.com"
    minSdkVersion 16
    targetSdkVersion 25
    applicationVariants.all { variant ->
        if (variant.productFlavors[0].name.equals("VariantA")) {
            variant.outputs.each { output ->
                def apk = output.outputFile;
                output.outputFile = new File(apk.parentFile, "Blue.apk");
            }
        } else { // Only two variants
            variant.outputs.each { output ->
                def apk = output.outputFile;
                output.outputFile = new File(apk.parentFile, "Green.apk");
            }
        }
    }
}
person William T. Mallard    schedule 09.07.2017

Это то, что вам нужно

android {
    defaultConfig {
        ……

        // custom output apk name
        applicationVariants.all { variant ->
            variant.outputs.all {
                outputFileName = "${variant.productFlavors[0].name}-${variant.buildType.name}-${variant.versionName}.apk"
            }
        }
    }
    ……
}
person Trinea    schedule 09.10.2019
comment
спасибо ... это решило мое конкретное требование ... - person fida1989; 28.06.2021

Эта работа для меня:

Добавьте variant.productFlavors[0].name в название APK.

Пример кода:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.outputFile = new File(output.outputFile.parent, "APPNAME_" + variant.productFlavors[0].name + "_" + variant.versionName + ".apk")

            }
        }
    }
}
person Rui Correia    schedule 07.03.2017

Все ответы здесь одинаковы и устарели. Это легко сделать [аромат]-[версия]-[тип сборки]:

android {
    productFlavors {
        green {
            applicationId "com.example.myapplication.green"
            setProperty("archivesBaseName", "Green-" + defaultConfig.versionName)
        }

        blue {
            applicationId "com.example.myapplication.blue"
            setProperty("archivesBaseName", "Blue-" + defaultConfig.versionName)
        }
    }
}

Если ваше имя версии равно «1.2.1», запуск сборки gradle произведет:

Green-1.2.1-debug.apk

Green-1.2.1-release.apk

Blue-1.2.1-debug-apk

Blue-1.2.1-release.apk

person Daniel Wilson    schedule 24.03.2020

Плагин Android Gradle 0.13.0 устарел для outputFile, который используется в:

applicationVariants.all { variant ->
    def newApkName = variant.name + "my-custom-addition" + ".apk";
    variant.outputFile = new File("${project.buildDir}/outputs/apk/", newApkName);
}

Решение, которое работает для меня:

android {
... 
}

project.archivesBaseName = "AndroidAppGeneric-${_buildVersionNameForMaven}"
person GrecoJava    schedule 19.09.2014

Я использую следующее, чтобы файлы не переопределяли друг друга:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def newApkName = variant.name + "-" + variant.versionName + "(" + variant.versionCode +")" + ".apk";
        output.outputFile = new File("${project.projectDir}/outputs/apk/" + variant.name, newApkName);
    }
}
person Golan Shay    schedule 22.12.2016