#夏日挑战赛# 鸿蒙hap打包自动写入构建时间 原创 精华
jokerisme
发布于 2022-7-20 20:24
浏览
0收藏
前言
我们编译鸿蒙hap包的时候,往往希望把当前打包的时间写入鸿蒙应用里面,安卓的的VersionCode,VersionName是在build.gradle中配置,而鸿蒙则是config.json,在json中配置的缺点是不能运行代码。通常android是通过调用一个函数获取当前时间,在BuildConfig中新建一个成员,将时间赋值给当前变量,当然也可以把事件赋值给VersionName。但是鸿蒙却行不通。
本文提供一种将当前构建时间写入versionName的思路,只是起到抛砖引玉的作用,有更好的方案评论区见!
思路
1.我们在模块下的build.gradle中可以定义一个获取当前时间的函数
2.ohos闭包中有个outgoingVariants变量,通过outgoingVariants.configure()或者outgoingVariants.outputs.each()可以执行我们的任务,并且是在编译hap之前执行
3.新建一个任务,读取工程目录下的config.json文件,找到versionName的内容,将步骤1的时间替换掉
效果图
实现
- 定义获取时间的函数
/**
* 获取编译时间
*/
String getBuildTime() {
Date date = new Date();
//中国用的是东八区时间,数值上是在UTC时间上加8
//String dateStr = "\"" + date.format("yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("UTC")) + "\"";
//String dateStr = date.format("yyyyMMdd.HHmmss");
String dateStr = date.format("yyyy-MM-dd HH:mm:ss");
return dateStr;
}
- 新建一个任务读取config.json,并替换versionName的内容
ohos {
outgoingVariants.outputs.each {}
outgoingVariants.configure {
println("outgoingVariants.configure--->")
String str = ""
File file = new File("${projectDir.path}/src/main/config.json")
println("buildFile.path-2-->,${getBuildTime()}")
try {
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8")
StringBuilder sb = new StringBuilder()
String line = null;
int flag = 0;
while ((line = reader.readLine()) != null) {
if (line.contains("\"code\"")) {
//println("code-->${line}")
flag = 1;
} else if (line.contains("\"name\"") && flag == 1) {
//println("code-->${line}")
flag = 2;
String[] splits = line.split(":")
String[] splits2 = splits[1].split("\"")
line = splits[0] + ":" + splits2[0] + "\"" + getBuildTime() + "\"";
//println("code-->${line}")
}
sb.append(line).append('\n');
}
reader.close()
str = sb.toString()
//println(str)
} catch (IOException e) {
e.printStackTrace()
}
//write
try {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file))
writer.write(str)
//writer.flush()
writer.close()
} catch (IOException e) {
e.printStackTrace()
}
}
}
-
build
编译时,查看我们任务确实先执行了
-
测试
index.ets
import app from '@system.app';
@Entry
@Component
struct Index {
@State versionName: string = '1.0.0';
@State versionCode: number = 100000;
onPageShow() {
console.log('onPageShow start')
this.versionCode = app.getInfo().versionCode;
this.versionName = app.getInfo().versionName;
console.log('onPageShow end')
}
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text('versionCode:'+this.versionCode.toString())
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text('versionName:'+this.versionName)
.fontSize(20)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
}
}
留坑:
- 上面读取Config.json的数据并替换代码比较丑陋,但是在鸿蒙的build.gradle不能使用ZSONObject,JsonObject这些json解析类,只能用最原始读取字符串的方式,知道的同学不吝赐教
- 本想在每次打包的时候,将hap包的名字也带上时间,比如entry-debug-rich-signed.hap改成entry-debug-rich-signed20200720.hap,但是不知道在build.gradle用哪个变量的任务去做,知道的同学不吝赐教
总结:
总体思路:获取当前时间,读取config.json,替换内容让后重新写入
源码:
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-7-20 20:28:53修改
赞
2
收藏
回复
相关推荐
outgoingVariants变量这个点楼主发现的妙啊,感谢分享思路。
API8/API9使用hvigorfile.js来构建hap,但是网上没有找到如何在里面自定义构建任务,如果可以的话,按照这种思路也行的通,如果知道的话,请指导一下