web-dev-qa-db-fra.com

Changer le nom de l'apk avec Gradle

J'ai un projet Android qui utilise Gradle pour le processus de construction. Maintenant, je veux ajouter deux types de compilation supplémentaires, la production intermédiaire et la production, afin que mon build.gradle contienne:

Android {
    buildTypes {
        release {
            runProguard false
            proguardFile getDefaultProguardFile('proguard-Android.txt')
        }

        staging {
            signingConfig signingConfigs.staging

            applicationVariants.all { variant ->
                appendVersionNameVersionCode(variant, defaultConfig)
            }
        }

        production {
            signingConfig signingConfigs.production
        }
    }
}

et mon appndVersionNameVersionCode ressemble à:

def appendVersionNameVersionCode(variant, defaultConfig) {
    if(variant.zipAlign) {
        def file = variant.outputFile
        def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
        variant.outputFile = new File(file.parent, fileName)
    }

    def file = variant.packageApplication.outputFile
    def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
    variant.packageApplication.outputFile = new File(file.parent, fileName)
}

Si j'exécute la tâche assembleStaging , alors j'obtiens le nom propre de mon apk, mais lorsque j'exécute assembleProduction , alors les noms de mes apk sont modifiés (comme dans le cas de la cascade). Par exemple:

MyApp-defaultFlavor-production-9.9.9-999.apk
MyApp-defaultFlavor-production-9.9.9-999.apk

Il semble que le type de construction en production soit exécuté appendVersionNameVersionCode . Comment puis-je l'éviter?

40
Grzegorz

Comme CommonsWare l’a écrit dans son commentaire, vous ne devez appeler appendVersionNameVersionCode que pour les variantes de présentation. Vous pouvez facilement le faire, il suffit de modifier légèrement votre méthode appendVersionNameVersionCode, par exemple:

def appendVersionNameVersionCode(variant, defaultConfig) {
    //check if staging variant
    if(variant.name == Android.buildTypes.staging.name){
        if(variant.zipAlign) {
            def file = variant.outputFile
            def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
            variant.outputFile = new File(file.parent, fileName)
        }

    def file = variant.packageApplication.outputFile
    def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
    variant.packageApplication.outputFile = new File(file.parent, fileName)
    }
}
37
Leszek

La solution de Lecho ne fonctionne pas pour Android Gradle Plugin 0.14.3+ à cause de la suppression des APIS obsolètes: http://tools.Android.com/tech-docs/new-build-system

Presque 1.0: propriétés/méthodes obsolètes supprimées

...

  • Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest (utilisez la sortie de variante)

Ce qui suit fonctionne pour moi:

def appendVersionNameVersionCode(variant, defaultConfig) {
    variant.outputs.each { output ->
        if (output.zipAlign) {
            def file = output.outputFile
            def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
            output.outputFile = new File(file.parent, fileName)
        }

        def file = output.packageApplication.outputFile
        def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
        output.packageApplication.outputFile = new File(file.parent, fileName)
    }
}
20
Piotr Zawadzki

J'en ai utilisé une petite version générique. Construisez et installez bien . Par exemple, votre nom de projet est "Salade", puis pour la mise en place de l'apk, le nom sera "Salade-staging-jj-MM-AA", vous pouvez également changer pour le débogage et la libération d'apk. espérons que ma solution sera meilleure .
Changement dans projectName/app/build.gradle

buildTypes {

debug{

}

staging{
 debuggable true
 signingConfig signingConfigs.debug
 applicationVariants.all { variant ->
 variant.outputs.each { output ->
 def date = new Date();
 def formattedDate = date.format('dd-MM-yyyy')
 def appName = getProjectDir().getParentFile().name
 output.outputFile = new File(output.outputFile.parent,
                                output.outputFile.name.replace(getProjectDir().name +"-staging", "$appName-staging-" + formattedDate)
                                //for Debug use output.outputFile = new File(output.outputFile.parent,
                                //                             output.outputFile.name.replace("-debug", "-" + formattedDate)
                        )
  }
 }
}

release {
  minifyEnabled false
 proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}

changer le nom de l'application Android ref

0
Qamar

Voici ce que j'ai fait:

 def appName
        if (project.hasProperty("applicationName")) {
            appName = applicationName
        } else {
            appName = parent.name
        }
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", appName + "_V" + versionCode + ".apk"))
            }
        }
0
Droid Chris