"App-release.apk", як змінити цю породжену назву apk за замовчуванням


155

Щоразу, коли я генерую підписаний apk в Android Studio, він за замовчуванням дає ім'я як app-release.apk ...

Чи можемо ми зробити якісь налаштування, щоб він підказав і запитав мене ім’я, яке потрібно призначити apk (як це робиться в затемненні)

Що я роблю - перейменувати apk після його створення. Це не дає жодних помилок, але чи є справжній спосіб, щоб я міг змінити налаштування, щоб отримати підказку.

Примітка::

під час генерації apk android studio дає мені запит на вибір місця (лише)введіть тут опис зображення


1.change varient build to release 2.select build-> сформувати підписаний apk з панелі меню. Таким чином я
генерую

Усі відповіді тут невірні. Ця проблема все одно виникатиме за допомогою будь-якого з них ... Проблема полягає в тому, щоб студія кешувала назву артефакту apk і продовжувала використовувати кешоване ім'я замість використання створеного нового!
TacB0sS

Відповіді:


142

Так, ми можемо це змінити, але ще трохи уваги

ДивітьсяЦе

Тепер додайте це до свого build.gradle у своєму проекті, переконайтесь, що ви перевірили варіант складання вашого проекту, як release or Debug отже, ось я встановив мій варіант збірки як, releaseале ви також можете вибрати як налагодження.

    buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig getSigningConfig()
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        def date = new Date();
                        def formattedDate = date.format('yyyyMMddHHmmss')
                        output.outputFile = new File(output.outputFile.parent,
                                output.outputFile.name.replace("-release", "-" + formattedDate)
    //for Debug use output.outputFile = new File(output.outputFile.parent,
   //                             output.outputFile.name.replace("-debug", "-" + formattedDate)
                        )
                    }
                }
            }
        }

Ви можете зробити це з іншим підходом, як це

 defaultConfig {
        applicationId "com.myapp.status"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        setProperty("archivesBaseName", "COMU-$versionName")
    }

Використання методу Set властивості в build.gradle і не забудьте синхронізувати gradle перед запуском проектів Сподіваюся, що це вирішить вашу проблему :)

Новий підхід для вирішення цього питання, доданий нещодавно оновленням google. Тепер ви можете перейменувати свою збірку відповідно до смаку або варіанту виходу // Нижче джерело - з документації для розробників для android. Детальніше перейдіть за вищевказаним посиланням на документацію
Використання API Variant для маніпулювання варіантами виходів порушено з новим плагіном. Він все ще працює для простих завдань, таких як зміна назви APK під час збирання, як показано нижче:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

Перейменування набору .aab На це добре відповів Давід Медженак

tasks.whenTaskAdded { task ->
    if (task.name.startsWith("bundle")) {
        def renameTaskName = "rename${task.name.capitalize()}Aab"
        def flavor = task.name.substring("bundle".length()).uncapitalize()
        tasks.create(renameTaskName, Copy) {
            def path = "${buildDir}/outputs/bundle/${flavor}/"
            from(path)
            include "app.aab"
            destinationDir file("${buildDir}/outputs/renamedBundle/")
            rename "app.aab", "${flavor}.aab"
        }

        task.finalizedBy(renameTaskName)
    }
//@credit to David Medenjak for this block of code
}

Чи потрібен вище код

Що я спостерігав в останній версії андроїд-студії 3.3.1

Перейменування пакету .aab виконується попереднім кодом, там не потрібно перейменувати всі завдання.

Сподіваюся, це допоможе вам, хлопці. :)


тому використовуйте рядок там, як "Abhishek Chaubey", встановлений у форматіDate
Abhishek Chaubey

Чи можна versionNameякось додати ?
зигімантус

@AbhishekChaubey Я більше не можу запустити код через Android Studio після зміни назви apk, будь-яка ідея? будь ласка, допоможіть ... це показуєThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk

@BeeingJk відновити проект або коли - то близько андроїд студії і видалення папки виведення з каталогу збірки , а потім відновити проект або спробувати його очищення .hope це може допомогти вам
Абхішек Чаубі

4
Станом на Android Studio 3.0 output.outputFile читається лише для читання. @ ДЖОННІ-МЕ відповідь є новим рішенням.
криш

79

Можливо, ви отримаєте помилку з останнім плагіном Android gradle ( 3.0 ):

Неможливо встановити значення властивості лише для читання 'outputFile'

Згідно з посібником з міграції , зараз ми повинні використовувати наступний підхід:

applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${applicationName}_${variant.buildType.name}_${defaultConfig.versionName}.apk"
    }
}

Примітка 2 основних змін тут:

  1. allвикористовується зараз замість eachперебору варіантів виходів.
  2. outputFileName властивість використовується замість мутування посилання на файл.

1
Тепер це правильна відповідь жовтня 2017 року для Android Studio 3.0 Beta 7. Дякую.
krishh

3
У моєму випадку ${applicationName}вирішено BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(скорочено для ясності). Це спричинило збій упаковки. Для мене ${applicationId}або ${archivesBaseName}були кращі варіанти. Також ${defaultConfig.versionName}для мене це недійсне. Так ${applicationId}_${variant.name}-${variant.versionName}я і закінчив.
pcdev

1
@KGCybeX Зазвичай цей код використовується в android{}розділі на тому ж рівні, що і defaultConfig{}. Хоча ви можете використовувати його поза android{}використанням android.applicationVariants.all { }синтаксису
Johnny Doe

1
Ви рятувальник;)
Рік ван

1
Робота в Gradle 5.1.1
Вілліан Лопес

53

Я змінив відповідь @Abhishek Chaubey, щоб змінити ціле ім'я файлу:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-") //"MyAppName" -> I set my app variables in the root project
                newName = newName.replace("-release", "-release" + formattedDate)
                //noinspection GroovyAssignabilityCheck
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
    debug {
    }
}

Це створює ім’я файлу на зразок: MyAppName-release20150519121617.apk


3
Як додати змінну в Gradle
Mehdiway

1
Щоб додати спеціальну властивість "appName", додайте такий код у свій кореневий проект: project.ext { appName = 'MyApplicatioName' }
miha

2
@ ranma2913 Я не можу більше запускати код через Android Studio після зміни назви apk, будь-яка ідея? будь ласка, допоможіть ... це показує, що файл APK /Users/.../outputs/apk/NewName-debug-20161004172815.apk не існує на диску.
Beeing Jk

1
Замість того, щоб налаштувати MyAppName вручну, rootProject.nameдасть вам назву проекту, як у затемненні.
Хірен Дабхі

3
Станом на Android Studio 3.0 output.outputFileлише для читання. @ ДЖОННІ-МЕ відповідь є новим рішенням.
krishh

50

(РЕЄСТАНОВАНО для роботи з Android Studio 3.0 та Gradle 4)

Я шукав складніший варіант перейменування файлу apk, і написав це рішення, яке перейменовує apk із такими даними:

  • аромат
  • тип збірки
  • версія
  • дата

Ви отримаєте подібний apk: myProject_dev_debug_1.3.6_131016_1047.apk .

Ви можете знайти всю відповідь тут . Сподіваюся, це допомагає!

У build.gradle:

android {

    ...

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
        debug {
            minifyEnabled false
        }
    }

    productFlavors {
        prod {
            applicationId "com.feraguiba.myproject"
            versionCode 3
            versionName "1.2.0"
        }
        dev {
            applicationId "com.feraguiba.myproject.dev"
            versionCode 15
            versionName "1.3.6"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def project = "myProject"
            def SEP = "_"
            def flavor = variant.productFlavors[0].name
            def buildType = variant.variantData.variantConfiguration.buildType.name
            def version = variant.versionName
            def date = new Date();
            def formattedDate = date.format('ddMMyy_HHmm')

            def newApkName = project + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"

            outputFileName = new File(newApkName)
        }
    }
}

2
чудовий. Єдине вдосконалення - це постійне ім'я файлу (без версії чи дати) для деяких ароматів або buildType (смак == "dev" || buildType = "налагодження")
Tony BenBrahim

тут здається важливим "все" замість "кожного".
Ксан-Кун Кларк-Девіс

Помилка > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData. Чому б просто не змінити buildType = variant.buildType.name?
сошіал

там написано"file.apk" is not writeable
Хосейн Хакіцян

38

Ось набагато коротший спосіб:

defaultConfig {
    ...
    applicationId "com.blahblah.example"
    versionCode 1
    versionName "1.0"
    setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
    //or so
    archivesBaseName = "$applicationId-v$versionCode($versionName)"
}

Він дає вам ім'я com.blahblah.example-v1 (1.0) -debug.apk (у режимі налагодження)

Android Studio додайте версіюNameSuffix за назвою типу збірки за замовчуванням, якщо ви хочете це змінити, зробіть наступне:

