CN108984223B - 一种程序调用解耦方法、装置、电子设备及存储介质 - Google Patents
一种程序调用解耦方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN108984223B CN108984223B CN201810550126.4A CN201810550126A CN108984223B CN 108984223 B CN108984223 B CN 108984223B CN 201810550126 A CN201810550126 A CN 201810550126A CN 108984223 B CN108984223 B CN 108984223B
- Authority
- CN
- China
- Prior art keywords
- program
- data
- index value
- dependency relationship
- index
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
- G06F8/437—Type checking
-
- 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/44505—Configuring for program initiating, e.g. using registry, configuration files
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请公开了一种程序调用解耦处理方法,属于计算机技术领域,解决现有技术中程序调用解耦时存在导致程序启动效率低下的问题。本申请公开的程序调用解耦方法包括:在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,所述依赖关系数据中至少包括:所述第一元素对应的索引键、所述第一元素依赖的第二元素对应的索引值;通过所述运行时环境获取并调用所述第一元素对应第二元素。本申请公开的程序调用解耦方法通过将程序运行时的依赖关系数据预先写入到程序的二进制数据中,当需要调用存在依赖关系的元素时,才加载依赖关系数据,缩短了程序的启动时间,提升了程序的启动效率。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种程序调用解耦方法、装置,电子设备。
背景技术
软件开发过程中,软件模块或函数之间存在依赖关系时,模块或函数之间就必然存在耦合,理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。+load方法常常被作为解耦信息注入的首选,引入+load可以帮助处理依赖反转等解耦的问题。但与此同时,+load在程序启动时会导致动态加载器提前加载依赖关系对应的类,从而会延长程序启动时间。
综上,现有技术中的程序调用解耦方法至少存在导致程序启动效率低下的缺陷。
发明内容
本申请提供一种程序调用解耦方法,至少解决现有技术中的程序调用解耦方法存在的导致程序启动效率低下的问题。
为了解决上述问题,第一方面,本申请实施例提供了一种程序调用解耦方法,其中,所述程序具有对应的二进制数据,所述二进制数据中包括依赖关系数据,所述方法包括:
在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;
通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;
调用所述索引值对应的所述第二元素。
第二方面,本申请实施例提供了一种程序调用解耦装置,包括:
其中,所述程序具有对应的二进制数据,所述二进制数据中包括依赖关系数据,所述的装置包括:
依赖关系数据加载模块,用于在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;
索引值确定模块,用于通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;
调用模块,用于调用所述索引值对应的所述第二元素。
第三方面,本申请实施例还公开了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现本申请实施例所述的程序调用解耦方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时本申请实施例公开的程序调用解耦方法的步骤。
本申请实施例公开的程序调用解耦方法,通过在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;调用所述索引值对应的所述第二元素,解决了现有技术中的程序调用解耦方法存在的导致程序启动效率低下的问题。本申请实施例公开的程序调用解耦方法,通过将程序运行时的依赖关系数据预先写入到程序的二进制数据中,当需要调用存在依赖关系的元素时,才加载依赖关系数据,缩短了程序的启动时间,提升了程序的启动效率。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例一的程序调用解耦方法流程图;
图2是本申请实施例二的程序调用解耦方法流程图;
图3是本申请实施例三的程序调用解耦装置结构示意图之一;
图4是本申请实施例三的程序调用解耦装置结构示意图之二。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
实施例一
本实施例公开的一种程序调用解耦方法,如图1所示,该方法包括:步骤110至步骤130。
步骤110,在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境。
其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素。
本申请实施例中所述的程序具有对应的二进制数据,所述二进制数据中包括依赖关系数据。本申请实施例中所述的第一元素和第二元素用于表示互不相同的两个元素,所述元素可以为:函数、类、方法、字符、字符串等程序运行过程中需要访问的元素,其中,第一元素指需要依赖其他元素才能执行的元素,第二元素指被依赖的元素。例如,函数A在执行过程中需要依赖字符串B,则A为第一元素,B为第二元素。
具体实施时,在当前程序的二进制数据中,如编译得到的当前程序的可执行文件中,预先写入了当前程序运行时调用的元素之间的依赖关系数据。通常,所述依赖关系数据以键值对应关系的形式按照预设格式存储。其中,所述依赖关系数据中所述第一元素对应的数据作为索引键,该第一元素依赖的第二元素对应的数据作为索引值。具体实施时,所述依赖关系数据中还可以包括索引值的类型信息。
在程序执行过程中,当需要调用第一元素时,当前程序的运行时环境通过调用读取二进制段的方法,将所述程序的二进制数据中的依赖关系数据加载至运行时环境。
步骤120,通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值。
所述运行时环境读取到二进制数据中的依赖关系数据之后,会根据预设格式,对所述依赖关系数据进行解析,确定所述程序执行过程中调用的存在依赖关系的第一元素对应的索引键、每个所述索引键对应的索引值。
步骤130,调用所述索引值对应的所述第二元素。
具体实施时,当前程序的运行时环境根据所述索引值进一步解析所述依赖关系数据,得到所述索引值对应的第二元素,并调用所述第二元素。具体实施时,所述依赖关系数据中还包括所述索引值对应的第二元素类型,所述运行时环境根据所述索引值和所述第二元素类型对进一步解析所述依赖关系数据。
本申请实施例公开的程序调用解耦方法,通过在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;调用所述索引值对应的所述第二元素,解决了现有技术中的程序调用解耦方法存在的导致程序启动效率低下的问题。本申请实施例公开的程序调用解耦方法,通过将程序运行时的依赖关系数据预先写入到程序的二进制数据中,当需要调用存在依赖关系的元素时,才加载依赖关系数据,缩短了程序的启动时间,提升了程序的启动效率。
实施例二
本实施例公开的一种程序调用解耦方法,如图2所示,该方法包括:步骤210至步骤250。
步骤210,根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据。
具体实施时,所述在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境之前,还包括:根据所述程序中第一元素对应的索引键、所述第一元素时依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据;将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。
本申请实施例中的第一元素和第二元素用于表示互不相同的两个元素,所述元素可以为:函数、类、方法、字符、字符串等程序运行过程中需要调用的元素,其中,第一元素指需要依赖其他元素才能执行的元素,第二元素指被依赖的元素。
具体实施时,对于不同的元素类型,生成依赖关系数据的方法有所不同,所述根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据,包括以下至少一项:若第二元素为函数,则将所述第二元素的指针作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;若第二元素为字符串,则将所述第二元素作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;若第二元素为类,则将所述第二元素的名称作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;若第二元素为Objective-C的方法,则将通过系统宏获得的字符串作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据。
下面,分别介绍对于不同的元素类型,生成依赖关系数据的具体方案。
第一种,被依赖的第二元素为C语言的函数。
首先定义依赖关系数据的数据格式。具体实施时,所述依赖关系数据至少包括索引键和索引值,可选的,所述依赖关系数据还可以包括:索引值对应的第二元素的类型、是否为数组等信息。例如,可以将所述依赖关系数据定义为如下结构:
上述数据结构定义中,所述依赖关系数据由两部分组成,第一部分为数据头,第二部分为数据体。数据头中,key表示第一元素对应的索引键,type表示第二元素的类型,isArray表示第二元素是否为数组。数据体中,value表示第二元素对应的索引值。
上述数据结构中的各元素的取值,根据预先约定和当前程序的编译文件确定。例如,key和第二元素的取值根据依赖约定确定;而value可以通过执行编译指令,根据程序编译后得到的二进制数据确定。具体实施时,value的取值为所述第二元素的指针,可以从编译得到的二进制数据中获得。
第二种,被依赖的第二元素为Objective-C的方法。
当第二元素为Objective-C的方法时,可以通过系统宏__func__获得的所述第二元素的名称、类名和方法类型构成的字符串,然后,将所述字符串作为所述第二元素的索引值;最后,由所述索引键和所述索引值构成的依赖关系数据。具体实施时,假设依赖关系数据的结构如前所述,则构成的依赖关系数据中的type的取值用于指示所述索引值对应的第二元素类型为ObjectC方法。
第三种,被依赖的第二元素为字符串。
当第二元素为字符串时,直接将所述字符串作为所述第二元素的索引值;然后,由所述索引键和所述索引值构成的依赖关系数据。具体实施时,假设依赖关系数据的结构如前所述,则构成的依赖关系数据中的type的取值用于指示所述索引值对应的第二元素类型为字符串。
第四种,被依赖的第二元素为类。
当第二元素为类时,直接将类名字作为所述第二元素的索引值;然后,由所述索引键和所述索引值构成的依赖关系数据。具体实施时,假设依赖关系数据的结构如前所述,则构成的依赖关系数据中的type的取值用于指示所述索引值对应的第二元素类型为类。
本申请公开的解耦方法不限于以下几种类型元素的依赖关系,本实施例中仅以以下几种类型进行举例说明。
以上介绍了非数组类型的依赖关系数据确定方法,假设依赖关系数据的结构如前所述,则构成的依赖关系数据中的isArray的取值用于指示第二元素为非数组。在其他实施例中,一个索引键还可以对应多个索引值,多个索引值以数组的形式存储。具体实施时,假设依赖关系数据的结构如前所述,则构成的依赖关系数据中的isArray的取值用于指示第二元素为数组。
步骤220,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。
具体实施时,所述将所述依赖关系数据写入到所述程序编译后生成的二进制数据中,包括:通过编译指令调用二进制段的写入方法,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。例如,预先定义一个写入宏_KLN_DATA_DEFINE(),_KLN_DATA_DEFINE()在接收到写入信息后,使用__attribute__(section())进行写入,宏定义如下所示。
#define_KLN_DATA_DEFINE(HEADER,VALUE)\
__attribute__((used,section(KLN_SEGMENT_SECTION)))static const KLN_DATA KLN_UNIQUE_IDENTIFIER=(KLN_DATA){HEADER,VALUE}
上述宏定义中,KLN_SEGMENT_SECTION为依赖数据KLN_DATA写入的数据段,HEADER表示依赖数的数据头,VALUE表示依赖数的数据体。
具体实施时,数据段通常分为__DATA段(Segment)和__TEXT段,每个段下面有很多的Section。本申请将依赖关系数据写到__DATA段中的预设Section。
步骤230,在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境。
具体实施时,所述在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,包括:获取调用程序中第一元素的操作;响应于所述操作,通过预设的二进制段读取函数,获取所述程序的二进制数据中的依赖关系数据。
具体实施时,当前程序在运行过程中,当调用到依赖其他元素执行的元元素时,如当前程序运行到调用第一元素,所述第一元素依赖第二元素执行,此时,第一元素会通过索引键调用查询当前程序的运行时环境。
所述运行时环境响应所述第一元素的查询操作,通过预设的二进制段读取函数,获取所述程序的二进制数据中的依赖关系数据。以iOS平台为例,运行时环境可以通过调用macho库中提供的二进制段读取函数,将所述依赖关系数据所在的数据段的数据读取到内存中。
具体实施时,运行时环境在获取调用程序中第一元素的操作之后,还可以根据当前程序中依赖其他元素的所有第一元素的索引键,将所有第一元素对应的依赖关系数据全部加载到内存中。
步骤240,通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值。
本申请的实施中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素。在所述运行时环境将依赖关系数据加载到内存中之后,所述运行时环境按照预设依赖关系数据格式,对所述依赖关系数据进行解析,确定所述程序执行过程中调用的存在依赖关系的第一元素对应的索引键、所述索引键对应的索引值、所述索引值对应的第二元素类型、所述索引值对应的第二元素是否为数组等信息中的一项或多项。然后,在解析得到的依赖关系数据中,查询所述索引键对应的索引值。具体实施时,运行时环境查询到的所述索引键所在依赖关系数据结构,并确定该结构中的索引值。
步骤250,调用所述索引值对应的所述第二元素。
进一步的,所述索引键所在依赖关系数据结构中还包括所述索引值对应的第二元素类型。所述运行时环境根据第二元素类型对应的预设索引值声明,对所述索引值进行解析,确定所述索引值对应的第二元素。然后,调用所述索引值对应的所述第二元素。例如,当依赖关系数据显示索引值对应的第二函数类型为函数时,取出索引值(即value)中的内容,将其强转成运行时环境定义的函数类型,并跳转至该函数指针,执行该函数指针对应的函数。再例如,当依赖关系数据显示索引值对应的第二函数类型为Objective-C的方法时,解析编译时写入的包括:方法类型、类名和方法名的字符串得到类名字符串和方法名字符串,使用Objective-C运行时环境,查到对应类的对应方法,组合成预定义的对象返回给第一元素,第一元素方可以通过所述对象得到方法的相关信息,从而执行所述方法。又例如,当依赖关系数据显示索引值对应的第二函数类型为字符串时,编译时写入的索引值为字符串的指针,运行时环境根据字符串的指针,可以找到字符串进行编码后的内容,使用对应的编码方式对其解码,可以得到写入的字符串信息,然后,返回给第一元素。再例如,当依赖关系数据显示索引值对应的第二函数类型为Objective-C的类时,编译时写入的索引值为一个含有类名称的字符串,使用Objective-C的运行时环境对字符串进行解析后,将字符串对应的类返回给第一元素。
例如,第一元素为当前程序中的函数A,第二元素为函数B,函数B在动态库中,函数A在执行过程中需要调用函数B,即函数A依赖函数B。函数A和函数B协商得到的函数A对应的索引键为keyA,当程序调用函数A时,运行时环境通过调用二进制段读函数将写入预设二进制段的函数A对应的依赖关系数据加载到内存,然后,按照预定义的依赖关系数据的数据结构对加载到内存的依赖关系数据进行解析,确定所述依赖关系数据中包括的索引键、与所述索引键对应的索引值、所述索引值对应的第二元素类型以及所述索引值是否为数组的标识。本例中,解析后将得到索引键keyA、keyA对应的索引值,例如表示为valueB、typeB表示索引值对应函数类型、isArray=0表示valueB非数组。之后,运行时环境调用函数B。
本实施例中,以iOS平台为例说明了程序调用解耦方法,本申请公开的程序调用解耦方法还是用于其他平台,例如,安卓平台、windows平台。不同平台写入和读取时调用的编译指令大致相同,例如,iOS使用Clang编译器的编译指令,其他平台可以使用GNU的GCC或者G++等编译器的编译指令,可以达到相同的效果。
本申请实施例公开的程序调用解耦方法,通过根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据,然后,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中,在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值,并调用所述索引值对应的所述第二元素,解决了现有技术中的程序调用解耦方法存在的导致程序启动效率低下的问题。本申请实施例公开的程序调用解耦方法,通过将程序运行时的依赖关系数据预先写入到程序的二进制数据中,当需要调用存在依赖关系的元素时,才加载依赖关系数据,缩短了程序的启动时间,提升了程序的启动效率。
+load是无差别的在启动的时候执行,很多不在启动关键路径上面的依赖也会在这个时候被执行加载,造成了不必要的浪费。本申请公开的程序调用解耦方法充分利用了编译时的数据写入,将需要执行的方法和数据与索引键进行对应,程序执行到需要加载对应索引键的时候,再执行相应的函数或者返回相应的数据,避免了不必要的浪费,大大的节省了程序的启动时间。以需要解耦2000个函数举例,采用本申请公开的程序调用解耦方法对所述2000个函数进行解耦,与采用+load方法相比,本方法节省的执行时间为+load执行时间的80%。
并且,+load在启动时进行依赖或解耦函数的注册,且只能实现函数解耦,而本申请不仅可以实现函数调用时的解耦,还可以实现方法、类和字符数据的解耦,应用场景更多。
实施例三
本实施例公开的一种程序调用解耦处理装置,如图3所示,其中,所述程序具有对应的二进制数据,所述二进制数据中包括依赖关系数据,所述的装置包括:
依赖关系数据加载模块310,用于在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;
索引值确定模块320,用于通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;
调用模块330,用于调用所述索引值对应的所述第二元素。
可选的,如图4所示,所述装置还包括:
依赖关系数据确定模块340,用于根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据;
依赖关系数据写入模块350,用于将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。
可选的,所述依赖关系数据写入模块350进一步用于:
通过编译指令调用二进制段的写入方法,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。
可选的,如图4所示,所述依赖关系数据确定模块340,包括以下至少一个子模块:
函数依赖关系确定子模块3401,用于若第二元素为函数,则将所述第二元素的指针作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
字符串依赖关系确定子模块3402,用于若第二元素为字符串,则将所述第二元素作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
类依赖关系确定子模块3403,用于若第二元素为类,则将所述第二元素的名称作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
方法依赖关系确定子模块3404,用于若第二元素为Objective-C的方法,则将通过系统宏获得的字符串作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据。
本实施例公开的装置用于执行实施例一和实施例二所述的方法的步骤,所述装置的各模块的具体实施方式参见实施例一和实施例二中的相应步骤,此处不再赘述。
本申请实施例公开的程序调用解耦装置,通过根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据,然后,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中,在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值,并调用所述索引值对应的所述第二元素,解决了现有技术中的程序调用解耦方法存在的导致程序启动效率低下的问题。本申请实施例公开的程序调用解耦装置,通过将程序运行时的依赖关系数据预先写入到程序的二进制数据中,当需要调用存在依赖关系的元素时,才加载依赖关系数据,缩短了程序的启动时间,提升了程序的启动效率。
+load是无差别的在启动的时候执行,很多不在启动关键路径上面的依赖也会在这个时候被执行加载,造成了不必要的浪费。本申请公开的程序调用解耦装置充分利用了编译时的数据写入,将需要执行的方法和数据与索引键进行对应,程序执行到需要加载对应索引键的时候,再执行相应的函数或者返回相应的数据,避免了不必要的浪费,大大的节省了程序的启动时间。
相应的,本申请还公开了一种电子设备,包括存储器、处理器及存储在所述存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如本申请实施例一和实施例二所述的程序调用解耦方法。所述电子设备可以为PC机、移动终端、个人数字助理、平板电脑等。
本申请还公开了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本申请实施例一和实施例二所述的程序调用解耦方法的步骤。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上对本申请提供的一种程序调用解耦方法及装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
Claims (10)
1.一种程序调用解耦方法,其特征在于,其中,所述程序具有对应的二进制数据,所述二进制数据中包括依赖关系数据,所述的方法包括:
在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;
通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;
调用所述索引值对应的所述第二元素;
其中,所述在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境的步骤之前,还包括:
根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据;
将所述依赖关系数据写入到所述程序编译后生成的二进制数据中;
其中,所述依赖关系数据还包括:所述索引值对应的第二元素的类型;
所述调用所述索引值对应的所述第二元素之前,还包括:
所述运行时环境根据所述索引值和所述索引值对应的第二元素的类型解析所述依赖关系数据,得到所述索引值对应的第二元素。
2.根据权利要求1所述的方法,其特征在于,所述将所述依赖关系数据写入到所述程序编译后生成的二进制数据中的步骤,包括:
通过编译指令调用二进制段的写入方法,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。
3.根据权利要求2所述的方法,其特征在于,所述根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据的步骤,包括以下至少一项:
若第二元素为函数,则将所述第二元素的指针作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
若第二元素为字符串,则将所述第二元素作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
若第二元素为类,则将所述第二元素的名称作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
若第二元素为Objective-C的方法,则将通过系统宏获得的字符串作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据。
4.根据权利要求1所述的方法,其特征在于,所述在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境的步骤,包括:
获取调用程序中第一元素的操作;
响应于所述操作,通过预设的二进制段读取函数,获取所述程序的二进制数据中的依赖关系数据。
5.一种程序调用解耦装置,其特征在于,其中,所述程序具有对应的二进制数据,所述二进制数据中包括依赖关系数据,所述的装置包括:
依赖关系数据加载模块,用于在程序执行过程中,响应于对所述程序中第一元素的调用,将所述程序的二进制数据中的依赖关系数据加载至运行时环境,其中,所述依赖关系数据中至少包括:所述第一元素对应的索引键、第二元素对应的索引值,所述第二元素为所述第一元素依赖的元素;
索引值确定模块,用于通过所述运行时环境获取所述第一元素对应的索引键所对应的所述依赖关系数据中的索引值;
调用模块,用于调用所述索引值对应的所述第二元素;
所述装置还包括:
依赖关系数据确定模块,用于根据所述程序中第一元素对应的索引键、所述第一元素依赖的第二元素,确定由所述索引键和所述第二元素对应的索引值构成的依赖关系数据;
依赖关系数据写入模块,用于将所述依赖关系数据写入到所述程序编译后生成的二进制数据中;
其中,所述依赖关系数据还包括:所述索引值对应的第二元素的类型;
所述调用所述索引值对应的所述第二元素之前,还包括:
所述运行时环境根据所述索引值和所述索引值对应的第二元素的类型解析所述依赖关系数据,得到所述索引值对应的第二元素。
6.根据权利要求5所述的装置,其特征在于,所述依赖关系数据写入模块进一步用于:
通过编译指令调用二进制段的写入方法,将所述依赖关系数据写入到所述程序编译后生成的二进制数据中。
7.根据权利要求6所述的装置,其特征在于,所述依赖关系数据确定模块,包括以下至少一个子模块:
函数依赖关系确定子模块,用于若第二元素为函数,则将所述第二元素的指针作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
字符串依赖关系确定子模块,用于若第二元素为字符串,则将所述第二元素作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
类依赖关系确定子模块,用于若第二元素为类,则将所述第二元素的名称作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据;
方法依赖关系确定子模块,用于若第二元素为Objective-C的方法,则将通过系统宏获得的字符串作为所述第二元素的索引值,确定由所述索引键和所述索引值构成的依赖关系数据。
8.根据权利要求5所述的装置,其特征在于,所述依赖关系数据加载模块进一步用于:
获取调用程序中第一元素的操作;
响应于所述操作,通过预设的二进制段读取函数,获取所述程序的二进制数据中的依赖关系数据。
9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至4任意一项所述的程序调用解耦方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1至4任意一项所述的程序调用解耦方法的步骤。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810550126.4A CN108984223B (zh) | 2018-05-31 | 2018-05-31 | 一种程序调用解耦方法、装置、电子设备及存储介质 |
PCT/CN2018/121032 WO2019227899A1 (zh) | 2018-05-31 | 2018-12-14 | 程序调用解耦 |
US17/059,981 US20210232378A1 (en) | 2018-05-31 | 2018-12-14 | Program calling, electronic device, and storage medium |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810550126.4A CN108984223B (zh) | 2018-05-31 | 2018-05-31 | 一种程序调用解耦方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108984223A CN108984223A (zh) | 2018-12-11 |
CN108984223B true CN108984223B (zh) | 2021-04-02 |
Family
ID=64542839
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810550126.4A Active CN108984223B (zh) | 2018-05-31 | 2018-05-31 | 一种程序调用解耦方法、装置、电子设备及存储介质 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20210232378A1 (zh) |
CN (1) | CN108984223B (zh) |
WO (1) | WO2019227899A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108984223B (zh) * | 2018-05-31 | 2021-04-02 | 北京三快在线科技有限公司 | 一种程序调用解耦方法、装置、电子设备及存储介质 |
CN110737409B (zh) * | 2019-10-21 | 2023-09-26 | 网易(杭州)网络有限公司 | 数据加载方法、装置和终端设备 |
CN114860340A (zh) * | 2022-05-17 | 2022-08-05 | 中国平安财产保险股份有限公司 | 配置逻辑代码的启动控制方法、装置、设备及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105354049A (zh) * | 2015-09-29 | 2016-02-24 | 北京畅游天下网络技术有限公司 | 一种三维动画引擎的资源加载方法、装置及系统 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101819526B (zh) * | 2009-09-18 | 2013-08-28 | 华为技术有限公司 | 调用底层软件的方法、装置和嵌入式系统 |
CN102567033B (zh) * | 2010-12-14 | 2015-09-16 | 北京大学 | 基于嵌入式实时Java虚拟机的预先类加载方法及装置 |
US8621496B2 (en) * | 2011-04-05 | 2013-12-31 | Netapp, Inc. | Decoupled application program-operating system computing architecture |
CN102902544B (zh) * | 2012-09-29 | 2015-07-22 | 福建升腾资讯有限公司 | 一种电话支付终端软件平台的实现方法 |
CN104572316A (zh) * | 2014-12-31 | 2015-04-29 | 福建天晴数码有限公司 | 游戏程序与运行平台交互的方法和系统 |
CN106648563B (zh) * | 2015-10-30 | 2021-03-23 | 阿里巴巴集团控股有限公司 | 应用程序中共享模块的依赖解耦处理方法和装置 |
CN106569835A (zh) * | 2016-11-14 | 2017-04-19 | 济南浪潮高新科技投资发展有限公司 | 一种基于go语言控制反转组件的实现方法 |
CN107729063A (zh) * | 2017-10-25 | 2018-02-23 | 武汉斗鱼网络科技有限公司 | 软件开发工具包的调用方法、装置及终端 |
CN108984223B (zh) * | 2018-05-31 | 2021-04-02 | 北京三快在线科技有限公司 | 一种程序调用解耦方法、装置、电子设备及存储介质 |
-
2018
- 2018-05-31 CN CN201810550126.4A patent/CN108984223B/zh active Active
- 2018-12-14 WO PCT/CN2018/121032 patent/WO2019227899A1/zh active Application Filing
- 2018-12-14 US US17/059,981 patent/US20210232378A1/en not_active Abandoned
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105354049A (zh) * | 2015-09-29 | 2016-02-24 | 北京畅游天下网络技术有限公司 | 一种三维动画引擎的资源加载方法、装置及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108984223A (zh) | 2018-12-11 |
WO2019227899A1 (zh) | 2019-12-05 |
US20210232378A1 (en) | 2021-07-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107992307B (zh) | 一种函数编译方法及装置 | |
CN110580147B (zh) | 一种应用程序的开发方法和装置 | |
US8347272B2 (en) | Call graph dependency extraction by static source code analysis | |
CN108984223B (zh) | 一种程序调用解耦方法、装置、电子设备及存储介质 | |
CN109255209B (zh) | 一种数据处理方法、装置、设备和存储介质 | |
US9043757B2 (en) | Identifying differences between source codes of different versions of a software when each source code is organized using incorporated files | |
CN114579969B (zh) | 漏洞检测方法、装置、电子设备及存储介质 | |
CN108170430B (zh) | 一种界面展示的方法及系统 | |
WO2018001041A1 (zh) | 接口实现方法、装置、机顶盒及存储介质 | |
CN112905271A (zh) | 一种应用程序接口api的调用方法、装置及电子设备 | |
CN110941443B (zh) | 修改sdk中文件名的方法、装置及电子设备 | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 | |
US9436587B2 (en) | Test context generation | |
CN107451050B (zh) | 函数获取方法和装置、服务器 | |
CN114020278B (zh) | 数据处理方法、装置、设备及存储介质 | |
CN113986404A (zh) | JavaScript脚本执行方法、装置、电子设备及存储介质 | |
CN111796832B (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN114936368A (zh) | 一种Java内存木马检测方法、终端设备及存储介质 | |
CN114625373A (zh) | 应用转换方法、装置、电子设备和存储介质 | |
CN112256252B (zh) | 接口生成方法、装置、存储介质及电子设备 | |
CN111338968A (zh) | 项目的功能模块调试方法、装置、介质及电子设备 | |
CN112068814A (zh) | 可执行文件的生成方法、装置、系统及介质 | |
CN111045657B (zh) | 程序代码的运行方法和运行装置以及编译方法和编译装置 | |
CN116483736B (zh) | 插桩位置确定方法及电子设备 | |
CN110716746B (zh) | 将rn样式代码转换为小程序样式代码的方法及装置 |
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 |