CN114237742A - 一种动态库的加载编译方法、装置、终端及存储介质 - Google Patents
一种动态库的加载编译方法、装置、终端及存储介质 Download PDFInfo
- Publication number
- CN114237742A CN114237742A CN202111510979.3A CN202111510979A CN114237742A CN 114237742 A CN114237742 A CN 114237742A CN 202111510979 A CN202111510979 A CN 202111510979A CN 114237742 A CN114237742 A CN 114237742A
- Authority
- CN
- China
- Prior art keywords
- dynamic library
- loading
- library
- target
- dynamic
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本发明实施例提供了一种动态库的加载编译方法、装置、终端及存储介质。本发明实施例中,在代码编译时,主动通过解析动态库加载标识对应的目标动态库加载的依赖关系,确定成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序,将基于上述加载顺序生成的加载代码插入动态库加载标识之前,这样,就可以在加载目标动态库之前,先获取目标动态库的加载代码,从而可以获取各非基础动态库对应的加载顺序,从而可以依据该顺序依次加载所需的非基础动态库,为目标动态库创造加载环境,从而可以保证目标动态库在程序运行时的正常加载,在一定程度上提升了动态库加载成功率。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种动态库的加载编译方法、装置、终端及存储介质。
背景技术
当前,大多数安卓应用都会使用动态库,这不仅可以在底层共享代码,还可以完成线上功能的动态下载和更新,同时可以减小安装包的体积,使得程序的应用更为灵活。
其中,动态库包括系统动态库、应用程序(Application,App)基础动态库及应用程序的非基础动态库。一般情况下,系统动态库存放于系统动态库路径下,而App基础动态库存放于App安装后的动态库路径下。在加载动态库时,系统会在系统动态库路径及App安装后的动态库路径下,自动查找相关依赖的动态库。
但是,应用程序的非基础动态库作为应用程序的功能动态库,需要额外通过网络进行下载,且在通过网络下载应用程序的非基础动态库时,由于权限原因,下载的非基础动态库A的存放路径无法设置为系统动态库路径和App安装后的动态库路径,若非基础动态库A依赖于其他非基础动态库B,则在加载非基础动态库A时,因系统自身只会在系统动态库路径和App安装后的动态库路下查找非基础动态库B,但该非基础动态库B又不存在于系统动态库路径和App安装后的动态库路下,也就使得系统无法找到该非基础动态库B,进而导致非基础动态库A加载失败。
发明内容
本发明实施例所要解决的技术问题是提供一种动态库的加载编译方法、装置、终端及存储介质,以解决现有技术中,在需要依赖其他非基础动态库时,应用程序的非基础动态库无法正常加载的技术问题。
为了解决上述问题,本发明是通过如下技术方案实现的:
第一方面,提供一种动态库的加载编译方法,所述方法包括:
在代码编译时,查找动态库加载标识;
获取所述动态库加载标识对应的目标动态库的动态库路径;
解析所述目标动态库,以获取成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序;
根据所述目标动态库的动态库路径、各个所述非基础动态库及所述加载顺序,生成所述目标动态库的加载代码;
将所述加载代码插入至所述动态库加载标识之前,以在加载所述目标动态库之前,根据所述加载代码加载各个所述其他动态库。
第二方面,提供一种组件属性校验装置,所述装置包括:
查找模块,用于在代码编译时,查找动态库加载标识;
获取模块,用于获取所述动态库加载标识对应的目标动态库的动态库路径;
解析模块,用于解析所述目标动态库,以获取成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序;
生成模块,用于根据所述目标动态库的动态库路径、各个所述非基础动态库及所述加载顺序,生成所述目标动态库的加载代码;
插入模块,用于将所述加载代码插入至所述动态库加载标识之前,以在加载所述目标动态库之前,根据所述加载代码加载各个所述非基础动态库。
第三方面,提供一种终端,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上述动态库的加载编译方法中的步骤。
第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述动态库的加载编译方法中的步骤。
与现有技术相比,本发明实施例包括以下优点:
本发明实施例中,在代码编译时,主动通过解析动态库加载标识对应的目标动态库加载的依赖关系,获取成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序,因为按该加载顺序依次加载各非基础动态库可以正常加载目标动态库的,因而将基于上述加载顺序生成的加载代码插入动态库加载标识之前,这样,就可以在加载目标动态库之前,先获取目标动态库的加载代码,从而可以获取各非基础动态库对应的加载顺序,从而可以依据该顺序依次加载所需的非基础动态库,为目标动态库创造加载环境,从而可以保证目标动态库在程序运行时的正常加载,在一定程度上提升了动态库加载成功率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
图1是本发明实施例提供的一种动态库的加载编译方法的流程图;
图2是本发明实施例提供的一种动态库的加载编译方法的执行原理图;
图3是本发明实施例提供的一种动态库的加载编译装置的结构示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
一般情况下,App基础动态库存放于App安装后的动态库路径下。对于这一类非系统动态库,在加载动态库时,系统会在系统动态库路径及App安装后的动态库路径下,自动查找相关依赖的动态库,进而实现App动态库的加载。
现有技术中,为了减小安装包大小,以及在库中有bug时,可以随时更新动态库修复,仍有部分功能动态库需要经网络下载。由于权限原因,这部分动态库在下载后的存放路径无法设置为系统动态库路径和App安装后的动态库路径,而是存储于应用程序的内部存储目录等地方。例如,若网络下载的动态库包括A和B,如果A依赖于B,因系统是无法找到动态库B,也就无法获取动态库B的加载路径,从而导致动态库A加载不成功。
对于上述问题,在Linux系统中通过设置环境变量LD_LIBRARY_PATH的方式可以解决,但因为安卓系统不支持上述方式,因为当启动App时,系统只是孵化了Zygote进程,并且在孵化进程时,其对应的动态库链接器会复制一份系统的环境变量,而系统的环境变量并不会发生变更,使得上述方式无法更新LD_LIBRARY_PATH,也就无法解决依赖加载的问题。
对于上述问题,本申请实施例提供了一种动态库的加载编译方法,请参阅图1,图1是本发明实施例提供的一种动态库的加载编译方法的流程图,如图1所示,该方法可以包括:
S100、在代码编译时,查找动态库加载标识。
本发明实施例中,在进行应用程序的代码编译时,遍历代码,查找动态库加载标识。
其中,动态库加载标识为确定需要调用动态库的标识;因为在需要调用动态库加载标识对应的目标动态库时,需要引入库函数进行调用,上述动态库加载标识也即可以为库函数,因而上述步骤具体包括:在代码编译时,遍历代码查找库函数,以作为所述动态库加载标识。上述库函数具体可以为dlopen、System.load、System.loadLibrary等。
例如,在遍历代码查找动态库加载标识时,可以先遍历代码查找关键方法库函数dlopen,在查询到库函数dlopen时,说明该处需要调用动态库。
步骤S200、获取所述动态库加载标识对应的目标动态库的动态库路径。
上述步骤S200中,因为在需要加载作为非基础动态库的目标动态库时,在该目标动态库的动态库加载标识后即会写入该目标动态库的动态库路径,所以在查找到动态库加载标识的情况下,可以直接将动态库加载标识对应的目标动态库的动态库路径取出。
示例地,在将库函数dlopen、System.loadLibrary或System.loadLibrary作为动态库加载标识调用目标动态库时,目标动态库的加载代码分别为:dlopen(libraryPath)、System.load(libraryPath)、System.loadLibrary(libraryPath),其中,libraryPath由路径+库名组成,因而可以直接通过动态库加载标识后的libraryPath获取目标动态库的动态库路径。
步骤S300、解析所述目标动态库,以获取成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序。
在该步骤中,通过二进制文件分析工具objdump解析动态库加载标识对应的目标动态库文件,通过对目标动态库及其依赖动态库的逐层解析,确定目标动态库的依赖关系,进而可以生成成功加载目标动态库时所需要加载的全部非基础动态库,以及各非基础动态库对应的加载顺序。
其中,通过objdump-x解析所需要加载的目标动态库,并在返回的文本DynamicSection中查找标识为NEEDED的动态库,即表示目标动态库所需要依赖的其他动态库;对于标识为NEEDED的动态库,则进一步通过objdump-x进行解析,直至返回的文本DynamicSection中未查找到标识为NEEDED的动态库,从而确定目标动态库的依赖关系。
例如,非基础动态库A没有任何依赖,且通过解析确定动态库B依赖了A,因为在系统路径下无法查找到A,因而无法直接加载动态库B。但是,如果知道了B依赖A,先加载A,然后再加载B,这种就可以成功加载B了,上述先主动加载动态库B所依赖的非基础动态库A,再加载动态库B的顺序即是可以成功加载动态库B的加载顺序。
步骤S400、根据所述目标动态库的动态库路径、各个所述非基础动态库及所述加载顺序,确定所述目标动态库的加载代码。
在该步骤中,可以按照可成功加载目标动态库的各其他动态库的加载顺序,生成加载代码,在执行该加载代码时,会按上述加载顺序依次加载各非基础动态库。
具体地,针对各其他动态库中的每一个第二动态库,分别在库函数中写入该第二动态库的动态库路径及库名,生成该第二动态库的子加载代码,然后按加载的先后顺序,将各第二动态库的子加载代码通过分号依次组合,即生成上述加载代码;其中,因为同一应用程序的非基础动态库的动态库路径相同,因而在第二动态库为非基础动态库时,可以直接将目标动态库的动态库路径作为第二动态库的动态库路径。
步骤S500、将所述加载代码插入至所述动态库加载标识之前,以在加载所述目标动态库之前,根据所述加载代码加载各个所述非基础动态库。
在该步骤中,即将上述加载代码插入动态库加载标识之前,具体可以是插入关键方法库函数前面,完成对目标动态库的依赖代码的注入。
其中,因为在执行上述该加载代码时,会先获取目标动态库的加载代码,从而可以获取各非基础动态库对应的加载顺序,然后按上述加载顺序依次加载目标动态库所依赖的各其他非基础动态库,创造目标动态库的加载环境,从而保证可以成功加载目标动态库。
示例地,如果库A依赖B,B依赖C,C无依赖,若直接通过dlopen(A)调用动态库A显然是无法成功的;而在分析出依赖关系后,根据依赖关系生成代码段dlopen(C);dlopen(B);其中,由于B依赖C,C无依赖,所以生成的代码段是加载C在前,构建应用程序时通过应用程序的构建文件gradle将代码段“dlopen(C);dlopen(B)”插入到dlopen(A)之前,这样App安装后,执行到需要加载目标库A的代码逻辑时,就会先执行代码段“dlopen(C)”加载C,再执行代码段“dlopen(B)”加载B,最后执行代码段“dlopen(A)”,即可成功加载目标库A了。
综上所述,在本实施例中,在代码编译时,主动通过解析动态库加载标识对应的目标动态库加载的依赖关系,确定成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序,因为按该加载顺序依次加载各其他非基础动态库可以正常加载目标动态库的,因而将基于上述加载顺序生成的加载代码插入动态库加载标识之前,这样,就可以在加载目标动态库之前,先获取目标动态库的加载代码,从而可以获取各非基础动态库对应的加载顺序,从而可以依据该顺序依次加载所需的非基础动态库,为目标动态库创造加载环境,从而可以保证目标动态库在程序运行时的正常加载,在一定程度上提升了动态库加载成功率。
在实际应用中,该本申请实施例所提供的方法由构建文件Gradle执行,在项目编译时,构建文件Gradle会调用该方法,然后在检测到有代码加载了动态库且该动态库又依赖其他动态库时,即自动在该动态库加载代码前,插入相关依赖的其他动态库的加载代码。
可选地,在一种可实现方式中,上述步骤S300,可以包括步骤S301~步骤S303:
步骤S301、解析所述目标动态库,生成所述目标动态库的依赖关系树;其中,所述依赖关系树中,所述目标动态库置于所述依赖关系树的根节点处,所述依赖关系树的叶节点处的动态库为未依赖其他非基础动态库的非基础动态库。
在该步骤中,通过解析动态库加载标识对应的目标动态库,确定其对其他动态库的依赖情况,也即分析在成功加载目标动态库时所需要依次先后加载的所有其他非基础动态库,然后根据该依赖情况生成以该目标动态库为根节点,以上述所有其他动态库中未依赖其他非基础动态库的非基础动态库为叶节点的依赖关系树,从而将目标动态库的依赖关系以树的形式展开。
步骤S302、按由子节点到父节点的顺序,遍历所述依赖关系树,确定由所述依赖关系树中各叶节点行进至所述依赖关系树中根节点的行进路径。
在该步骤中,由于上述依赖关系树种,叶节点的动态库为未依赖其他非基础动态库的动态库,也即是没有任何依赖的,其可以直接通过指定路径加载,因而首先加载叶节点的动态库,在叶节点处的依赖库已经加载完成时,其对应的父节点的也即可以加载,这样层层向上加载,直至加载根节点的动态库,上述加载过程,也即是由各叶节点处行进依赖关系树中根节点处的行进路径,按上述行进路径加载相应节点处的动态库,即可成功实现目标动态库的加载。
步骤S303、根据所述行进路径,确定成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序。
在该步骤中,记录上述行进路径所经过节点的动态库及对应的行进顺序,即可以确定可以成功加载目标动态库时,所需要加载的各个其他非基础动态库及对应的加载顺序。
上述实现方式中,通过构建依赖关系树的方式明确目标动态库依赖加载的各非基础动态库,进而根据该依赖关系树可以确定出成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序。
可选地,在一种具体实现方式中,上述步骤301可以包括步骤S3011~步骤S3015:
步骤S3011、将所述目标动态库置于所述依赖关系树的根节点,并将所述根节点确定为当前节点。
该步骤为构建目标动态库的依赖关系树的开始步骤,该步骤中,将目标动态库置于其所需要构建的依赖关系树的根节点处,也即以目标动态库为根节点开始构建树状结构的依赖关系网,因而需要先将根节点作为当前节点进行树状分裂。
步骤S3012、解析确定所述当前节点处的动态库依赖的各第一动态库。
该步骤中,通过objdump-x对当前节点处的动态库进行解析,在返回的文本Dynamic Section中查找标识为NEEDED的动态库,即表示当前节点处的动态库所需要依赖的其他动态库;对于标识为NEEDED的动态库,则进一步通过objdump-x进行解析,直至返回的文本Dynamic Section中未查找到标识为NEEDED的动态库,从而确定当前节点处的动态库所依赖的各第一动态库。例如,在当前节点为根节点,也即为目标动态库时,先确定目标动态库所直接依赖的各个动态库,确定上述各第一动态库。
步骤S3013、将各所述第一动态库分别置于当前节点的各个子结点。
该步骤中,在确定了当前节点处的动态库所直接依赖的各个第一动态库后,将各个第一动态库分别标记为当前节点的各个子节点对应的动态库。
步骤S3014、在所述第一动态库未依赖非系统动态库的情况下,结束对所述第一动态库所在子节点的分裂,并将所述第一动态库标记为叶节点。
该步骤中,在第一动态库未依赖非基础动态库的情况下,也即在第一动态库为非基础动态库且该第一动态库未依赖其他动态库时,或者在第一动态库为非基础动态库且该第一动态库只依赖系统动态库时,或者在第一动态库为非基础动态库且该第一动态库依赖基础动态库时,结束对该第一动态库所在子节点的分裂,并将第一动态库标记为叶节点。
其中,当一个动态库没有任何依赖时,因为下载路径是预设好的,无论其在什么路径,都可以加载成功;而在第一动态库为非基础动态库且该第一动态库只依赖系统动态库时,或者在第一动态库为非基础动态库且该第一动态库依赖基础动态库,因为系统动态库及基础动态库是已经保存在系统中的,不会依赖非基础动态库,系统保证可以加载,也即可以保证第一动态库的成功加载。
步骤S3015、在所述第一动态库依赖非基础动态库的情况下,将所述第一动态库所在子结点更新为所述当前节点,并继续执行解析所述当前节点处的动态库依赖的各第一动态库的步骤。
该步骤中,在第一动态库依赖第二动态库,且该第二动态库为非基础动态库的情况下,因为不清楚第二动态库的依赖情况,因而对当前节点进行更新,并将该第一动态库所在子结点更新作为当前节点,然后继续执行解析确定当前节点处的动态库所依赖的各动态库,也即可进行分析确定上述各第二动态库的依赖情况,直至各子节点均被标记为叶节点,从而完成对依赖关系树的构建。
也即通过解析目标动态库依赖的每个动态库,生成依赖关系树,保证叶节点的动态库是没有任何依赖的,然后从叶节点开始,先加载没有任何依赖的动态库,然后加载父节点,依次往上加载,最终就可以加载根节点的目标动态库了。
可选地,在另一种具体实现方式中,在上述步骤S3015之前,还包括步骤S3001~步骤S3002:
步骤S3001、在所述第一动态库已解析的情况下,记录所述第一动态库所依赖的动态库。
该步骤中,即判定当前的第一动态库是否已经解析确定过其依赖情况;在第一动态库已解析的情况下,在当前节点之前的节点处标记有该第一动态库的依赖关系,即标记有其所依赖的各动态库及其所依赖的各动态库的依赖情况,因而可以直接引用记录该第一动态库所依赖的动态库,而无需重复解析。
步骤S3002、在所述第一动态库未解析的情况下,则进入将所述当前节点更新为所述第一动态库所在子结点的步骤。
在该步骤中,只有在第一动态库依赖其他动态库,且第一动态库未经过解析时,才将当前节点更新为该第一动态库所在子结点,进而可以确定其所依赖的各动态库的具体依赖情况。
上述具体实现方式中,在第一动态库已解析的情况下,直接引用记录该第一动态库所依赖的动态库,可以避免对第一动态库的重复解析确定其依赖关系,从而加快依赖关系树的构建。
请参阅图2,示出了本申请实施例所提供的动态库的加载编译方法的执行原理图。
如图2所示,在步骤S211中,在项目开始构建时,遍历代码,找到关键方法dlopen,将动态库路径取出;
在步骤S212中,使用objdump解析此动态库,查看其依赖情况,如果此动态库依赖了非系统库的其他动态库,那么记录此动态库,并使用objdump(二进制文件分析)解析其依赖的动态库;
在步骤S213中,判断是否依赖了非系统库的其他非基础动态库,是则进入步骤S214,否则进入步骤S216中;
在步骤S214中,判断该库是否已经解析过,也即判断是否有该库的解析依赖记录,是则进入步骤S215中,否则重新进入步骤S212中;
在步骤S215中,记录该库依赖的动态库;
在步骤S216中,标记此库为叶节点;
在步骤S217中,根据记录的动态库及叶节点,可以生成一个依赖关系树;
在步骤S218中,遍历依赖关系树,并根据依赖关系树生成加载代码;
在步骤S219中,将生成的加载代码,插入到库函数dlopen前,完成依赖代码的注入。
可选地,本发明实施例还提供了一种动态库的加载编译装置,如图3所示,所述装置包括:
查找模块31,用于在代码编译时,查找动态库加载标识;
获取模块32,用于获取所述动态库加载标识对应的目标动态库的动态库路径;
解析模块33,用于解析所述目标动态库,以获取成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序;
第二确定模块34,用于根据所述目标动态库的动态库路径、各个所述非基础动态库及所述加载顺序,确定所述目标动态库的加载代码;
插入模块35,用于将所述加载代码插入至所述动态库加载标识之前,以在加载所述目标动态库之前,根据所述加载代码加载各个所述非基础动态库。
在本实施例中,在代码编译时,主动通过解析动态库加载标识对应的目标动态库加载的依赖关系,确定成功加载目标动态库时所需要加载的各个其他非基础动态库及对应的加载顺序,因为按该加载顺序依次加载各非基础动态库后即可以正常加载目标动态库的,因而将基于上述加载顺序生成的加载代码插入动态库加载标识之前,这样,就可以在加载目标动态库之前,先获取目标动态库的加载代码,从而可以获取各非基础动态库对应的加载顺序,从而可以依据该顺序依次加载所需的非基础动态库,为目标动态库创造加载环境,从而可以保证目标动态库在程序运行时的正常加载,在一定程度上提升了动态库加载成功率。
可选地,所述的装置中,所述解析模块33包括:
解析单元,用于解析所述目标动态库,以生成所述目标动态库的依赖关系树;其中,所述依赖关系树中,所述目标动态库置于所述依赖关系树的根节点处,所述依赖关系树的叶节点处的动态库为未依赖其他非基础动态库的非基础动态库;
第一确定单元,用于按由子节点到父节点的顺序,遍历所述依赖关系树,确定由所述依赖关系树中各叶节点行进至所述依赖关系树中根节点的行进路径;
第二确定单元,用于根据所述行进路径,确定成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序。
可选地,所述的装置中,所述解析单元包括:
第一确定子单元,用于将所述目标动态库置于所述依赖关系树的根节点,并将所述根节点确定为当前节点;
第二确定子单元,用于解析所述当前节点处的动态库依赖的各第一动态库;
分裂子单元,用于将各所述第一动态库分别置于当前节点的各个子结点;
标记子单元,用于在所述第一动态库未依赖非系统动态库的情况下,结束对所述第一动态库所在子节点的分裂,并将所述第一动态库标记为叶节点;
更新子单元,用于在所述第一动态库依赖非系统动态库的情况下,将所述第一动态库所在子结点更新为所述当前节点,并继续执行解析所述当前节点处的动态库依赖的各第一动态库的步骤。
可选地,所述的装置中,所述解析单元还包括:
记录子单元,用于在将所述当前节点更新为所述第一动态库所在子结点的步骤之前,在所述第一动态库已解析的情况下,记录所述第一动态库所依赖的动态库;
迭代子单元,用于在所述第一动态库未解析的情况下,则执行将所述当前节点更新为所述第一动态库所在子结点的步骤。
可选地,所述的装置中,所述查找模块31,具体用于在代码编译时,遍历代码查找库函数,以作为所述动态库加载标识。
可选的,本发明实施例还提供一种终端,包括处理器,存储器,存储在存储器上并可在所述处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述动态库的加载编译方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
可选的,本发明实施例还提供一种存储介质,存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述动态库的加载编译方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所述权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种动态库的加载编译方法、装置、终端及存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种动态库的加载编译方法,其特征在于,包括:
在代码编译时,查找动态库加载标识;
获取所述动态库加载标识对应的目标动态库的动态库路径;
解析所述目标动态库,以获取成功加载所述目标动态库时所需要加载的各个非基础动态库及对应的加载顺序;
根据所述目标动态库的动态库路径、各个所述非基础动态库及对应的加载顺序,生成所述目标动态库的加载代码;
将所述加载代码插入至所述动态库加载标识之前,以在加载所述目标动态库之前,根据所述加载代码加载各个所述非基础动态库。
2.根据权利要求1所述的方法,其特征在于,解析所述目标动态库,以获取成功加载所述目标动态库时所需要加载的各个非基础动态库及对应的加载顺序,包括:
解析所述目标动态库,以生成所述目标动态库的依赖关系树;其中,所述依赖关系树中,所述目标动态库置于所述依赖关系树的根节点处,所述依赖关系树的叶节点处的动态库为未依赖其他非基础动态库的非基础动态库;
按由子节点到父节点的顺序,遍历所述依赖关系树,确定由所述依赖关系树中各叶节点行进至所述依赖关系树中根节点的行进路径;
根据所述行进路径,确定成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序。
3.根据权利要求2所述的方法,其特征在于,解析所述目标动态库,以生成所述目标动态库的依赖关系树,包括:
将所述目标动态库置于所述依赖关系树的根节点,并将所述根节点确定为当前节点;
解析所述当前节点处的动态库依赖的各第一动态库;
将各所述第一动态库分别置于当前节点的各个子结点;
在所述第一动态库未依赖非基础动态库的情况下,结束对所述第一动态库所在子节点的分裂,并将所述第一动态库标记为叶节点;
在所述第一动态库依赖非基础动态库的情况下,将所述第一动态库所在子结点更新为所述当前节点,并继续执行解析所述当前节点处的动态库依赖的各第一动态库的步骤。
4.根据权利要求3所述的方法,其特征在于,在将所述当前节点更新为所述第一动态库所在子结点的步骤之前,所述方法还包括:
在所述第一动态库已解析的情况下,记录所述第一动态库所依赖的动态库;
在所述第一动态库未解析的情况下,则执行将所述当前节点更新为所述第一动态库所在子结点的步骤。
5.根据权利要求1所述的方法,其特征在于,在代码编译时,查找动态库加载标识,包括:
在代码编译时,遍历代码查找库函数,以作为所述动态库加载标识。
6.一种动态库的加载编译装置,其特征在于,所述装置包括:
查找模块,用于在代码编译时,查找动态库加载标识;
获取模块,用于获取所述动态库加载标识对应的目标动态库的动态库路径;
解析模块,用于解析所述目标动态库,以获取成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序;
生成模块,用于根据所述目标动态库的动态库路径、所述非基础动态库及所述加载顺序,生成所述目标动态库的加载代码;
插入模块,用于将所述加载代码插入至所述动态库加载标识之前,以在加载所述目标动态库之前,根据所述加载代码加载各个所述非基础动态库。
7.根据权利要求6所述的装置,其特征在于,所述解析模块包括:
解析单元,用于解析所述目标动态库,以生成所述目标动态库的依赖关系树;其中,所述依赖关系树中,所述目标动态库置于所述依赖关系树的根节点处,所述依赖关系树的叶节点处的动态库为未依赖其他非基础动态库的非基础动态库;
第一确定单元,用于按由子节点到父节点的顺序,遍历所述依赖关系树,确定由所述依赖关系树中各叶节点行进至所述依赖关系树中根节点的行进路径;
第二确定单元,用于根据所述行进路径,确定成功加载目标动态库时所需要加载的各个非基础动态库及对应的加载顺序。
8.根据权利要求7所述的装置,其特征在于,所述解析单元包括:
第一确定子单元,用于将所述目标动态库置于所述依赖关系树的根节点,并将所述根节点确定为当前节点;
第二确定子单元,用于解析所述当前节点处的动态库依赖的各第一动态库;
分裂子单元,用于将各所述第一动态库分别置于当前节点的各个子结点;
标记子单元,用于在所述第一动态库未依赖非基础动态库的情况下,结束对所述第一动态库所在子节点的分裂,并将所述第一动态库标记为叶节点;
更新子单元,用于在所述第一动态库依赖非基础动态库的情况下,将所述第一动态库所在子结点更新为所述当前节点,并继续执行解析所述当前节点处的动态库依赖的各第一动态库的步骤。
9.一种终端,其特征在于,包括处理器,存储器,存储在存储器上并可在所述处理器上运行的计算机程序,该计算机程序被处理器执行时实现如权利要求1~5任一所述动态库的加载编译方法中的步骤。
10.一种存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1~5任一所述动态库的加载编译方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111510979.3A CN114237742B (zh) | 2021-12-10 | 2021-12-10 | 一种动态库的加载编译方法、装置、终端及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111510979.3A CN114237742B (zh) | 2021-12-10 | 2021-12-10 | 一种动态库的加载编译方法、装置、终端及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114237742A true CN114237742A (zh) | 2022-03-25 |
CN114237742B CN114237742B (zh) | 2023-09-01 |
Family
ID=80754776
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111510979.3A Active CN114237742B (zh) | 2021-12-10 | 2021-12-10 | 一种动态库的加载编译方法、装置、终端及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114237742B (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6219825B1 (en) * | 1995-01-10 | 2001-04-17 | Hewlett-Packard Company | Profile based optimization of shared libraries |
US20050144608A1 (en) * | 2003-12-26 | 2005-06-30 | Hiroshi Oyama | Operating system allowing running of real-time application programs, control method therefor, and method of loading dynamic link libraries |
WO2009083732A1 (en) * | 2007-12-31 | 2009-07-09 | Symbian Software Limited | Preloading dynamic link libraries |
US20170031662A1 (en) * | 2014-05-27 | 2017-02-02 | Hewlett Packard Enterprise Development Lp | Distributed compilation of statically typed languages |
CN109376087A (zh) * | 2018-10-22 | 2019-02-22 | 北京奇艺世纪科技有限公司 | 一种软件测试方法、装置及电子设备 |
CN109933350A (zh) * | 2019-03-07 | 2019-06-25 | 江苏通付盾信息安全技术有限公司 | 在应用中嵌入代码的方法、装置及电子设备 |
CN110297643A (zh) * | 2019-06-04 | 2019-10-01 | 平安科技(深圳)有限公司 | 应用程序注入动态库的方法、装置、设备及存储介质 |
CN111984342A (zh) * | 2020-09-03 | 2020-11-24 | 科大讯飞股份有限公司 | 一种加载动态链接库的方法和相关装置 |
US20210049007A1 (en) * | 2019-08-16 | 2021-02-18 | Bank Of America Corporation | Electronic system for dynamic generation of dependency libraries associated with disparate frameworks |
CN113204385A (zh) * | 2021-05-17 | 2021-08-03 | 南京统信软件技术有限公司 | 一种插件加载方法、装置、计算设备及可读存储介质 |
WO2021151350A1 (zh) * | 2020-01-31 | 2021-08-05 | 华为技术有限公司 | 一种动态链接库的加载方法及装置 |
-
2021
- 2021-12-10 CN CN202111510979.3A patent/CN114237742B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6219825B1 (en) * | 1995-01-10 | 2001-04-17 | Hewlett-Packard Company | Profile based optimization of shared libraries |
US20050144608A1 (en) * | 2003-12-26 | 2005-06-30 | Hiroshi Oyama | Operating system allowing running of real-time application programs, control method therefor, and method of loading dynamic link libraries |
WO2009083732A1 (en) * | 2007-12-31 | 2009-07-09 | Symbian Software Limited | Preloading dynamic link libraries |
US20170031662A1 (en) * | 2014-05-27 | 2017-02-02 | Hewlett Packard Enterprise Development Lp | Distributed compilation of statically typed languages |
CN109376087A (zh) * | 2018-10-22 | 2019-02-22 | 北京奇艺世纪科技有限公司 | 一种软件测试方法、装置及电子设备 |
CN109933350A (zh) * | 2019-03-07 | 2019-06-25 | 江苏通付盾信息安全技术有限公司 | 在应用中嵌入代码的方法、装置及电子设备 |
CN110297643A (zh) * | 2019-06-04 | 2019-10-01 | 平安科技(深圳)有限公司 | 应用程序注入动态库的方法、装置、设备及存储介质 |
US20210049007A1 (en) * | 2019-08-16 | 2021-02-18 | Bank Of America Corporation | Electronic system for dynamic generation of dependency libraries associated with disparate frameworks |
WO2021151350A1 (zh) * | 2020-01-31 | 2021-08-05 | 华为技术有限公司 | 一种动态链接库的加载方法及装置 |
CN111984342A (zh) * | 2020-09-03 | 2020-11-24 | 科大讯飞股份有限公司 | 一种加载动态链接库的方法和相关装置 |
CN113204385A (zh) * | 2021-05-17 | 2021-08-03 | 南京统信软件技术有限公司 | 一种插件加载方法、装置、计算设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114237742B (zh) | 2023-09-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110442371B (zh) | 一种发布代码的方法、装置、介质及计算机设备 | |
CN106776266B (zh) | 测试工具的配置方法及终端设备 | |
JP2022091685A (ja) | プログラミング言語コーパスの生成 | |
Nam et al. | Marble: Mining for boilerplate code to identify API usability problems | |
CN111984264B (zh) | 一种静态库的生成方法和装置 | |
CN108694049B (zh) | 一种更新软件的方法和设备 | |
US10802803B2 (en) | Intelligent software compiler dependency fulfillment | |
Fazzini et al. | Apimigrator: an api-usage migration tool for android apps | |
CN108897588B (zh) | 一种用于模块间通信的路由方法和路由装置 | |
CN114237742B (zh) | 一种动态库的加载编译方法、装置、终端及存储介质 | |
CN111240987B (zh) | 移植程序检测方法、装置、电子设备及计算机可读存储介质 | |
CN115794214B (zh) | 应用模块元数据管理方法、设备、存储介质及装置 | |
CN116820477A (zh) | 一种依赖管理方法、装置、电子设备及存储介质 | |
CN115048082A (zh) | 微前端系统构建方法、装置、服务器及可读存储介质 | |
CN114089965A (zh) | 基于单体式代码仓库Monorepo的程序开发项目管理方法、装置 | |
CN106802860B (zh) | 无用类检测方法及装置 | |
CN114816449A (zh) | 自动部署方法及装置 | |
CN113641389A (zh) | 基于OpenCPU的软件升级方法、装置及设备 | |
CN111782220A (zh) | 一种文件的检测方法和装置 | |
CN110737429A (zh) | 一种利用Makefile自身的依赖关系的模块化编译方法和装置 | |
US11740895B2 (en) | Generation of software program repair explanations | |
CN117453189B (zh) | 一种应用分层开发的方法、系统、设备及介质 | |
CN110659055B (zh) | 一种安装文件应用程序更新方法、更新检测方法及装置 | |
Juchli et al. | Mining motivated trends of usage of Haskell libraries | |
CN117762777A (zh) | 调控调用结果和应用测试的方法、装置、设备及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |