Cambiare nome apk con Gradle

? Grzegorz @ | Original: StackOverFlow
---

Ho progetto Android che utilizza Gradle in processo di generazione . Ora voglio aggiungere due tipi di generazione in più di sosta e di produzione, quindi non ho nel mio build.gradle .

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

        staging {
            signingConfig signingConfigs.staging

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

        production {
            signingConfig signingConfigs.production
        }
    }
}

e la mia appndVersionNameVersionCode assomiglia :

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

Se eseguo compito assembleStaging allora ottengo nome proprio di mio apk, ma quando eseguo assembleProduction poi mi cambio i nomi della mia apk ( come nel caso di sosta ) . Per esempio:

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

Sembra che nella produzione tipo di costruzione viene eseguito appendVersionNameVersionCode . Come posso evitarlo ?

---

Top 5 Risposta

1Leszek @

Come CommonsWare ha scritto nel suo commento, si dovrebbe chiamare appendVersionNameVersionCode solo per le varianti di sosta . Si può facilmente farlo, basta modificare leggermente il metodo appendVersionNameVersionCode, per esempio :

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)
    }
}
2Piotr Zawadzki @

La soluzione di Lecho non funziona per android Gradle Plugin 0.14.3+ a causa della rimozione di API deprecate :  http://tools.android.com/tech-docs/new-build-system

Quasi 1.0 : rimossi obsolete proprietà / metodi

...

Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest (use the variant output)

Le seguenti opere per me :

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