在做SDK的时候,经常需要手动去修改版本号。比如
public class Version{//先注释掉之前的版本号 // public static final String VERSION = "1.0";//再写上新的版本号 public static final String VERSION = "1.1";}
这样的问题有两个:
1。重复劳动。完全是人工的。
2。遗漏的可能。 换个人去开发SDK了,可能就忘了修改这个VERSION了。总之:靠人不靠谱。(强行安利一个电影:《》。结局反转,黑客,人最不可靠)
接下来,借助gradle,实现一种编译时,自动修改版本号的方法。保证代码的随时更新。
一。何时运行?
修改版本号,肯定是在编译之前运行。不然都编译完了再去修改版本号有个毛意义啊?所以我们得找到gradle在编译之前可以进行的命令:preBuild。
在对应的app工程(或者library的工程)的build.gradle中,文件最后加入:
//编译之前,执行updateVerionpreBuild.dependsOn updateVersion
这句话就是在编译之前,依赖updateVersion。updateVersion就是我们要进行的task——去修改版本号。
二。写task脚本
假设Version.java的内容如下:
public class Version { public static final String VERSION = "2016-08-20";}
(为了便于脚本修改,建议这个文件里面只有一个VERSION变量,其他不要有。当然只是建议)
在build.gradle中继续加入:
//替换版本号task updateVersion << { //Version文件的目录。这里应该改为你的实际目录 def versionFileDir = projectDir.getAbsolutePath() + File.separatorChar + 'Version.java'; println versionFileDir; //读取旧的version字符串 def oldVersionStr = findOldVersionStr(versionFileDir); println oldVersionStr; //获取新的version字符串 def newVersionValue = getNewVersionValue(); println newVersionValue; //拼接为java的语句 def newVersionStr = "public static final String VERSION = \"" + newVersionValue + "\";" println newVersionStr; //重新写入到文件中 def updatedContent = new File(versionFileDir).getText('UTF-8').replaceAll(oldVersionStr, newVersionStr); new File(versionFileDir).write(updatedContent, 'UTF-8')}//读取旧的version字符串def findOldVersionStr(path) { def readerString = ""; new File(path).withReader('UTF-8') { reader -> reader.eachLine { //读取一行,如果发现有"VERSION"字符,说明是我们要修改的那一行。 if (it.contains("VERSION")) { //保存it到string,然后返回 readerString <<= it return readerString } } return readerString }}//获取新的版本号def getNewVersionValue() { //举例:用日期作为版本号 def date = new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")); return date;}
rebuild运行之后,就会自动修改Version的值了。
总体流程就是:
读取旧的一行文字,替换新的,然后重写进去。在编译前依赖一下task。