前言

好久没写 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 版本号的资料请关注Devmax其它相关文章!

linphone-sdk-android版本号生成解析的更多相关文章

  1. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  5. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  6. 适用于iOS和路线的Google Maps SDK

    解决方法库中有一些东西不在文档中,所以如果你正在寻找一个功能,那么值得下载SDK并查看标题.然而,在当前版本1.0.2中,我没有看到任何路由–搜索路线或绘制路线.目前,您唯一的选择可能是使用其他GoogleApi来查找路径,然后正如Lee所说,使用折线绘制它们.

  7. openURL崩溃:iOS 9中可能存在Facebook SDK错误

    也许Facebook的SDK在这个特例上有错误?解决方法我找到了答案看起来它只是一个发布模式问题.通过启用Xcode运行发布版本,我能够调试我的问题.它是由参数sourceApplication引起的,在发布模式下显然需要解包.不知道为什么,但至少我得到它的工作.

  8. ios – 比较两个版本号

    如何比较两个版本号字符串?例如:3.1.1和3.1.2.5.4现在我需要找出3.1.2.5.4是否高于3.1.1但我不知道如何做到这一点.有谁能够帮我?

  9. 使用最新的Flurry SDK和ios4重新启动应用程序

    我真的希望这对我来说只是一个愚蠢的错误.我很高兴使用Flurry但这样的事情会导致我的应用被拒绝.解决方法我写了关于这个的Flurry,他们很快回到我身边,他们会调查这个.大约一个星期后,他们回信并表示他们已经在v2.6中修复了它,现在可用了.我似乎无法重现这个问题.不是说我很棒或者什么,但我还是单枪匹马地解决了这个问题.

  10. ios – Interface Builder无法确定“Main.storyboard”的类型.这可能是由于缺少SDK

    解决方法这没有你想象的那么复杂.该错误是因为您在Main.storyboard的源代码上输错了一些内容,例如我不小心在Main.storyboard的第一个打开标记之前放了一个“”.1)你必须做的是删除Main.storyboard2)转到垃圾箱,将Main.storyboard移动到桌面,用任何文本编辑器打开并修复代码;然后“全选”和“复制”.3)在Xcode上,创建一个全新的Main.storyboard,然后按右键单击文件并选择OpenAs–>源代码,然后粘贴您在剪贴板上的固定代码.4)右键单击文件

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部