当前位置:首页 > 谈天说地

linphone-sdk-android版本号生成解析

34资源网2022-09-19338

前言

好久没写 linphone-sdk-android 相关的文章了,本文记录下笔者分析 linphone-sdk 版本号生成的过程。

分析

注:以下源码基于 linphone-sdk-android 4.5.26。

修改完 linphone-sdk 的源码后总是要编译的,编译完成后我们就可以得到一个带有版本号的 aar 包,那么这个版本号是从哪里来的呢?

编译产物

首先看下编译完成后 build 目录下的产物,会发现有两个 gradle 脚本文件:build.gradleupload.gradle,打开 upload.gradle 脚本文件,在里面发现如下代码:println("aar artefact group is: " + artefactgroupid + ", sdk version 4.5.27"),其中 4.5.27 就是 linphone-sdk 的版本号。

根据前面文章的分析,编译产物一般是自动生成的,所以笔者在 linphone-sdk 目录下搜索 upload.gradlefind . -name '*upload.gradle*'

 ./cmake/android/gradle/upload.gradle.cmake
 ./build/upload.gradle

果然找到了,其中第2行是笔者刚才打开的文件,找到并打开第1行的文件 upload.gradle.cmake,与第2行的文件对比,发现前者就是后者的模板文件,在 upload.gradle.cmake 文件中发现:println("aar artefact group is: " + artefactgroupid + ", sdk version @linphonesdk_version@"),其中 @linphonesdk_version@ 就是 linphone-sdk 的版本号了。因为此文件后缀是 .cmake,那么联想 @linphonesdk_version@ 应该是个 cmake 参数。

接下来在 linphone-sdk 目录下搜索包含 linphonesdk_version 字样的文件:find . -type f | xargs grep 'linphonesdk_version',本次查找结果较多,就不贴出来了,经过笔者的对比分析,锁定了最后一行结果:./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 就是计算 linphone-sdk 版本号的函数,其定义在第1行代码中的 bctoolboxcmakeutils.cmake 中,打开 bctoolboxcmakeutils.cmake 文件并找到 bc_compute_full_version 函数:

 function(bc_compute_full_version output_version)
     # 查找 git 程序
     find_program(git_executable git names git cmake_find_root_path_both)
     # 如果找到 git 程序
     if(git_executable)
         # 执行 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 的返回值作为版本号, 通过正则表达式的分组匹配进行解析:4.5.26-alpha-9-gb342a93
         # 如果没有解析到, 输出错误信息
         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()
         # 设置分组1为主要版本: ([0-9]+) -> 4
         set(version_major ${cmake_match_1})
         # 设置分组2为次要版本: ([0-9]+) -> 5
         set(version_minor ${cmake_match_2})
         # 设置分组3为补丁版本: ([0-9]+) -> 26
         set(version_patch ${cmake_match_3})
         # 如果解析到分组4: (-alpha|-beta)? -> -alpha, 则去掉前面的‘-', 得到后面的‘alpha|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, 认为是此补丁程序是下一个补丁版本的预发版本, 即将补丁版本号+1
         # 并设置 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
         # 拼接主、次、补丁版本号
         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()
         # 省略其他检查逻辑
         # 设置版本号为cmake缓存参数, 完整版本号: 4.5.27-pre.9+b342a93
         set(${output_version} "${full_version}" cache string "" force)
     endif()
 endfunction()

下面就是分析 bc_compute_full_version 函数了。

首先查找 git 程序,如果找到 git 程序,函数才会继续,否则无法计算版本号。

找到 git 程序后会执行 git describe 命令,此命令会基于当前可用的 ref 给一个人类可读的名称。

  • 如果当前最新的 commit 上有 tag,且 tag 必须有描述信息或者带有 -- tags 参数,此命令则返回此 tag 名称:4.5.26,
  • 否则返回离当前最近的 tag 名称 + 此 tag 之后的提交次数 + 当前的 commit hash 值前 7 位:4.5.26-9-gb342a93,其中 'g' 表示是 git

具体可查看 git-describe。

假设 git describe 命令返回的是:4.5.26-alpha-9-gb342a93,接下来通过正则表达式的分组匹配解析返回的结果。

正则表达式:

^([0-9]+)[.]([0-9]+)[.]([0-9]+)(-alpha|-beta)?(-[0-9]+)?(-g[0-9a-f]+)?$,

