Android编译gradle 动态修改版本号

在构建代码的时候不想每次都修改版本号,需能够增加一个功能在特定的条件下动态的修改版本号

  1. 在manifest里面加入占位符号
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
       android:versionCode="${versioncode}"
       android:versionName="${versionname}">

  1. 修改build.gradle
import com.google.gson.Gson

class Version {
    int versionCode
    String versionName
}


def versionJsonFile = file('./version.json')//这个文件最好放一个所有项目人员都能够访问的地方
    def versionJsonObject = new Gson().fromJson(versionJsonFile.text, Version.class)
    android.applicationVariants.all {
        variant ->
            println("variants name : " + variant.name)
			//只有满足特定条件的情况下才会版本自增一,这个可以看看各个项目的特定配置
            if (variant.name.toLowerCase().contains("ceshirelease") ) {
                println("variants name : versionCode " +  versionJsonObject.versionCode + "versionname: " + versionJsonObject.versionName)
                versionJsonObject.versionCode = versionJsonObject.versionCode + 1
                int lastIndexPoint = versionJsonObject.versionName.lastIndexOf(".")
                String newStr = versionJsonObject.versionName.substring(0, lastIndexPoint)
                println("newStr" +  newStr)
                versionJsonObject.versionName = newStr + "." + versionJsonObject.versionCode
                println("versonJsonStr.versionName " +   versionJsonObject.versionName)
            }
			//这句是核心,可以调整版本号和版本明,修改了这个会影响到BuildConfig.class里面的属性
            variant.mergedFlavor.versionCode = versionJsonObject.versionCode
            variant.mergedFlavor.versionName = versionJsonObject.versionName
			//如果没有加下面这句,当应用安装后会出现应用信息没有版本号的问题,这个必须有
            variant.mergedFlavor.manifestPlaceholders.put("versioncode", versionJsonObject.versionCode)
            variant.mergedFlavor.manifestPlaceholders.put("versionname", versionJsonObject.versionName)
    }
	
	//为了记住最新的版本号,是需要进行文件的回写的,什么时候回写会好一点
	//个人认为只有当打包apk的动作执行成功后 回写文件记录的版本号最优
	   afterEvaluate {
        project ->
            gradle.taskGraph.afterTask {
                task, taskState ->
				   //这里如果assembleceshirelease 就具体的打包的变种项目,各个应用肯定不一样,需要调整下
                    if (task.name.toLowerCase().contains("assembleceshirelease") && taskState.getFailure() == null) {
                        println("try assemble ceshi release" )
						//回写文件操作
                        versionJsonFile.withPrintWriter { out ->
                                out.println(new Gson().toJson(versionJsonObject))
                        }
                    }
            }
    }
	

给apk重新命名也是同样的道理

           variant.getOutputs().all {
               File file = it.outputFile;
               println(" file property  file.canRead() " + file.canRead() + " file.canWrite " + file.canWrite())
               String pathString = file.getPath();
               println(" path String : " + pathString + " File.pathSeparator: " + File.separator)
			   //指定最终输出的文件的目录和名字
               pathString = file.getParent() + File.separator +  "test.apk";
               println(" path pathString : " + pathString)
               file.renameTo(pathString)
           }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值