linphone-sdk-android版本号生成解析
作者:guodongAndroid 发布时间:2022-10-18 14:43:18
前言
好久没写 linphone-sdk-android
相关的文章了,本文记录下笔者分析 linphone-sdk
版本号生成的过程。
分析
注:以下源码基于 linphone-sdk-android 4.5.26。
修改完 linphone-sdk
的源码后总是要编译的,编译完成后我们就可以得到一个带有版本号的 aar
包,那么这个版本号是从哪里来的呢?
编译产物
首先看下编译完成后 build
目录下的产物,会发现有两个 gradle
脚本文件:build.gradle
和 upload.gradle
,打开 upload.gradle
脚本文件,在里面发现如下代码:println("AAR artefact group is: " + artefactGroupId + ", SDK version 4.5.27")
,其中 4.5.27
就是 linphone-sdk
的版本号。
根据前面文章的分析,编译产物一般是自动生成的,所以笔者在 linphone-sdk
目录下搜索 upload.gradle
:find . -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_commit
和 version_hash
变量的值 .9+b342a93
,得到版本号:4.5.27-pre.9+b342a93
。
最终得到 linphone-sdk
的版本号:4.5.27-pre.9+b342a93
。
来源:https://juejin.cn/post/7143905843124109349
猜你喜欢
- 本文实例为大家分享了Java利用同步块synchronized()保证并发安全的具体代码,供大家参考,具体内容如下package day10
- 短网址,忽然一下子就冒出来的东西,长长的一个URL,提交过去,出来就只有短短的一个URL了,看起来似乎挺神奇,其实简单分析一下,明白其中的原
- 一、Mybatis中的延迟加载1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用associ
- 为什么要使用克隆? 想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。如何实现对象
- java修改JFrame默认字体修改默认字体的方法很简单。首先我们随便写一个按钮出来:import javax.swing.*; publi
- 错误详情:java.lang.NoSuchMethodException: [Lorg.springframework.web.multip
- Java8 HashMap键与Comparable接口最容易使 HashMap 发生哈希冲突的方法是什么呢?我们可以创建一个类,让它的哈希函
- 本文实例为大家分享了Java执行SQL脚本文件到数据库的具体方式,供大家参考,具体内容如下方式一:直接读取SQL脚本文件的内容,然后传递到S
- 本文实例讲述了Java实现的最大匹配分词算法。分享给大家供大家参考,具体如下:全文检索有两个重要的过程:1分词2倒排索引我们先看分词算法目前
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- Maven打包一般可以生成两种包一种是可以直接运行的包,一种是依赖包(只是编译包)。Maven默认打包时jar,如果需要修改其他类型。可以修
- 一、使用JDK生成WSDL的对象类1、cmd进入JDK的bin文件中执行命令 wsimport -keep -p com.demo.clie
- 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言这两天在项目中使用到Java的导入导出功能,以前对这块有一定了解,但是没
- 关于modelandview跳转问题小白刚刚开始学习使用springmvc框架,配置好简单的web.xml文件和springmvc的配置文件
- Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码功能介绍客户端
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- 在Springboot项目中使用分页插件的时候 发现PageHelper插件失效了我导入的是:后来才发<dependency>
- 今天做项目的时候,遇到一个问题,如果我调用某个服务的接口,但是这个服务挂了,同时业务要求这个接口的结果是必须的,那我该怎么办呢,答案是通过h
- 1 StringString:字符串常量,字符串长度不可变。2 StringBufferStringBuffer:字符串变量(Synchro
- 前言在 C# 项目中通过链接方式引入文件可以让我们在项目中使用这些文件中的代码。常见的比如链接 AssemblyInfo.cs 文件,这样我