API动态调用方法及其系统
文献发布时间:2023-06-19 09:24:30
技术领域
本发明属于API调用技术领域,尤其涉及一种API动态调用方法及其系统。
背景技术
软件平台(如OTA车端软件平台)通常有一套复杂的软件流程,为了将平台应用程序适配到不同设备厂商的不同设备中(如车厂的T-BOX或网关等),软件平台会给设备厂商定义一套统一的API(如读取和控制车辆状态的API),设备厂商则将所有API以动态链接库的方式提供给软件平台的应用程序调用。
在应用程序开发过程中,设备厂商会根据开发进度,多次提供动态链接库,不同设备厂商也会提供各自的动态链接库,但每个库中会存在有部分接口实现不稳定的问题,而应用程序希望每个API都能返回可靠的数据,以确保应用程序的执行流程不受影响,在自动化测试过程中,这点尤为重要。故往往需要依赖设备厂商提供一个完整或者说整体较优的动态链接库,但是,这样会极大影响开发效率,导致项目进度缓慢。
发明内容
基于此,针对上述技术问题,提供一种API动态调用方法及其系统。
为解决上述技术问题,本发明采用如下技术方案:
一方面,提供一种API动态调用方法,包括:
S101、将所有动态链接库加载至内存,并通过配置信息生成API来源数据;
S102、响应于应用程序的请求,根据所述API来源数据,指定与被请求API对应的来源动态链接库执行所述被请求API,所述来源动态链接库为所述所有动态链接库中的其中一个;
同时,实时监测所述配置信息是否被修改,若是,则执行步骤S103;
S103、释放所有动态链接库,并执行步骤101重新生成API来源数据。
另一方面,提供一种API动态调用系统,包括存储模块,所述存储模块包括由处理器加载并执行的指令,所述指令在被执行时使所述处理器执行上述一种API动态调用方法。
本发明在配置信息中预先指定各API较优的来源动态链接库,在某API被请求后,通过指定的来源动态链接库执行该API,当该来源动态链接库中的API执行效果不理想时,通过修改后的配置信息重新指定来源动态链接库,实现API的动态调用,使得应用程序开发过程中,不再依赖一个完整的API库,并且不需要重启应用程序来重新加载动态连接库,极大地提高了开发效率,推进了项目进度。
附图说明
下面结合附图和具体实施方式本发明进行详细说明:
图1为本发明的流程图。
具体实施方式
如图1所示,本说明书实施例提供一种API动态调用方法,该方法由API多路选择器实现,API多路选择器包括配置解析器(Config Parser)、动态库加载器(Library Loader)、配置监视器(Config Monitor)、锁模块(Locker)以及API执行接口(API Executor)。
本发明方法包括:
S101、将所有动态链接库加载至内存,并通过配置信息生成API来源数据。
其中,所有动态链接库是指不同的设备厂商提供的动态链接库以及同一个设备厂商在不同时期提供的动态链接库,这些动态链接库中封装了应用程序需要调用的所有API。
由配置解析器以及动态库加载器负责生成API来源数据。具体过程如下:
1、配置解析器从配置信息中解析出API与来源动态链接库的对应关系。
2、将对应关系暂存在内存中。在本实施例中,以API标识以及动态链接库标识表示上述对应关系,对应关系通过数组暂存在内存中。
API标识以及动态链接库标识可以分别为API名称以及动态链接库名称,如:
API_Name1=Lib_A
API_Name2=Lib_B
…
数组的定义如下:
其中,“api”对应某个API名称;“library”对应该API的来源动态链接库名称。
当然,也可以用其它的数据结构来表示上述对应关系,如链表或哈希表等。
3、动态库加载器将所有动态链接库加载至内存后,根据内存中的上述对应关系,将每个API绑定至对应的来源动态链接库的API实现指针上。
绑定关系的数据结构:
其中,“api”是某个API名称,“hdlr”是该API的实现指针。
所有API是预先规划和定义的,我们将每一个API以函数指针的方式声明在单独的头文件中,API多路选择器在编译期间加载该头文件。
在本实施例中,上述对应关系以及绑定关系构成上述API来源数据。
S102、API执行接口响应于应用程序的请求,根据API来源数据,指定与被请求的API对应的来源动态链接库执行被请求API,来源动态链接库为上述所有动态链接库中的其中一个。
应用程序需要调用统一的API执行接口,发送API请求。
API执行接口为API多路选择器为应用程序提供的一个统一的执行所有API的接口,以宏接口的方式呈现,应用程序需要加载API多路选择器,然后使用API执行接口发送API请求,API执行接口内部完成了API名称匹配、获取和释放锁、执行对应API的功能:
#defineAPI_EXEC(API,...)\
…
其中,“API_EXEC”是统一的调用入口名称,“api”是需要调用的API名称,“...”是可变长参数,不同API具有不同的参数。
较佳地,步骤102进一步包括:
根据预设的锁配置,判断被指定的来源动态链接库是否支持多线程重入,若是,则对该来源动态链接库施加全局锁机制(库级别锁),若否,则对被请求API施加局部锁(API锁)机制。
由锁模块负责施加全局锁机制或者局部锁机制,锁配置可以预设在上述配置信息中。
设备商提供的动态链接库可能支持多线程重入或者不支持多线程重入,多线程重入是指一个应用程序的多个线程可以同时调用某个动态链接库的API。
当动态链接库支持多线程重入时,该动态链接库内的所有API可以同时被多次调用,我们就用库级别锁,只要该库内任意一个API被调用,就持锁,再有API被调用时,如果锁已被持有,就不需要再持锁,但会用一个计数器来保存正在执行的API个数,计数器跟随该库内正在执行API数量动态增减,等最后一个API调用完成了,计数器减到0,则释放库级别锁。
当动态链接库不支持多线程重入时,我们使用API锁,该动态链接库中任何一个API在被执行前进行加锁,调用完成后释放锁,保证API被同一个应用程序多次请求后,可以按顺序执行。
API锁有多种机制,在本实施例中,我们使用互斥锁机制:
1、以阻塞的方式获取API锁(附加超时机制)。
2、获取到锁,执行API。
3、执行完成后,释放API锁。
在步骤S101以及S102执行过程中,配置监视器实时监测配置信息是否被修改,若是,则执行步骤S103。
在本实施例中,配置信息保存于数据库或者配置文件中(如ini文件)。以独立线程的方式实时监测配置信息是否被修改:通过数据库的变化通知机制或者Linux平台的inotify机制进行监测。
在实际应用场景中,从配置信息中解析出API与来源动态链接库的对应关系只是人为设定的较优的来源动态链接库,如API_Name1的API可能从Lib_A库中执行效果较好,API_Name2的API可能从Lib_B库中执行效果较好,但是,在执行过程可能效果并不如预期,此时,可以修改配置信息,如可以通过VI等工具对ini文件进行修改和保存,为API重新指定来源动态链接库,尝试通过重新指定的来源动态链接库来执行该API。
具体地,配置监视器监测到配置信息被修改后,需要全局锁和局部锁的状态决定更新API来源数据的时机,具体过程如下:
当被指定的来源动态链接库支持多线程重入时,判断该来源动态链接库是否持有全局锁,若是,则等待该全局锁释放后,执行步骤103,若否,则直接执行步骤103。
当被指定的来源动态链接库不支持多线程重入时,判断被请求API是否持有局部锁,若是,则等待该局部锁释放后,执行步骤103,若否,则直接执行步骤103。
S103、释放所有动态链接库,并执行步骤101重新生成API来源数据。
本发明在配置信息中预先指定各API较优的来源动态链接库,在某API被请求后,通过指定的来源动态链接库执行该API,当该来源动态链接库中的API执行效果不理想时,通过修改后的配置信息重新指定来源动态链接库,实现API的动态调用,使得应用程序开发过程中,不再依赖一个完整的API库,极大地提高了开发效率,推进了项目进度。
较佳地,在本实施例中,上述所有动态链接库中具有模拟库,模拟库模拟特定API的实现行为以及反馈结果,特定API与模拟库的对应关系预先设置于配置信息中,也可以根据执行效果进行修改。
特定API是指其它动态链接库均未封装,或者其它动态链接库虽然已封装但是执行效果都不理想,当应用程序请求调用特定API时,根据配置信息,通过模拟库模拟其实现行为以及反馈结果,使得应用程序能够接收到正常的反馈结果,从而不影响应用程序的执行流程,进一步提高了应用程序的开发效率。
基于同一发明构思,本说明书实施例还提供一种API动态调用系统,包括存储模块,存储模块包括由处理器加载并执行的指令(程序代码),指令在被执行时使处理器执行本说明书上述API动态调用方法部分中描述的根据本发明各种示例性实施方式的步骤。
其中,存储模块可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)和/或高速缓存存储单元,还可以进一步包括只读存储单元(ROM)。
可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
但是,本技术领域中的普通技术人员应当认识到,以上的实施例仅是用来说明本发明,而并非用作为对本发明的限定,只要在本发明的实质精神范围内,对以上所述实施例的变化、变型都将落在本发明的权利要求书范围内。
- API动态调用方法及其系统
- 一种动态库的API安全调用方法