Vraag Hoe stel je versionName in APK-bestandsnaam in met behulp van gradle?


Ik probeer een specifiek versienummer in te stellen in de automatisch gegenereerde APK-bestandsnaam.

Nu genereert gradle myapp-release.apk maar ik wil dat het er ongeveer uitziet myapp-release-1.0.apk.

Ik heb geprobeerd de opties te hernoemen die rommelig lijken. Is er een eenvoudige manier om dit te doen?

buildTypes {
    release {
       signingConfig signingConfigs.release
       applicationVariants.each { variant ->
       def file = variant.outputFile
       variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" +    defaultConfig.versionName + ".apk"))
    }
}

Ik heb de bovenstaande code zonder geluk geprobeerd. Suggesties? (met behulp van gradiel 1.6)


144
2017-08-20 10:14


oorsprong


antwoorden:


Ik hoef de versienaam alleen op één plaats te veranderen. De code is ook eenvoudig.

De onderstaande voorbeelden zullen apk-bestanden met de naam genaamd maken MyCompany-MyAppName-1.4.8-debug.apk of MyCompany-MyAppName-1.4.8-release.apk afhankelijk van de geselecteerde bouwvariant.

Zie ook: Hoe de naam van het proguard-toewijzingsbestand in gradle voor Android-project te veranderen

Oplossing voor Recente Gradle Plugin

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "com.company.app"
        minSdkVersion 13
        targetSdkVersion 21
        versionCode 14       // increment with every release
        versionName '1.4.8'   // change with every release
        setProperty("archivesBaseName", "MyCompany-MyAppName-$versionName")
    }
}

De bovenstaande oplossing is getest met de volgende Android Gradle-plug-inversies:

  • 3.1.0 (maart 2018)
  • 3.0.1 (november 2017)
  • 3.0.0 (oktober 2017)
  • 2.3.2 (mei 2017)
  • 2.3.1 (april 2017)
  • 2.3.0 (februari 2017)
  • 2.2.3 (december 2016)
  • 2.2.2
  • 2.2.0 (september 2016)
  • 2.1.3 (augustus 2016)
  • 2.1.2
  • 2.0.0 (april 2016)
  • 1.5.0 (2015/11/12)
  • 1.4.0-beta6 (2015/10/05)
  • 1.3.1 (2015/08/11)

Ik zal deze post bijwerken als er nieuwe versies verschijnen.

Oplossing alleen getest in versies 1.1.3 - 1.3.0

De volgende oplossing is getest met de volgende Android Gradle-plug-inversies:

app gradle file:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "com.company.app"
        minSdkVersion 13
        targetSdkVersion 21
        versionCode 14       // increment with every release
        versionName '1.4.8'   // change with every release
        archivesBaseName = "MyCompany-MyAppName-$versionName"
    }
}

175
2018-03-11 17:02



Dit loste mijn probleem op: gebruiken applicationVariants.all in plaats van applicationVariants.each 

buildTypes {
      release {
        signingConfig signingConfigs.release
        applicationVariants.all { variant ->
            def file = variant.outputFile
            variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) 
        }
    }       
}

Bijwerken:

Dus het lijkt erop dat dit niet werkt met 0,14+ versies van de plug-in Android Studio Gradle.

Dit doet de truc (verwijzing hiernaar vraag  ):

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(
                    output.outputFile.parent,
                    output.outputFile.name.replace(".apk", "-${variant.versionName}.apk"))
        }
    }
}

165
2017-08-20 12:09



(UITGEWERKT om te werken met Android Studio 3.0 en Gradle 4)

Ik was op zoek naar een meer complexe apk bestandsnaam hernoemen optie en ik schreef deze in de hoop dat het nuttig is voor iemand anders. Het hernoemt de APK met de volgende gegevens:

  • smaak
  • bouwtype
  • versie
  • datum

Het kostte me een beetje onderzoek in graduele lessen en een beetje kopiëren / plakken van andere antwoorden. ik gebruik niveau 3.1.3.

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

Als je vandaag compileert (13-10-2016) om 10:47, krijg je de volgende bestandsnamen, afhankelijk van het smaak- en bouwtype dat je hebt gekozen:

  • dev debug: mijn project_dev_debug_1.3.6_131016_1047.apk
  • dev release: mijn project_dev_release_1.3.6_131016_1047.apk
  • foutopsporing: mijn project_prod_debug_1.2.0_131016_1047.apk
  • prod release: mijn project_prod_release_1.2.0_131016_1047.apk

Opmerking: de niet-gealigneerde versie apk naam is nog steeds de standaard naam.


