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

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/78118930 软件...
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/78118930

软件开发中软件版本号是一个重要的概念,而对于工程师软件版本号所对应的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)
目录
相关文章
|
8月前
|
SQL 关系型数据库 测试技术
软件测试|教你如何使用UPDATE修改数据
软件测试|教你如何使用UPDATE修改数据
86 0
|
5月前
|
Linux 网络安全 开发工具
如何在linux中操作git 关键地方记录
如何在linux中操作git 关键地方记录
如何在linux中操作git 关键地方记录
|
9月前
|
存储 前端开发 Unix
Github对Git commit date操作的诸多细节,你注意到了么
我们开发人员几乎每天都要使用git commit,但你知道他对时间处理的一些细节吗?一起来了解一下吧
187 0
|
Ubuntu Linux C语言
【技术分享】Linux更新(update/upgrade) & 更新源
Linux更新(update/upgrade) & 更新源
552 0
|
11月前
|
开发工具 git
Git - 入门到熟悉_TAG管理
Git - 入门到熟悉_TAG管理
87 0
|
算法 决策智能
必备技能06:高效使用github的骚操作--以Branch and Bound为例
必备技能06:高效使用github的骚操作--以Branch and Bound为例
必备技能06:高效使用github的骚操作--以Branch and Bound为例
|
开发工具 git
修改Git提交历史中的author,email和name等信息
在我们日常工作中,通常由于某种原因,需要更新历史提交的commit信息。一般会有如下几种场景: 修改当前分支最新 commit 的提交信息 修改当前分支某历史commit的提交信息 修改当前分支所有提交的commit信息
|
开发工具 git
Git | 手把手教你修改message和合并commit
本文的主要围绕着下面这个问题展开的,在阅读之前可以先自己思考一下问题的答案是什么:如何修改以前的message信息?如何合并连续的以及不连续的commit记录?
1119 0
|
SQL
SQL基础【九、Update】
SQL基础【九、Update】
85 0
SQL基础【九、Update】

热门文章

最新文章