其分为以下 6 组:

  • ([0-9]+) 为第一组 cmake_match_1,对应 4,
  • ([0-9]+) 为第二组 cmake_match_2,对应 5,
  • ([0-9]+) 为第三组 cmake_match_3,对应 26,
  • (-alpha|-beta)? 为第四组 cmake_match_4,可为空,对应 -alpha,
  • (-[0-9]+)? 为第五组 cmake_match_5,可为空,对应 -9,
  • (-g[0-9a-f]+)? 为第六组 cmake_match_6,可为空,对应 gb342a93,

分组一、分组二和分组三分别作为主要版本、次要版本和补丁版本:4.5.26。

如果解析到分组四: -alpha,则去掉前面的 -,得到后面的 alpha,并赋值给 version_prerelease 变量;如果解析到分组五: -9,则去掉前面的 -,得到后面的 9,并赋值给 version_commit 变量;如果解析到分组六: -gb342a93,则去掉前面的 -g,得到后面的 b342a93,并赋值给 version_hash 变量。

如果没有 version_prerelease 变量,但是有 version_commit 变量,则认为此补丁程序是下一个补丁版本的预发布版本,即将补丁版本号增加一个版本并赋值version_prerelease 变量为 pre

拼接主要版本、次要版本和补丁版本为:4.5.27,并赋值给 full_version 变量。

如果有 version_prerelease 变量,则 full_version 变量追加 -pre,此时版本号为:4.5.27-pre;如果有 version_commit 变量,则版本号再追加 version_commitversion_hash 变量的值 .9+b342a93,得到版本号:4.5.27-pre.9+b342a93

最终得到 linphone-sdk 的版本号:4.5.27-pre.9+b342a93

总结

本文记录了笔者查找 linphone-sdk 生成版本号的过程,同时分析了版本号的生成逻辑,linphone-sdk 通过获取 git 提交记录和 tag 来生成版本号:

  • 执行 git describe 命令获取可读 git 提交信息,
  • 通过正则表达式的分组配置模式解析得到的 git 提交信息,
  • 最后根据分组信息修正并拼接得到完整的版本号。

利用 git 提交信息来生成版本号这种方式,我们在写 sdk 时或许可以借鉴下。

以上就是linphone-sdk-android版本号生成解析的详细内容,更多关于linphone sdk android 版本号的资料请关注萬仟网其它相关文章!

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

本文链接:https://www.34l.com/post/22278.html

分享给朋友:

相关文章

用侠肝义胆造句30句

用侠肝义胆造句30句

1、李大哥侠肝义胆,受到四邻的交口称赞。…

苹果X快充PD充电器推荐,现在下载还有优惠券可以领呢

苹果X快充PD充电器推荐,现在下载还有优惠券可以领呢

现在有很多人用的是苹果手机,因为平时有些人不注意使用方式或者使用充电器比较频繁导致损坏。大家都知道苹果手机和安卓手机的充电器是不一样的,不能用安卓手机的充电器充苹果手机。所以,大家如果苹果手机充电器损坏了,需要购买的话就要买个专门的苹果手机…

调整心态温暖哲理经典语录,看这些语录能够调整心态

调整心态温暖哲理经典语录,看这些语录能够调整心态

取得成功是他人不成功时仍在坚持不懈。若自身不作出一点外貌,别人想拉你一把都不知道你的手在哪儿。直至你不会再找我聊,直至你找不着我,直至最终,你一直在某一瞬间猛地想起我。但是,那个时候,被你弄丢的我就确实早已没有了,也再不想要你再找回家了。理…

引流文案微信推广(微商引流推广文案模板)

引流文案微信推广(微商引流推广文案模板)

大家好啊!今天又跟大家分享小技巧啦~往下看↓↓↓ 首先说一下什么样的文案是引流型的?实际上,一句话是将公共域流量定向到您的私有域流量池。其目的是先引流然后慢慢进行信任激活变现。 在标题方面,通常有以下几种类型,今天为大家详细描述一下。 一…

微信开放外链,社交想象力有限

微信开放外链,社交想象力有限

编者按:本文来自新熵,创业邦经授权发布,封面图来自摄图网。 作者|古廿 编辑|伊页 网易云音乐上市,丁磊在现场讲了很多的未来,比如元宇宙。但未来是摸不着看不见的,所以愿意放眼未来的人,多半还要立足脚下。 脚下的立足往往来自两个方面:一…