用Gradle更改apk名称

时间:2014-03-02 10:14:29

标签: android gradle apk android-gradle

我有一个Android项目,它使用Gradle进行构建过程。现在我想添加两个额外的构建类型staging和production,所以我的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 。我怎么能避免它?

6 个答案:

答案 0 :(得分: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)
    }
}

答案 1 :(得分: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)
    }
}

答案 2 :(得分:0)

我使用它的小通用版本。建立并安装好。 例如你的projectName是“沙拉”然后用于登台apk名称将是“Salad-staging-dd-MM-YY”你也可以更改为调试和发布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

答案 3 :(得分:0)

这就是我所做的:

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

答案 4 :(得分:0)

我在 android studio 4.1v 或更高版本中成功创建了 apk。 应用级gradle 顶级构建文件,您可以在其中添加所有子项目/模块通用的配置选项。

buildscript {
    ext.kotlin_version = '1.3.11'
    ext.play_services_version = '16.0.0'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.4'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


//..............and another module level gradle within........//
buildTypes{
release {

            def versionCode = "4.1.0"

            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            applicationVariants.all { variant ->
                variant.outputs.all() { output ->
                    variant.productFlavors.each { flavor ->
                        def appName = "MyAPP" + versionCode + ".apk"
                        outputFileName = new File("./build/",
                                appName.replace(".apk", "_${flavor.name}.apk")
                        )
                    }
                }
            }
        }
        debug {
           // ext.enableCrashlytics = false
           // ext.alwaysUpdateBuildId = false
        }
}


答案 5 :(得分:0)

对于较新的 android studio Gradle

AppName 是您想要的应用名称,因此请替换它
variantName 将是默认选择的变体或风味
日期将是今天的日期,所以需要做任何更改只需粘贴它

applicationVariants.all { variant ->
    variant.outputs.all {
        def variantName = variant.name
        def versionName = variant.versionName
        def formattedDate = new Date().format('dd-MM-YYYY')
        outputFileName = "AppName_${variantName}_D_${formattedDate}_V_${versionName}.apk"
    }
}

输出:

AppName_release_D_26-04-2021_V_1.2.apk