"App-release.apk" como alterar esse nome do apk gerado padrão

155

Sempre que eu gerar um apk assinado no Android Studio, por padrão, ele recebe o nome de app-release.apk ...

Podemos fazer as configurações para que ele solicite e me pergunte o nome que precisa ser atribuído ao apk (da mesma forma que no eclipse)

O que eu faço é - renomeie o apk depois que ele foi gerado. Isso não gera erros, mas existe alguma maneira genuína para que eu possa fazer alterações nas configurações para obter um prompt.

Nota::

ao gerar o apk, o android studio está me dando uma solicitação para selecionar o local (apenas)insira a descrição da imagem aqui

Prabs
fonte
1. altere o variante de compilação para liberar 2. selecione compilar-> gerar apk assinado na barra de menus. Desta forma, estou gerando apk assinado
Prabs
Todas as respostas aqui não estão corretas. Esse problema ainda ocorrerá usando qualquer um deles ... O problema é o estúdio armazenar em cache o nome do artefato apk e continuar usando o nome em cache em vez de usar o novo gerado!
TacB0sS

Respostas:

142

Sim, podemos mudar isso, mas com um pouco mais de atenção

Veja isso

Agora adicione isso no seu build.gradle no seu projeto enquanto certifica-se de que você tenha verificado a variante de compilação do seu projeto, release or Debug assim, aqui eu configurei minha variante de compilação, releasemas você pode selecionar como Debug também.

    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)
                        )
                    }
                }
            }
        }

Você pode fazê-lo com uma abordagem diferente como esta

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

Usando o método Set property no build.gradle e Não se esqueça de sincronizar o gradle antes de executar os projetos. Espero que ele resolva o seu problema :)

Uma nova abordagem para lidar com isso somado recentemente pelo Google Update Agora você pode renomear a sua construção de acordo com o sabor ou saída Variant // Abaixo fonte é de documentação Android Developer Para mais detalhes siga o link documentação acima
Usando a API Variant para manipular saídas variante é quebrado com o novo plugin. Ele ainda funciona em tarefas simples, como alterar o nome do APK durante o tempo de compilação, conforme mostrado abaixo:

// 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"
    }
}

Renomeando pacote .aab Isso é bem respondido por 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
}

Existe a necessidade do código acima

O que eu observei na versão mais recente do android studio 3.3.1

A renomeação do pacote .aab é feita pelo código anterior, não requer que nenhuma tarefa renomeie tudo.

Espero que ajude vocês. :)

Abhishek Chaubey
fonte
então use a corda lá no como "Abhishek Chaubey" instaed de formattedDate
Abhishek Chaubey
É possível adicionar de versionNamealguma forma?
Zygimantus 02/10
@AbhishekChaubey Não consigo mais executar o código no Android Studio depois de alterar o nome do apk, tem alguma ideia? por favor me ajude ... mostraThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Beeing Jk 04/10
@BeeingJk reconstruir o projeto ou uma vez perto do estúdio android e pasta de saída de exclusão do diretório de compilação e depois reconstruir o projeto ou experimentá-lo por limpar .hope pode ajudá-lo
Abhishek Chaubey
4
A partir do Android Studio 3.0, output.outputFile é somente leitura. A resposta de @ johnny-doe é a nova solução.
krishh
79

Você pode obter o erro com o mais recente plugin do Android Gradle ( 3.0 ):

Não é possível definir o valor da propriedade somente leitura 'outputFile'

De acordo com o guia de migração , devemos usar a seguinte abordagem agora:

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

Nota 2 principais alterações aqui:

  1. allé usado agora em vez de eachiterar sobre as saídas variantes.
  2. outputFileName A propriedade é usada em vez de alterar uma referência de arquivo.
Johnny Doe
fonte
1
Agora, esta é a resposta correta de outubro de 2017 para o Android Studio 3.0 Beta 7. Obrigado.
krishh
3
No meu caso ${applicationName}resolvido para BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(abreviado para maior clareza). Isso causou falha na embalagem. Para mim ${applicationId}ou ${archivesBaseName}eram melhores opções. Também ${defaultConfig.versionName}para mim é nulo. Então ${applicationId}_${variant.name}-${variant.versionName}foi assim que eu acabei.
pcdev 29/12/19
1
@KGCybeX Normalmente, este código é usado na android{}seção no mesmo nível que defaultConfig{}. Embora, você pode usá-lo fora do android{}usando android.applicationVariants.all { }a sintaxe
Johnny Doe
1
Você é um salva-vidas;)
Rik van Velzen
1
Trabalho em Gradle 5.1.1
Williaan Lopes 27/07/19
53

