„App-release.apk”, jak zmienić tę domyślną wygenerowaną nazwę apk

155

Za każdym razem, gdy generuję podpisany plik APK w Android Studio, domyślnie podaje on nazwę app-release.apk ...

Czy możemy wprowadzić jakiekolwiek ustawienia, aby monitował mnie i pytał o nazwę, którą należy przypisać do apk (tak jak w przypadku zaćmienia)

Robię to - zmień nazwę apk po jego wygenerowaniu. Nie powoduje to żadnych błędów, ale czy istnieje prawdziwy sposób, abym mógł wprowadzić zmiany w ustawieniach, aby uzyskać monit.

Uwaga::

podczas generowania apk android studio wyświetla monit o wybranie lokalizacji (tylko)wprowadź opis obrazu tutaj

Prabs
źródło
1. zmień wariant kompilacji na wydanie 2. wybierz kompilację-> wygeneruj podpisany apk z paska menu. W ten sposób
generuję
Wszystkie odpowiedzi są niepoprawne. Ten problem będzie nadal występował przy użyciu któregokolwiek z nich ... Problem polega na tym, że studio buforuje nazwę artefaktu apk i nadal używa nazwy z pamięci podręcznej zamiast używać nowej wygenerowanej!
TacB0sS

Odpowiedzi:

142

Tak, możemy to zmienić, ale z większą uwagą

Zobacz

Teraz dodaj to do swojego build.gradle w swoim projekcie, upewniając się, że sprawdziłeś wariant kompilacji swojego projektu, tak release or Debug więc tutaj ustawiłem mój wariant kompilacji jako, releaseale możesz również wybrać jako debugowanie.

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

Możesz to zrobić z innym podejściem, takim jak to

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

Użycie metody Set property w build.gradle i nie zapomnij zsynchronizować gradle przed uruchomieniem projektów Mam nadzieję, że to rozwiąże Twój problem :)

Nowe podejście do obsługi tego dodane niedawno przez Google update Możesz teraz zmienić nazwę swojej kompilacji zgodnie ze smakiem lub wyjściem wariantu // Poniższe źródło pochodzi z dokumentacji programisty Androida Aby uzyskać więcej informacji, skorzystaj z powyższego łącza do dokumentacji
Używanie interfejsu Variant API do manipulowania wyjściami wariantów jest uszkodzone z nową wtyczką. Nadal działa w przypadku prostych zadań, takich jak zmiana nazwy APK w czasie kompilacji, jak pokazano poniżej:

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

Zmiana nazwy pakietu .aab Na to ładnie odpowiedział 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
}

Czy potrzebny jest powyższy kod

Co zaobserwowałem w najnowszej wersji Android Studio 3.3.1

Zmiana nazwy pakietu .aab jest wykonywana przez poprzedni kod i nie wymaga zmiany nazwy zadania.

Mam nadzieję, że wam to pomoże. :)

Abhishek Chaubey
źródło
więc użyj ciągu w „Abhishek Chaubey” zamiast formattedDate
Abhishek Chaubey
Czy można versionNamejakoś dodać ?
zygimantus
@AbhishekChaubey Nie mogę już uruchomić kodu przez Android Studio po zmianie nazwy apk, jakiś pomysł? proszę o pomoc ... to widaćThe APK file /Users/.../outputs/apk/NewName-debug-20161004172815.apk does not exist on disk.
Bycie Jk
@BeeingJk odbuduj projekt lub raz zamknij studio android i usuń folder wyjściowy z katalogu kompilacji, a następnie odbuduj projekt lub wypróbuj go, czyszcząc. Mam nadzieję, że może ci to pomóc
Abhishek Chaubey
4
Od wersji wyjściowej Android Studio 3.0 plik wyjściowy jest tylko do odczytu. @ Johnny-Doe odpowiedź jest nowym rozwiązaniem.
krishh
79

Możesz otrzymać błąd z najnowszą wtyczką Gradle dla Androida ( 3.0 ):

Nie można ustawić wartości właściwości tylko do odczytu „outputFile”

Zgodnie z przewodnikiem po migracji powinniśmy teraz zastosować następujące podejście:

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

Uwaga 2 główne zmiany tutaj:

  1. alljest teraz używany zamiast eachiteracji po wariantach wyjść.
  2. outputFileName Właściwość jest używana zamiast mutowania odwołania do pliku.
Johnny Doe
źródło
1
To jest poprawna odpowiedź z października 2017 r. Dla Android Studio 3.0 Beta 7. Dzięki.
krishh
3
W moim przypadku ${applicationName}zdecydowano BuildType_Decorated{name=applicationName, debuggable=false, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscript...(skrócono dla jasności). Spowodowało to niepowodzenie pakowania. Dla mnie ${applicationId}lub ${archivesBaseName}były lepsze opcje. Również ${defaultConfig.versionName}dla mnie jest zerowe. Tak ${applicationId}_${variant.name}-${variant.versionName}właśnie skończyłem.
pcdev
1
@KGCybeX Zwykle ten kod jest używany w android{}sekcji na tym samym poziomie co defaultConfig{}. Chociaż możesz go używać poza android{}używaniem android.applicationVariants.all { }składni
Johnny Doe
1
Jesteś ratownikiem;)
Rik van Velzen
1
Praca w Gradle 5.1.1
Williaan Lopes
53

