軟體工程—讓軟體包自帶commitid
軟體開發中軟體版本號是一個重要的概念,而對於工程師軟體版本號所對應的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)
相關文章
- 軟體工程 第一章 軟體與軟體工程軟體工程
- 軟體工程-軟體工程層狀模型(EHM)軟體工程模型
- 軟體工程軟體工程
- 軟體工程--為什麼軟體開發方法論讓你覺得糟糕軟體工程
- 剛入行的軟體測試工程師如何自學軟體測試?工程師
- 軟體工程1軟體工程
- 軟體工程4.18軟體工程
- 軟體工程5.8軟體工程
- 軟體工程5.7軟體工程
- 軟體工程4.28軟體工程
- 軟體工程4.27軟體工程
- 軟體工程5.10軟體工程
- 軟體工程5.9軟體工程
- 軟體工程5.13軟體工程
- 軟體工程5.12軟體工程
- 軟體工程5.11軟體工程
- 軟體工程4.23軟體工程
- 軟體工程4.22軟體工程
- 軟體工程4.21軟體工程
- 軟體工程4.20軟體工程
- 軟體工程4.19軟體工程
- 軟體工程6軟體工程
- win10 自帶的防毒軟體好用麼?win10 自帶的防毒軟體如何使用Win10防毒
- win10自帶防毒軟體在哪裡 win10自帶防毒軟體怎麼開啟Win10防毒
- 【招聘】前端軟體工程師、高階前端軟體工程師前端軟體工程工程師
- Windows 軟體包Windows
- win10自帶防毒軟體如何關閉_關閉win10自帶防毒軟體的方法Win10防毒
- 如何使用windows10自帶解壓軟體 win10有自帶的解壓軟體嗎WindowsWin10
- win10自帶解壓軟體在哪裡 win10有自帶的解壓軟體嗎Win10
- 將 DEB 軟體包轉換成 Arch Linux 軟體包Linux
- 學習高校課程-軟體工程-軟體工程(ch2)軟體工程
- 軟體工程日報軟體工程
- 軟體工程作業軟體工程
- 軟體工程學習軟體工程
- 20240516 軟體工程打卡軟體工程
- 軟體工程大作業軟體工程
- 軟體工程總結軟體工程
- win10有沒有自帶的錄屏軟體,win10自帶錄屏軟體工具在哪裡Win10
- win10自帶安全軟體怎麼關閉 WIN10自帶安全軟體關閉設定方法Win10