Modifiquei a resposta do @Abhishek Chaubey para alterar o nome completo do arquivo:

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 {
    }
}

Isso produz um nome de arquivo como: MyAppName-release20150519121617.apk

ranma2913
fonte
3
Como você adicionar uma variável em Gradle
Mehdiway
1
Para adicionar uma propriedade 'appName' personalizada, adicione um código como este ao seu projeto raiz: project.ext { appName = 'MyApplicatioName' }
miha
2
@ ranma2913 Não consigo mais executar o código no Android Studio depois de alterar o nome do apk, tem alguma ideia? ajude ... mostra O arquivo APK /Users/.../outputs/apk/NewName-debug-20161004172815.apk não existe no disco.
Beeing Jk
1
Em vez de definir manualmente MyAppName, rootProject.namevocê fornecerá o nome do projeto como no eclipse.
Hiren Dabhi
3
A partir do Android Studio 3.0 output.outputFileé somente leitura. A resposta de @ johnny-doe é a nova solução.
krishh
50

(EDITADO para funcionar com o Android Studio 3.0 e Gradle 4)

Eu estava procurando uma opção de renomeação de nome de arquivo apk mais complexa e escrevi essa solução que renomeia o apk com os seguintes dados:

  • sabor
  • tipo de construção
  • versão
  • encontro

Você obteria um apk como este: myProject_dev_debug_1.3.6_131016_1047.apk .

Você pode encontrar toda a resposta aqui . Espero que ajude!

No 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)
        }
    }
}
Fer
fonte
2
ótimo. Somente a melhoria a ser feita é um nome de arquivo constante (sem versão ou data) para alguns tipos ou buildType (flavor == "dev" || buildType = "debug") #
Tony BenBrahim 10/16/16
o "tudo" em vez de "cada" parece importante aqui.
Xan-Kun Clark-Davis
Dá erro > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData. Por que não simplesmente mudar para buildType = variant.buildType.name?
soshial 18/06
diz"file.apk" is not writeable
Hosein Haqiqian
38

Aqui está uma maneira muito mais curta:

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

Ele fornece o nome com.blahblah.example-v1 (1.0) -debug.apk (no modo de depuração)

O Android Studio adiciona versionNameSuffix por nome do tipo de compilação por padrão; se você deseja substituir isso, faça o seguinte:

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

Saída no modo de depuração: com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk

Anrimian
fonte
3
Obrigado. Esta é a opção mais rápida!
John John
1
Nota lateral: você pode adicionar archiveBaseName ao seu arquivo local gradle.properties.
Ge3ng 23/08/18
Parece realmente mais claro. Por que essa não é a solução preferida?
Xan-Kun Clark-Davis
6

Eu escrevi uma solução mais universal com base na resposta @Fer.

Ele também deve funcionar com a configuração sabor e tipo de compilação base de applicationId, versionName,versionCode .

No 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)
        }
    }
}

Exemplo do nome do apk: com.example.app_freeDebug_1.0_1.apk

Para mais informações sobre variantvariável ver ApkVariant e BaseVariant definição interfaces.

KursoR
fonte
4

adicione android.applicationVariants.allbloco como abaixo em seu nível de aplicativo

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'
        }
    }

disponível em 25/03/2019

Loyea
fonte
3

Não renomeá-lo, mas talvez gerar o nome corretamente em primeiro lugar ajudaria? Alterar nome do apk com Gradle

bryan
fonte
2

Primeiro renomeie seu módulo do aplicativo para ie SurveyApp

Segundo, adicione-o ao seu nível superior do projeto (projeto raiz). Está trabalhando com o 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"
                }
            }
        }
    }
}
Qamar
fonte
2

Adicione o seguinte código em build.gradle (Módulo: app)

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)
                }
            }
        }
    }
}

E o nome da versão do lançamento será Seu nome do aplicativo 2018-03-31 12-34

Vinil Chandran
fonte
1

Minha solução também pode ser útil para alguém.

Testado e funciona no IntelliJ 2017.3.2 com Gradle 4.4

Cenário:

Eu tenho dois sabores no meu aplicativo e, portanto, queria que cada release fosse nomeado adequadamente de acordo com cada sabor.

O código abaixo será inserido no arquivo de construção do módulo, encontrado em:

{app-root}/app/build.gradle

Código Gradle a ser adicionado ao android{ }bloco:

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
        }
    }
}

O acima fornece os seguintes APKs encontrados em {app-root}/app/:

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

Espero que possa ser útil para alguém.

Para mais informações, consulte outras respostas mencionadas na pergunta

CybeX
fonte
0

Eu acho que isso será útil.

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
fonte