Zmodyfikowałem odpowiedź @Abhishek Chaubey, aby zmienić całą nazwę pliku:

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

Tworzy to nazwę pliku, taką jak: MyAppName-release20150519121617.apk

ranma2913
źródło
3
Jak dodać zmienną w Gradle
Mehdiway
1
Aby dodać niestandardową właściwość „nazwa_aplikacji”, dodaj taki kod do swojego projektu głównego: project.ext { appName = 'MyApplicatioName' }
miha
2
@ ranma2913 Nie mogę już uruchomić kodu przez Android Studio po zmianie nazwy apk, jakiś pomysł? proszę o pomoc ... pokazuje Plik APK /Users/.../outputs/apk/NewName-debug-20161004172815.apk nie istnieje na dysku.
Beeing Jk
1
Zamiast ustawiać ręcznie MyAppName, rootProject.namepoda nazwę projektu jak w eclipse.
Hiren Dabhi
3
Od wersji Android Studio 3.0 output.outputFilejest tylko do odczytu. @ Johnny-Doe odpowiedź jest nowym rozwiązaniem.
krishh
50

(ZMIENIONO do pracy z Android Studio 3.0 i Gradle 4)

Szukałem bardziej złożonej opcji zmiany nazwy pliku apk i napisałem to rozwiązanie, które zmienia nazwę apk z następującymi danymi:

  • smak
  • typ kompilacji
  • wersja
  • data

Otrzymasz taki apk: myProject_dev_debug_1.3.6_131016_1047.apk .

Pełną odpowiedź znajdziesz tutaj . Mam nadzieję, że to pomoże!

W pliku 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
źródło
2
świetny. Jedynym ulepszeniem do wprowadzenia jest stała nazwa pliku (bez wersji lub daty) dla niektórych smaków lub typu buildType (flavour == "dev" || buildType = "debug")
Tony BenBrahim
„wszystkie” zamiast „każdy” wydają się tutaj ważne.
Xan-Kun Clark-Davis
Daje błąd > groovy.lang.MissingPropertyException: No such property: variantConfiguration for class: com.android.build.gradle.internal.variant.ApplicationVariantData. Dlaczego po prostu nie zmienić buildType = variant.buildType.name?
soshial
jest napisane"file.apk" is not writeable
Hosein Haqiqian
38

Oto znacznie krótsza droga:

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

Daje ci nazwę com.blahblah.example-v1 (1.0) -debug.apk (w trybie debugowania)

Android Studio domyślnie dodaje versionNameSuffix według nazwy typu kompilacji, jeśli chcesz to zastąpić, wykonaj następujące czynności:

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

Wyjście w trybie debugowania: com.blahblah.example-v1 (1.0) -MyNiceDebugModeName.apk

Anrimian
źródło
3
Dzięki. To najszybsza opcja!
John
1
Uwaga dodatkowa, możesz dodać archiveBaseName do lokalnego pliku gradle.properties.
Ge3ng
To naprawdę wydaje się bardziej jasne. Dlaczego nie jest to preferowane rozwiązanie?
Xan-Kun Clark-Davis
6

Bardziej uniwersalne rozwiązanie napisałem na podstawie odpowiedzi @Fer.

To również powinno działać w konfiguracji opartej smak i rodzaj kompilacji applicationId, versionName, versionCode.

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

Przykładowa nazwa pliku APK: com.example.app_freeDebug_1.0_1.apk

Aby uzyskać więcej informacji na temat variantzmiennej, zobacz definicję interfejsów ApkVariant i BaseVariant .

KursoR
źródło
4

dodaj android.applicationVariants.allblok jak poniżej w twojej aplikacji

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

dostępne od 2019/03/25

Loyea
źródło
2

Najpierw zmień nazwę modułu z app na np. SurveyApp

Po drugie, dodaj to do gradle najwyższego poziomu projektu (głównego projektu). Działa z 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
źródło
2

Dodaj następujący kod w build.gradle (Module: 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)
                }
            }
        }
    }
}

Nazwą kompilacji wydania będzie nazwa Twojej aplikacji 2018-03-31 12-34

Vinil Chandran
źródło
1

Moje rozwiązanie może też komuś pomóc.

Przetestowane i działa na IntelliJ 2017.3.2 z Gradle 4.4

Scenariusz:

W mojej aplikacji są 2 smaki, dlatego chciałem, aby każde wydanie miało odpowiednią nazwę zgodnie z każdym smakiem.

Poniższy kod zostanie umieszczony w pliku budowania gradle modułu znajdującym się w:

{app-root}/app/build.gradle

Kod Gradle do dodania do android{ }bloku:

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

Powyższe zapewnia następujące pliki APK znalezione w {app-root}/app/:

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

Mam nadzieję, że komuś się to przyda.

Aby uzyskać więcej informacji, zobacz inne odpowiedzi wymienione w pytaniu

CybeX
źródło
0

Myślę, że to będzie pomocne.

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
źródło