Изменить имя apk с помощью Gradle

У меня есть проект Android, который использует Gradle для процесса сборки. Теперь я хочу добавить два дополнительных типа сборки и постановку, поэтому мой файл 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
        }
    }
}

и мой appndVersionNameVersionCode выглядит так:

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

Если я выполняю задачу assembleStaging, тогда я получаю собственное имя apk, но когда я выполняю сборку, я получаю измененные имена моего apk (например, в стадии постановки). Например:

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

Похоже, что в производственной форме сборки выполняется appendVersionNameVersionCode. Как я могу избежать этого?

Ответ 1

Как CommonsWare написал в своем комментарии, вы должны называть appendVersionNameVersionCode только для вариантов постановки. Вы можете легко это сделать, просто слегка измените свой метод appendVersionNameVersionCode, например:

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

Ответ 2

Решение Lecho не работает для Android Gradle Плагин 0.14.3+ из-за удаления устаревших APIS: http://tools.android.com/tech-docs/new-build-system

Почти 1.0: удаленные устаревшие свойства/методы

...

  • Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest (используйте вариант вывода)

Для меня работает следующее:

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

Ответ 3

У меня есть небольшая общая версия. строить и устанавливать штраф. например, ваше имя проекта - это "Салат", тогда для постановки названия apk будет "Salad-staging-dd-MM-YY", вы также можете изменить для debug и release apk. надеюсь, что мое решение будет лучше.
Изменение в 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'
}

чтобы изменить название приложения Android ref

Ответ 4

Вот что я сделал:

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