在做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中,文件最后加入:
//编译之前,执行updateVerion
preBuild.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。