linphone-sdk-android版本號生成解析
前言
好久沒寫 linphone-sdk-android 相關(guān)的文章了,本文記錄下筆者分析 linphone-sdk 版本號生成的過程。
分析
注:以下源碼基于 linphone-sdk-android 4.5.26。
修改完 linphone-sdk 的源碼后總是要編譯的,編譯完成后我們就可以得到一個(gè)帶有版本號的 aar 包,那么這個(gè)版本號是從哪里來的呢?
編譯產(chǎn)物
首先看下編譯完成后 build 目錄下的產(chǎn)物,會發(fā)現(xiàn)有兩個(gè) gradle 腳本文件:build.gradle 和 upload.gradle,打開 upload.gradle 腳本文件,在里面發(fā)現(xiàn)如下代碼:println("AAR artefact group is: " + artefactGroupId + ", SDK version 4.5.27"),其中 4.5.27 就是 linphone-sdk 的版本號。
根據(jù)前面文章的分析,編譯產(chǎn)物一般是自動生成的,所以筆者在 linphone-sdk 目錄下搜索 upload.gradle :find . -name '*upload.gradle*':
./cmake/Android/gradle/upload.gradle.cmake ./build/upload.gradle
果然找到了,其中第2行是筆者剛才打開的文件,找到并打開第1行的文件 upload.gradle.cmake,與第2行的文件對比,發(fā)現(xiàn)前者就是后者的模板文件,在 upload.gradle.cmake 文件中發(fā)現(xiàn):println("AAR artefact group is: " + artefactGroupId + ", SDK version @LINPHONESDK_VERSION@"),其中 @LINPHONESDK_VERSION@ 就是 linphone-sdk 的版本號了。因?yàn)榇宋募缶Y是 .cmake,那么聯(lián)想 @LINPHONESDK_VERSION@ 應(yīng)該是個(gè) cmake 參數(shù)。
接下來在 linphone-sdk 目錄下搜索包含 LINPHONESDK_VERSION 字樣的文件:find . -type f | xargs grep 'LINPHONESDK_VERSION',本次查找結(jié)果較多,就不貼出來了,經(jīng)過筆者的對比分析,鎖定了最后一行結(jié)果:./CMakeLists.txt:bc_compute_full_version(LINPHONESDK_VERSION)。
CMake
打開 ./CMakeLists.txt,在前幾行就可以找到如下代碼:
include(bctoolbox/cmake/BcToolboxCMakeUtils.cmake) bc_compute_full_version(LINPHONESDK_VERSION)
其中第2行代碼 bc_compute_full_version 就是計(jì)算 linphone-sdk 版本號的函數(shù),其定義在第1行代碼中的 BcToolboxCMakeUtils.cmake 中,打開 BcToolboxCMakeUtils.cmake 文件并找到 bc_compute_full_version 函數(shù):
function(bc_compute_full_version OUTPUT_VERSION)
# 查找 Git 程序
find_program(GIT_EXECUTABLE git NAMES Git CMAKE_FIND_ROOT_PATH_BOTH)
# 如果找到 Git 程序
if(GIT_EXECUTABLE)
# 執(zhí)行 git describe 命令
execute_process(
COMMAND "${GIT_EXECUTABLE}" "describe"
OUTPUT_VARIABLE GIT_DESCRIBE_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
# parse git describe version
# 解析 git describe 的返回值作為版本號, 通過正則表達(dá)式的分組匹配進(jìn)行解析:4.5.26-alpha-9-gb342a93
# 如果沒有解析到, 輸出錯(cuò)誤信息
if (NOT (GIT_DESCRIBE_VERSION MATCHES "^([0-9]+)[.]([0-9]+)[.]([0-9]+)(-alpha|-beta)?(-[0-9]+)?(-g[0-9a-f]+)?$"))
message(FATAL_ERROR "invalid git describe version: '${GIT_DESCRIBE_VERSION}'")
endif()
# 設(shè)置分組1為主要版本: ([0-9]+) -> 4
set(version_major ${CMAKE_MATCH_1})
# 設(shè)置分組2為次要版本: ([0-9]+) -> 5
set(version_minor ${CMAKE_MATCH_2})
# 設(shè)置分組3為補(bǔ)丁版本: ([0-9]+) -> 26
set(version_patch ${CMAKE_MATCH_3})
# 如果解析到分組4: (-alpha|-beta)? -> -alpha, 則去掉前面的‘-', 得到后面的‘a(chǎn)lpha|beta', 賦值給 version_prerelease
if (CMAKE_MATCH_4)
string(SUBSTRING "${CMAKE_MATCH_4}" 1 -1 version_prerelease)
endif()
# 如果解析到分組5:(-[0-9]+)? -> -9, 則去掉前面的‘-', 得到后面的‘9', 賦值給 version_commit
if (CMAKE_MATCH_5)
string(SUBSTRING "${CMAKE_MATCH_5}" 1 -1 version_commit)
endif()
# 如果解析到分組6: (-g[0-9a-f]+)? -> -gb342a93, 則去掉前面的‘-g', 得到后面的‘b342a93', 賦值給 version_hash
if (CMAKE_MATCH_6)
string(SUBSTRING "${CMAKE_MATCH_6}" 2 -1 version_hash)
endif()
# interpret untagged hotfixes as pre-releases of the next "patch" release
# 如果沒有 version_prerelease, 但是有 version_commit, 認(rèn)為是此補(bǔ)丁程序是下一個(gè)補(bǔ)丁版本的預(yù)發(fā)版本, 即將補(bǔ)丁版本號+1
# 并設(shè)置 version_prerelease 為 "pre"
if (NOT version_prerelease AND version_commit)
math(EXPR version_patch "${version_patch} + 1")
set(version_prerelease "pre")
endif()
# format full version
# 拼接主、次、補(bǔ)丁版本號
set(full_version "${version_major}.${version_minor}.${version_patch}")
# 如果有 version_prerelease
if (version_prerelease)
# 版本號追加 "-pre"
string(APPEND full_version "-${version_prerelease}")
# 如果有 version_commit
if (version_commit)
# 版本號追加 ".9+b342a93"
string(APPEND full_version ".${version_commit}+${version_hash}")
endif()
endif()
# 省略其他檢查邏輯
# 設(shè)置版本號為CMake緩存參數(shù), 完整版本號: 4.5.27-pre.9+b342a93
set(${OUTPUT_VERSION} "${full_version}" CACHE STRING "" FORCE)
endif()
endfunction()
下面就是分析 bc_compute_full_version 函數(shù)了。
首先查找 Git 程序,如果找到 Git 程序,函數(shù)才會繼續(xù),否則無法計(jì)算版本號。
找到 Git 程序后會執(zhí)行 git describe 命令,此命令會基于當(dāng)前可用的 ref 給一個(gè)人類可讀的名稱。
- 如果當(dāng)前最新的 commit 上有 TAG,且 TAG 必須有描述信息或者帶有
-- tags參數(shù),此命令則返回此 TAG 名稱:4.5.26, - 否則返回離當(dāng)前最近的 TAG 名稱 + 此 TAG 之后的提交次數(shù) + 當(dāng)前的 commit hash 值前 7 位:4.5.26-9-gb342a93,其中 'g' 表示是
Git,
具體可查看 git-describe。
假設(shè) git describe 命令返回的是:4.5.26-alpha-9-gb342a93,接下來通過正則表達(dá)式的分組匹配解析返回的結(jié)果。
正則表達(dá)式:
^([0-9]+)[.]([0-9]+)[.]([0-9]+)(-alpha|-beta)?(-[0-9]+)?(-g[0-9a-f]+)?$,
其分為以下 6 組:
([0-9]+)為第一組CMAKE_MATCH_1,對應(yīng) 4,([0-9]+)為第二組CMAKE_MATCH_2,對應(yīng) 5,([0-9]+)為第三組CMAKE_MATCH_3,對應(yīng) 26,(-alpha|-beta)?為第四組CMAKE_MATCH_4,可為空,對應(yīng) -alpha,(-[0-9]+)?為第五組CMAKE_MATCH_5,可為空,對應(yīng) -9,(-g[0-9a-f]+)?為第六組CMAKE_MATCH_6,可為空,對應(yīng) gb342a93,
分組一、分組二和分組三分別作為主要版本、次要版本和補(bǔ)丁版本:4.5.26。
如果解析到分組四: -alpha,則去掉前面的 -,得到后面的 alpha,并賦值給 version_prerelease 變量;如果解析到分組五: -9,則去掉前面的 -,得到后面的 9,并賦值給 version_commit 變量;如果解析到分組六: -gb342a93,則去掉前面的 -g,得到后面的 b342a93,并賦值給 version_hash 變量。
如果沒有 version_prerelease 變量,但是有 version_commit 變量,則認(rèn)為此補(bǔ)丁程序是下一個(gè)補(bǔ)丁版本的預(yù)發(fā)布版本,即將補(bǔ)丁版本號增加一個(gè)版本并賦值version_prerelease 變量為 pre。
拼接主要版本、次要版本和補(bǔ)丁版本為:4.5.27,并賦值給 full_version 變量。
如果有 version_prerelease 變量,則 full_version 變量追加 -pre,此時(shí)版本號為:4.5.27-pre;如果有 version_commit 變量,則版本號再追加 version_commit 和 version_hash 變量的值 .9+b342a93,得到版本號:4.5.27-pre.9+b342a93。
最終得到 linphone-sdk 的版本號:4.5.27-pre.9+b342a93。
總結(jié)
本文記錄了筆者查找 linphone-sdk 生成版本號的過程,同時(shí)分析了版本號的生成邏輯,linphone-sdk 通過獲取 Git 提交記錄和 TAG 來生成版本號:
- 執(zhí)行
git describe命令獲取可讀Git提交信息, - 通過正則表達(dá)式的分組配置模式解析得到的
Git提交信息, - 最后根據(jù)分組信息修正并拼接得到完整的版本號。
利用 Git 提交信息來生成版本號這種方式,我們在寫 SDK 時(shí)或許可以借鑒下。
以上就是linphone-sdk-android版本號生成解析的詳細(xì)內(nèi)容,更多關(guān)于linphone sdk android 版本號的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 實(shí)現(xiàn)按兩次返回鍵退出程序(兩種方法)
這篇文章主要介紹了Android 實(shí)現(xiàn)按兩次返回鍵退出程序(兩種方法)的相關(guān)資料,這里不僅實(shí)現(xiàn)還對原理進(jìn)行了分析,需要的朋友可以參考下2017-07-07
Android中使用DownloadManager類來管理數(shù)據(jù)下載的教程
這篇文章主要介紹了Android中使用DownloadManager類來管理數(shù)據(jù)下載的教程,針對HTTP下文件的下載與保存地址指定等基礎(chǔ)操作作出了詳細(xì)講解,需要的朋友可以參考下2016-04-04
android studio使用SQLiteOpenHelper()建立數(shù)據(jù)庫的方法
這篇文章主要介紹了android studio使用SQLiteOpenHelper()建立數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Android軟鍵盤顯示模式及打開和關(guān)閉方式(推薦)
這篇文章主要介紹了Android軟鍵盤顯示模式及打開和關(guān)閉方式(推薦),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android中封裝SDK時(shí)常用的注解總結(jié)
這篇文章主要給大家總結(jié)了在Android中封裝SDK時(shí)常用的注解的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05
Android Okhttp請求查詢購物車的實(shí)例代碼
下面小編就為大家分享一篇Android Okhttp請求查詢購物車的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

