使用 Gradle 更改 apk 名称

新手上路,请多包涵

我有一个使用 Gradle 进行构建过程的 Android 项目。现在我想添加两个额外的构建类型暂存和生产,所以我的 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 的正确名称,但是当我执行 assembleProduction 然后我得到我的 apk 的更改名称(就像在暂存案例中一样)。例如:

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

看起来在生产构建类型中执行 了 appendVersionNameVersionCode 。我怎样才能避免它?

原文由 Gie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 420
2 个回答

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

原文由 Leszek 发布,翻译遵循 CC BY-SA 3.0 许可协议

Lecho 的解决方案不适用于 Android Gradle 插件 0.14.3+,因为删除了已弃用的 API: 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)
    }
}

原文由 Piotr Zawadzki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题