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

软件开发中软件版本号是一个重要的概念,而对于工程师软件版本号所对应的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打包的那些事该链接中提供一个十分方便的处理方式:

def ver_cmd = 'git rev-parse --short HEAD'
version = '1.0' + "-" + ver_cmd.execute().text.trim()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() {version
}

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

getString(R.string.build_time)
getString(R.string.build_host)
getString(R.string.build_revision)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASM 判定一个类,实现了指定接口

为什么80%的码农都做不了架构师?>>> ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法。 通过 ClassReader ,实现对一个类的解析。 …

流媒体数据代理----Anychat

“用户流媒体数据代理功能”,使用该功能可以实现指定用户将其它用户的流媒体数据(音频、视频)做为自己的数据,转发给请求指定用户相关数据的用户。 应用场景:将指定用户(P)设置为其它用户&…

“javax.servlet.http.HttpServlet“ 错误

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 我们在进行java web的开发的时候,新建jsp页面,可能会出现The superclass "javax.servlet.http.HttpServlet…

WeakReference带来了什么

转载自:WeakReference带来了什么 很多人说到:java存在内存泄漏。 我不想反驳,因为我也开始慢慢说了,但我知道:内存泄漏和规范编码是两个完全不同的概念,所以我想说:请规范编码 java的“内存泄…

视频聊天室开发详解

互联网的不断发展,各种新技术的兴起,原本做管理软件的我也逐渐转向从事着互联网相关的运营产品的开发。尤其是目前抄得最火热的音视频互动平台技术,今天我先列出最基本开发流程,适用于开发视频会议系统、语音视频聊天系统、远程教…

Android应用开发—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期

ViewPager配合不同的PagerAdapter,对应Fragment的生命周期有着不同的表现,了解这个生命周期机制对于开发者选择合适的PagerAdapter实现不同的效果,有着很大的帮助。 FragmentPagerAdapter和FragmentStatePagerAdapter的区别: Fra…

Bash常用快捷键及其作用

Bash常用快捷键及其作用 在 Bash 中有非常多的快捷键,如果可以熟练地使用这些快捷键,可有效地提高我们的工作效率。只是快捷键相对较多,不太好记忆,这就要多加练习和使用。这些快捷键如表 1 所示。 表 1 Bash 常用快捷键快捷键作 …

Putty(菩提)远程连接服务器教程

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 百度不准直接用其图片,我也懒得去偷,只是记录下原文地址: https://jingyan.baidu.com/article/4543…

V8 中更快的异步函数和 promises

原文作者:Maya Lekova and Benedikt Meurer译者:UC 国际研发 Jothy写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。一…

Android应用开发—浅谈MVX模式

MVX模式的文章太多了,这里不会再重述,关键我还不太懂,本文会从自己的一些思考,分析下MVX的分离思想,先占个坑! Android应用架构这篇文章最后讲到: Activity和Fragment变得非常轻量。他们唯一的…

音视频互动平台--P2P通信技术

压缩包可以从这里获得:http://anychat.storage.aliyun.com/AnyChatCoreSDK_Win32(MBCS)_V4.5.zip 下载后,首先将其解压到一个临时文件夹中,然后开始后续工作。 编译后我们获得的是.lib文件。 AnyChat SDK向上层应用开放了内核的P2P连接策略…

pigz 压缩

压缩工具--pigz 压缩: tar cvf - 目录名 | pigz -9 -p 24 > file.tgz pigz:用法-9是压缩比率比较大,-p是指定cpu的核数。 解压: pigz -d file.tgz 这时候是tar包,那么在用 tar -xvf file.tar 解包。 速度比较gz.tar格式的压缩…

exgcd模板

逆元模板P1082 1 #include <cstdio>2 #include <algorithm>3 4 int exgcd(int a, int b, int &x, int &y) {5 if(!b) {6 x 1;7 y 0;8 return a;9 } 10 int g exgcd(b, a % b, x, y); 11 std::swap(x, y); 12 …

有关eclipse for java ee版本遇到的坑( Context initialization failed)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 这几天把以前网上看的视频的源代码拷贝到eclipse下面进行学习&#xff0c;当时用的是eclipse-jee-neon-M4a-win32-x86_64这个版本的ecli…

Android应用开发—TabLayout定制化Tab样式

TabLayout的使用详解基于此文&#xff0c;了解下setCustomView(childView)的使用。 TabLayout去掉指示器效果&#xff1a; app:tabIndicatorHeight"0dp"

即时通讯开发(逐行、隔行扫描)

早期的电视制式均采用隔行扫描&#xff0c;但是现在很多的高清、专业级的视频采集卡都是采用逐行扫描模式&#xff0c;虽然现在的视频设备和数字视频技术已近有了很大的发展和进步&#xff0c;但是在时候中这两种扫盲模式和显示模式一直还存在&#xff0c;在前面我们介绍第四代…

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案ASP.NET Core 从2.2版本开始&#xff0c;采用了一个新的名为Endpoint的路由方案&#xff0c;与原来的方案在使用上差别不大&#xff0c;但从内部运行方式上来说…

ES6学习笔记

ES6学习笔记 在学习ES6的过程中做的一些记录&#xff0c;用于未来的快速回忆。let&const 作用域的概念 ES6新增块级作用域的概念&#xff08;一个大括号括起来的部分就是一个块作用域&#xff09;let与const用于在块级作用域中声明变量&#xff0c;该变量仅在当前块级作用域…

用jenkins创建节点

原料&#xff1a;(1)jre下载链接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html (2)jdk:下载链接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 一、创建SLAVE节点…

统计git仓库一些commit数据

基于git统计某个人的代码提交行数 git log --author"xxx" --prettytformat: --since1.hour.ago --numstat | awk { add $1 ; subs $2 ; loc $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc } - 统计仓…