«App-release.apk» как изменить это сгенерированное по умолчанию имя apk

155

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

Можем ли мы сделать какие-либо настройки, чтобы он запрашивал и спрашивал имя, которое нужно присвоить apk (как это происходит в eclipse)

Что я делаю - переименовываю apk после того, как он сгенерирован. Это не дает никаких ошибок, но есть ли какой-либо подлинный способ, чтобы я мог внести любые изменения в настройки, чтобы получить приглашение.

Заметка::

во время генерации apk android studio выдает подсказку для выбора местоположения (только)введите описание изображения здесь

Prabs
источник
1. изменить версию сборки в выпуск 2. выбрать build-> создать подписанный apk из строки меню. Таким образом я
создаю
Все ответы здесь не верны .. Эта проблема все еще будет возникать при использовании любого из них ... Проблема заключается в том, что студия кэширует имя артефакта apk, и продолжайте использовать кэшированное имя вместо использования нового сгенерированного!
TacB0sS

Ответы:

142

Да, мы можем изменить это, но с большим вниманием

Посмотри это

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

    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 property в build.gradle и не забудьте синхронизировать gradle перед запуском проектов. Надеюсь, это решит вашу проблему :)

Новый подход к решению этой проблемы был недавно добавлен обновлением Google. Теперь вы можете переименовать свою сборку в соответствии с выходом версии или варианта // Ниже приведен источник из документации разработчика Android. Для получения более подробной информации перейдите по ссылке выше на документацию.
Использование Variant API для управления вариантами вывода не работает. с новым плагином. Он по-прежнему работает для простых задач, таких как изменение имени 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 bundle На этот вопрос хорошо ответил David Medenjak

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» вместо отформатированной даты
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 пересоберите проект или один раз закройте андроид студию и удалите выходную папку из каталога сборки, а затем пересоберите проект или попробуйте очистить его. Надеюсь, это может помочь вам
Abhishek Chaubey
4
Начиная с Android Studio 3.0 output.outputFile доступен только для чтения. Ответ @ johnny-doe - новое решение.
Криш
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. Спасибо.
Криш
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 { }синтаксис
Джонни 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

ranma2913
источник
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вы получите имя проекта, как в eclipse.
Хирен Дабхи,
3
Начиная с Android Studio 3.0 output.outputFileтолько для чтения. Ответ @ johnny-doe - новое решение.
Криш
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 (flavour == "dev" || buildType = "debug")
Тони БенБрахим
«все» вместо «каждый» кажется здесь важным.
Ксан-Кун Кларк-Дэвис
Выдает ошибку > 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
Хосейн Хакикян
39

Вот гораздо более короткий путь:

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 по умолчанию добавляет versionNameSuffix по имени типа сборки, если вы хотите переопределить это, сделайте следующее:

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

Вывод в режиме отладки: com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk

Anrimian
источник
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 .

KURSOR
источник
4

добавить android.applicationVariants.allблок, как показано ниже в вашем Gradle уровня приложения

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

Loyea
источник
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 варианта в моем приложении, и поэтому я хотел, чтобы каждый релиз был назван соответствующим образом в соответствии с каждым из них.

Приведенный ниже код будет помещен в файл сборки модуля, который находится в:

{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

Надеюсь, это кому-нибудь пригодится.

Для получения дополнительной информации см. Другие ответы, упомянутые в вопросе.

CYBEX
источник
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'
    }
}
Black_Dreams
источник