31
2017-10-13 09:14



Als u dan niet versionName opgeeft in defaultConfig block defaultConfig.versionName zal resulteren in null

om versionName te krijgen van manifest kun je de volgende code in build.gradle schrijven:

import com.android.builder.DefaultManifestParser

def manifestParser = new DefaultManifestParser()
println manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile)

17
2017-10-16 14:28



Kortom, want die weten niet hoe ze het pakket moeten importeren build.gradle(zoals ik), gebruik het volgende buildTypes,

buildTypes {
      release {
        signingConfig signingConfigs.release
        applicationVariants.all { variant ->
            def file = variant.outputFile
            def manifestParser = new com.android.builder.core.DefaultManifestParser()
            variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk")) 
        }
    }       
}

===== BEWERKEN =====

Als je je hebt ingesteld versionCode en versionName in uw build.gradle bestand als dit:

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 19
    versionCode 1
    versionName "1.0.0"
}

Je zou het zo moeten instellen:

buildTypes {   
        release {
            signingConfig signingConfigs.releaseConfig
            applicationVariants.all { variant ->
                def file = variant.outputFile
                variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
            }
        }
}


====== BEWERKEN met Android Studio 1.0 ======

Als u Android Studio 1.0 gebruikt, krijgt u de volgende foutmelding:

Error:(78, 0) Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f.

Je moet de build.Types deel hieraan:

buildTypes {
        release {
            signingConfig signingConfigs.releaseConfig
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
                }
            }
        }
    }

17
2017-07-09 09:18



In mijn geval wilde ik gewoon een manier vinden om de generatie van verschillende te automatiseren apk naam voor release en debug varianten. Ik heb dit gemakkelijk kunnen doen door dit fragment als een kind van te maken android:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def appName = "My_nice_name_"
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def newName
        if (buildType == 'debug'){
            newName = "${appName}${defaultConfig.versionName}_dbg.apk"
        } else {
            newName = "${appName}${defaultConfig.versionName}_prd.apk"
        }
        output.outputFile = new File(output.outputFile.parent, newName)
    }
}

Voor de nieuwe Android gradle plugin 3.0.0 kun je zoiets doen:

 applicationVariants.all { variant ->
    variant.outputs.all {
        def appName = "My_nice_name_"
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def newName
        if (buildType == 'debug'){
            newName = "${appName}${defaultConfig.versionName}_dbg.apk"
        } else {
            newName = "${appName}${defaultConfig.versionName}_prd.apk"
        }
        outputFileName = newName
    }
}

Dit produceert zoiets als: My_nice_name_3.2.31_dbg.apk


7
2018-04-18 13:38



Een ander alternatief is om het volgende te gebruiken:

String APK_NAME = "appname"
int VERSION_CODE = 1
String VERSION_NAME = "1.0.0"

project.archivesBaseName = APK_NAME + "-" + VERSION_NAME;

    android {
      compileSdkVersion 21
      buildToolsVersion "21.1.1"

      defaultConfig {
        applicationId "com.myapp"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode VERSION_CODE
        versionName VERSION_NAME
      }

       .... // Rest of your config
}

Dit zet "appname-1.0.0" op al uw APK-uitgangen.


5
2017-12-12 17:06



Gradle 4

Syntaxis is een beetje veranderd in Gradle 4 (Android Studio 3+) (vanaf output.outputFile naar outputFileName, idee van dit antwoord is nu:

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def newName = outputFileName
            newName.replace(".apk", "-${variant.versionName}.apk")
            outputFileName = new File(newName)
        }
    }
}

5
2017-12-10 16:36



Er zijn veel antwoorden die volledig kloppen of na enkele aanpassingen. Maar ik ga de mijne toch toevoegen omdat ik het probleem met allemaal had omdat ik scripts gebruikte om VersionName en VersionCode dynamisch te genereren door in te haken in de preBuild taak.

Als u een vergelijkbare benadering gebruikt, is dit de code die werkt:

project.android.applicationVariants.all { variant ->
    variant.preBuild.doLast {
    variant.outputs.each { output ->
        output.outputFile = new File(
                output.outputFile.parent,
                output.outputFile.name.replace(".apk", "-${variant.versionName}@${variant.versionCode}.apk"))
        }
    }
}

Om uit te leggen: aangezien ik de code en de naam van de code overschrijf in de eerste actie van preBuild Ik moet het bestand hernoemen aan het einde van deze taak. Dus wat voor een gradatie zal in dit geval doen is:

Injecteer versiecode / naam-> doe preBuild-acties -> vervang naam voor apk


3
2017-09-01 09:31