apk打包输出路径修改及版本号自动迭代的实现

开发打包版本的时候, 打包的apk默认名称都是app_release.apk.不方便辨认最新版本, 同时每次也需要手动修改版本号, 这里记录下如何更优雅的解决这些问题

版本号自动迭代

首先在全局gradle文件中加入配置信息,和release版本检查方法:

// 通过taskName判断当前操作是否是在打release包
def checkRelease() {
    def runTasks = gradle.startParameter.taskNames
    for (String task : runTasks) {
        // 我这里认为执行“assemble”和非“debug”的任务就是执行“release”的任务
        if (task.contains("assemble") && !task.contains("Debug")) {
//            targetTask = task
            return true
        }
    }
    return false
}

ext { // 定义当前gradle文件的全局变量, 是否是release版本
    isRelease = checkRelease()
}

然后在app模块的gradle文件中添加获取版本号的方法,放在apply plugin下面就行:


//apply plugin: 'com.android.application'

/**
 * 获取版本号,每次release包自动迭代
 * @return
 */
def increasedVersionCode() {
    def propFile = file('../gradle.properties')
    def Properties props = new Properties()
    props.load(new FileInputStream(propFile))
    // 读取gradle.properties文件中定义的VERSION_CODE属性
    def code = props.getProperty('VERSION_CODE',"0").toInteger()
    if (isRelease) {
        code++
        props['VERSION_CODE'] = code.toString()
        // 将最新的versionCode写入gradle.properties文件中
        props.store(propFile.newWriter(), null)
    }
    return code
}

修改原来固定的版本号为 versionCode increasedVersionCode()

完成以上步骤, 后面每次打包release版本的时候版本号都会自动累加.

修改release包输出路径及名称

在android{} 模块最后添加以下代码:

3.0及以上使用如下代码

   /**
     * 修改release包的apk文件名和路径
     * Studio3.0
     */
    android.applicationVariants.all { variant ->

        if (variant.buildType.name == 'release') {
            def buildTypeName = variant.buildType.name
            variant.outputs.all {
//                def outputFile = output.outputFile
                def oldFile = variant.outputs[0].outputFile
                def releaseApkName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${buildTypeName}.apk"
                println("版本名称--->" + defaultConfig.versionName + " 版本号--->" + defaultConfig.versionCode)
                outputFileName = releaseApkName//new File(oldFile.parent, releaseApkName)
            }
        }
    }

3.0以下使用如下代码


android {
  
  ...........

    // 修改release包的apk文件名和路径
    applicationVariants.all { variant ->
        def buildTypeName = variant.buildType.name
        if (variant.buildType.name == 'release') {
            variant.outputs.each { output ->
                def oldFile = variant.outputs[0].outputFile
                def releaseApkName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${buildTypeName}.apk"
                println("版本名称--->" + defaultConfig.versionName+" 版本号--->"+defaultConfig.versionCode)
                output.outputFile = new File(oldFile.parent, releaseApkName)
            }
        }
    }
}

上面是输出在app模块目录下, 名称为app_v+版本名_+版本号+_打包类型.apk

目录和apk名称格式都可以修改成自己喜欢的.