軟件工程—讓軟件包自帶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.pswp.cn/news/450145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450145.shtml
英文地址,請注明出處:http://en.pswp.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 } - 統計倉…