软件工程—让软件包自带commit id

来源:互联网 发布:java正则表达式匹配{} 编辑:程序博客网 时间:2024/06/05 14:28

软件开发中软件版本号是一个重要的概念,而对于工程师软件版本号所对应的git(svn)commit id则更重要,嵌入式固件,移动端app开发中,理想的情况下是我拿到一个固件包,或者一个嵌入式设备,或者手机app,我们需要准确的找到该软件版本对应的commit id,如何来做最准确以及最方便:让软件包自带commit id。

Linux kernel的做法:

不得不说linux kernel的很多做法思想是十分完善以及超前的,linux kernel会在build过程中将git(svn)的当前commit id写入内核image中,使内核image自带commit id,如何操作请自行搜索。
(android手机用户,可以查看设置->关于手机->内核版本,工程师应该对gxxxxx很敏感,xxxxx就是对应的git commit id)

嵌入式开发中常用的做法:

由于笔者从事了8年嵌入式开发,对这个做法可以说得心应手,嵌入式开发是一个自由度很高的行业,没有很多完善的轮子,同时由于linux的简约的思想,开发者可以十分自由的创作自己的构建流程(就如同c语音一样,自由灵活,虽然有些lib库没有其他高级语言完善丰富,但是它几乎无所不能,很少束缚开发者。)
这部分也不做过多说明,linux系统工程师应该很容易写出一个获取Git commit id并写入固件image的构建脚本。(有太多方式了,自由发挥吧)

Android app开发中的做法:

最近接触Android app开发,发现某某大厂的app,竟然不能通过app立即找到对应的commit id,对于走正常发布流程的app包,这个不是问题,因为通过标准化的构建流程发布,可以在构建系统中通过版本号追溯到对应的commit id(但是这套构建系统对版本号没有严格的约束,你可以build出两个一模一样版本号的app包。。。这样你基本上就完全懵逼了,还有说通过软件包时间来对应的,我。。。。。不多说啥了。。。。),而对于开发过程中,一些非标准流程发出的一些临时测试包,就完全失控了,根本无法确定一些软件包对应的commit id,没有准确的commit id你说你怎么找bug吧(不能理解这个的工程师,我觉得可以考虑转行做pd了)。

  • android app如何获取commit id:
    本以为这是一个很简单的问题,应该有很多解决方法,不过我通过google,baidu,bing进行了一番搜索,竟然没有找到一篇完整的资料。只有自己来了:
    gradle:android app目前普遍通过gradle进行构建,而如何在gradle中调用shell系统命令获取git commit id就是问题的关键。
    通过不断的搜索,终于找到一个方法:
    'git describe'.execute().text
    上面这行代码就可以在gradle中获取git commit id的信息,我们可以把该行返回字符串赋给一个String变量。但需要注意的是该行代码的返回字符串是带换行符的,可以通过subSequence()去除最后一个换行字符。

至此在gradle构建脚本中我们可以获取到了commit id,而如何将该commit id传递给java代码,此处不做说明,相信9成的android app开发工程师都比我这零基础的app入门者熟悉。

最后,实现以上功能大概花费了一个晚上的时间,这都不是key point,使我惊奇的是,在我8年多的软件开发过程中,我遇见无数不重视,甚至不了解软件包和commit id关联的重要性以及意义的“资深”工程师,如何定位问题,通过什么定位问题,如何使用版本管理工具,是工程师需要思考的。

补充:

终于发现一个详尽明确的说明:Android打包的那些事该链接中提供一个十分方便的处理方式:

android {    defaultConfig {        resValue "string", "build_time", buildTime()        resValue "string", "build_host", hostName()        resValue "string", "build_revision", revision()    }}def buildTime() {    return new Date().format("yyyy-MM-dd HH:mm:ss")}def hostName() {    return System.getProperty("user.name") + "@" + InetAddress.localHost.hostName}def revision() {    def code = new ByteArrayOutputStream()    exec {        commandLine 'git', 'describe'        standardOutput = code    }    return code.toString()}

可以通过以下方式在activity中进行调用:

getString(R.string.build_time)getString(R.string.build_host)getString(R.string.build_revision)
原创粉丝点击