buildTypes {
    debug {
        ...
        versionNameSuffix "-MyNiceDebugModeName"
    }
    release {
        ...
    }
}

Вихід у режимі налагодження: com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk


3
Дякую. Це найшвидший варіант!
Джон

1
Бічна примітка Ви можете додати archiveBaseName у свій локальний файл gradle.properties.
Ge3ng

Це справді здається більш зрозумілим. Чому це не є кращим рішенням?
Ксан-Кун Кларк-Девіс

6

Я написав більш універсальне рішення, засноване на відповіді @Fer.

Він також повинен працювати з ароматизатором і типу збірки конфігурацією на основі з applicationId, versionName, versionCode.

У build.gradle:

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def appId = variant.applicationId
            def versionName = variant.versionName
            def versionCode = variant.versionCode
            def flavorName = variant.flavorName // e. g. free
            def buildType = variant.buildType // e. g. debug
            def variantName = variant.name // e. g. freeDebug

            def apkName = appId + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk';
            output.outputFile = new File(output.outputFile.parentFile, apkName)
        }
    }
}

Приклад apk назва: com.example.app_freeDebug_1.0_1.apk

Для отримання додаткової інформації про variantзмінну див. Визначення інтерфейсів ApkVariant та BaseVariant .


4

додайте android.applicationVariants.allблок, як показано нижче, у ступінь рівня програми

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            lintOptions {
                disable 'MissingTranslation'
            }
            signingConfig signingConfigs.release
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${applicationId}_${versionCode}_${variant.flavorName}_${variant.buildType.name}.apk"
                }
            }
        }
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '_debug'
        }
    }

доступний з 2019/03/25



2

Спочатку перейменуйте свій модуль з програми на « SurveyApp»

По-друге, додайте це до ступеня верхнього рівня проекту (кореневого проекту). Він працює з Gradle 3.0

//rename apk for all sub projects
subprojects {
    afterEvaluate { project ->
        if (project.hasProperty("android")) {
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${project.name}-${variant.name}-${variant.versionName}.apk"
                }
            }
        }
    }
}

2

Додайте такий код у build.gradle (Модуль: додаток)

android {
    ......
    ......
    ......
    buildTypes {
        release {
            ......
            ......
            ......
            /*The is the code fot the template of release name*/
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def formattedDate = new Date().format('yyyy-MM-dd HH-mm')
                    def newName = "Your App Name " + formattedDate
                    output.outputFile = new File(output.outputFile.parent, newName)
                }
            }
        }
    }
}

І назва збірки випуску буде Ваше ім’я програми 2018-03-31 12-34


1

Моє рішення також може комусь допомогти.

Протестовано та працює на IntelliJ 2017.3.2 з Gradle 4.4

Сценарій:

У моїй програмі є 2 аромати, і тому я хотів, щоб кожен випуск був названий відповідним чином відповідно до кожного аромату.

Код нижче буде розміщений у вашому файлі збірки Gradle, знайденому у:

{app-root}/app/build.gradle

Код Gradle, який потрібно додати до android{ }блоку:

android {
    // ...

    defaultConfig {
        versionCode 10
        versionName "1.2.3_build5"
    }

    buildTypes {
        // ...

        release {
            // ...

            applicationVariants.all { 
                variant.outputs.each { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(output.outputFile.name, variant.flavorName + "-" + defaultConfig.versionName + "_v" + defaultConfig.versionCode + ".apk"))
                }
            }

        }
    }

    productFlavors {
        myspicyflavor {
            applicationIdSuffix ".MySpicyFlavor"
            signingConfig signingConfigs.debug
        }

        mystandardflavor {
            applicationIdSuffix ".MyStandardFlavor"
            signingConfig signingConfigs.config
        }
    }
}

Вище наведено такі APK-файли, знайдені в {app-root}/app/:

myspicyflavor-release-1.2.3_build5_v10.apk
mystandardflavor-release-1.2.3_build5_v10.apk

Сподіваюся, це може комусь корисно.

Для отримання додаткової інформації дивіться інші відповіді, згадані у питанні


0

Я думаю, що це буде корисно.

buildTypes {
    release {
        shrinkResources true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                project.ext { appName = 'MyAppName' }
                def formattedDate = new Date().format('yyyyMMddHHmmss')
                def newName = output.outputFile.name
                newName = newName.replace("app-", "$project.ext.appName-")
                newName = newName.replace("-release", "-release" + formattedDate)
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
}
productFlavors {
    flavor1 {
    }
    flavor2 {
        proguardFile 'flavor2-rules.pro'
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.