用Gradle更改apk名称

Grz*_*orz 41 android gradle apk android-gradle-plugin

我有一个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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的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)
}
Run Code Online (Sandbox Code Playgroud)

如果我执行任务assembleStaging然后我得到我的apk的正确名称,但当我执行assembleProduction然后我得到我的apk的更改名称(如在临时案例中).例如:

MyApp-defaultFlavor-production-9.9.9-999.apk
MyApp-defaultFlavor-production-9.9.9-999.apk
Run Code Online (Sandbox Code Playgroud)

看起来在生产构建类型中执行appendVersionNameVersionCode.我怎么能避免呢?

Les*_*zek 37

正如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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,现在它的工作原理.我只对病情进行了小修改.现在它看起来像:if(variant.buildType.name == android.buildTypes.staging.name). (2认同)

Pio*_*zki 20

由于删除了已弃用的APIS,Lecho的解决方案不适用于Android Gradle Plugin 0.14.3+: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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我有最新的gradle和android studio版本,但有趣的是我在尝试上面的片段时收到错误消息"找不到属性"输出. (2认同)
  • AS 1.1中有进一步的变化,你可以在这里找到一个更新的脚本:http://stackoverflow.com/questions/24649240/build-release-apk-with-customize-name-format-in-android-studio (2认同)

Ven*_*min 5

如果您使用 Kotlin DSL,则可以通过以下方式更改 APK 名称:

    applicationVariants.all {
        outputs.all {
            this as com.android.build.gradle.internal.api.ApkVariantOutputImpl

            val buildName = buildType.name
            val timestamp = SimpleDateFormat("yyyyMMdd").format(Date())
            val apkName = timestamp + "_AppName_" + defaultConfig.versionName + "." + defaultConfig.versionCode + "_" + buildName + ".apk"

            outputFileName = apkName
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您不想使用时间戳,请将其删除。否则,不要忘记文件顶部的这些行来导入 java 类:

import java.util.Date
import java.text.SimpleDateFormat
Run Code Online (Sandbox Code Playgroud)

您还可以比较构建名称,以便为不同构建指定配置,如下所示:

name == "debug"
/* or */
name.contains("release")
Run Code Online (Sandbox Code Playgroud)