一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

接口调用方法、装置及存储介质与流程

2022-06-11 15:29:16 来源:中国专利 TAG:
1.本技术涉及计算机
技术领域
:,尤其涉及一种接口调用方法、装置及存储介质。
背景技术
::2.面向对象的编程技术支持多继承及多实现。例如,在java编程中,一个接口类可以继承多个接口类(即多继承),一个接口类也可以被多个类实现(即多实现)。当源代码中存在对多继承或多实现的接口类中的接口函数的调用时,在编译阶段,编译器通常无法确定调用该接口函数的对象的真实类型,也就无法确定调用的接口函数的地址,只有在程序运行阶段,才可通过动态查找的方式确定调用的接口函数的地址。然而,在运行时动态查找接口函数的地址,耗时较大,影响程序的执行效率。技术实现要素:3.有鉴于此,提出了一种接口调用方法、装置及存储介质。4.第一方面,本技术的实施例提供了一种接口调用方法,包括:响应于应用程序中接口函数的调用,根据调用所述接口函数的目标对象所属的类型及第一缓存信息,确定所述接口函数的存储地址;从所述存储地址读取所述接口函数,并执行所述接口函数,其中,所述第一缓存信息是在所述应用程序被加载到内存时,根据所述应用程序在内存中的存储地址及预设的第二缓存信息确定的,所述第二缓存信息包括多个第二缓存条目,每个第二缓存条目均对应一个接口函数的调用位置,所述第二缓存条目包括调用接口函数的对象所属的类型的标识及接口函数在所述类型的函数表中的标识。5.本技术实施例的接口调用方法,在应用程序被加载到内存时,可根据应用程序在内存中的存储地址及预设的第二缓存信息,来确定第一缓存信息,使得接口函数在第一次被调用之前,其存储地址已缓存在第一缓存信息中,即对第一缓存信息进行预填;在应用程序的运行过程中,在接口函数被调用时,可根据调用接口函数的目标对象所属的类型,从预填的第一缓存信息中,确定接口函数的存储地址,并从该存储地址读取并执行接口函数,完成接口函数的调用,从而可以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。6.根据第一方面,在所述接口调用方法的第一种可能的实现方式中,所述第一缓存信息包括多个第一缓存条目,所述第一缓存条目与所述第二缓存条目相对应,所述第一缓存条目包括调用接口函数的对象所属的类型的存储地址及所述接口函数的存储地址。7.根据第一方面,在所述接口调用方法的第二种可能的实现方式中,所述方法还包括:确定所述应用程序中各个接口函数的调用信息,所述调用信息包括所述接口函数的调用位置标识、调用所述接口函数的对象所属的类型的标识及所述接口函数在所述类型的函数表中的标识;根据各个接口函数的调用信息,确定第二缓存信息。8.在本实施例中,通过确定应用程序中各个接口函数的调用信息,并根据各个接口函数的调用信息,确定第二缓存信息,可提高第二缓存信息的准确性。9.根据第一方面的第二种可能的实现方式,在所述接口调用方法的第三种可能的实现方式中,所述确定所述应用程序中各个接口函数的调用信息,包括:对所述应用程序的源代码进行采样编译,生成采样目标码,所述采样编译用于在编译过程中在所述源代码中的各个接口函数的调用位置的后面插入预设的采样代码;执行所述采样目标码,得到各个接口函数的调用信息。10.在本实施例中,通过对应用程序的源代码进行采样编译,可在源代码中的各个接口函数的调用位置的后面插入预设的采样代码,并生成采样目标码,执行采样目标码后,可得到各个接口函数的调用信息,简单方便,可提高接口函数的调用信息的获取效率。11.根据第一方面的第三种可能的实现方式,在所述接口调用方法的第四种可能的实现方式中,所述根据各个接口函数的调用信息,确定第二缓存信息,包括:在编译所述源代码生成所述应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数的调用位置对应的第二缓存条目,得到第二缓存信息,其中,所述第二缓存信息位于所述可执行文件中。12.在本实施例中,通过在编译源代码生成应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数对应的第二缓存条目,得到第二缓存信息,不仅可提高第二缓存信息的生成效率,还可将第二缓存信息保存在应用程序的可执行文件中,不影响应用程序的安装或部署。13.根据第一方面,在所述接口调用方法的第五种可能的实现方式中,所述根据调用所述接口函数的目标对象所属的类型及第一缓存信息,确定所述接口函数的存储地址,包括:从第一缓存信息中,确定出与所述接口函数的调用位置对应的第一缓存条目;在调用所述接口函数的目标对象所属的类型与所述第一缓存条目中的类型相同的情况下,获取所述第一缓存条目中接口函数的存储地址。通过这种方式,可快速确定接口函数的存储地址。14.根据第一方面,在所述接口调用方法的第六种可能的实现方式中,每个接口函数的调用位置对应至少一个第二缓存条目。15.通过这种方式,可对各个接口函数调用位置的至少一个调用信息进行缓存,从而可提高与第二缓存条目对应的第一缓存条目的命中率。16.根据第一方面,在所述接口调用方法的第七种可能的实现方式中,通过存储地址回填的方式,将第二缓存信息更新为第一缓存信息。通过这种方式,可减少缓存空间的使用。17.根据第一方面或者第一方面的多种可能的实现方式中的一种或几种,在所述接口调用方法的第八种可能的实现方式中,所述应用程序的可执行文件通过方舟编译器编译生成,所述应用程序包括情感化操作系统emui的组件以及运行在情感化操作系统emui上的程序。18.第二方面,本技术的实施例提供了一种接口调用装置,所述装置包括:地址获取模块,响应于应用程序中接口函数的调用,根据调用所述接口函数的目标对象所属的类型及第一缓存信息,确定所述接口函数的存储地址;执行模块,从所述存储地址读取所述接口函数,并执行所述接口函数,其中,所述第一缓存信息是在所述应用程序被加载到内存时,根据所述应用程序在内存中的存储地址及预设的第二缓存信息确定的,所述第二缓存信息包括多个第二缓存条目,每个第二缓存条目均对应一个接口函数的调用位置,所述第二缓存条目包括调用接口函数的对象所属的类型的标识及接口函数在所述类型的函数表中的标识。19.本技术实施例的接口调用装置,在应用程序被加载到内存时,可根据应用程序在内存中的存储地址及预设的第二缓存信息,来确定第一缓存信息,使得接口函数在第一次被调用之前,其存储地址已缓存在第一缓存信息中,即对第一缓存信息进行预填;在应用程序的运行过程中,在接口函数被调用时,可根据调用接口函数的目标对象所属的类型,从预填的第一缓存信息中,确定接口函数的存储地址,并从该存储地址读取并执行接口函数,完成接口函数的调用,从而可以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。20.根据第二方面,在所述接口调用装置的第一种可能的实现方式中,所述第一缓存信息包括多个第一缓存条目,所述第一缓存条目与所述第二缓存条目相对应,所述第一缓存条目包括调用接口函数的对象所属的类型的存储地址及所述接口函数的存储地址。21.根据第二方面,在所述接口调用装置的第二种可能的实现方式中,所述装置还包括:调用信息确定模块,用于确定所述应用程序中各个接口函数的调用信息,所述调用信息包括所述接口函数的调用位置标识、调用所述接口函数的对象所属的类型的标识及所述接口函数在所述类型的函数表中的标识;缓存信息确定模块,用于根据各个接口函数的调用信息,确定第二缓存信息。22.在本实施例中,通过确定应用程序中各个接口函数的调用信息,并根据各个接口函数的调用信息,确定第二缓存信息,可提高第二缓存信息的准确性。23.根据第二方面的第二种可能的实现方式,在所述接口调用装置的第三种可能的实现方式中,所述调用信息确定模块,包括:采样编译子模块,用于对所述应用程序的源代码进行采样编译,生成采样目标码,所述采样编译用于在编译过程中在所述源代码中的各个接口函数的调用位置的后面插入预设的采样代码;采样执行子模块,用于执行所述采样目标码,得到各个接口函数的调用信息。24.在本实施例中,通过对应用程序的源代码进行采样编译,可在源代码中的各个接口函数的调用位置的后面插入预设的采样代码,并生成采样目标码,执行采样目标码后,可得到各个接口函数的调用信息,简单方便,可提高接口函数的调用信息的获取效率。25.根据第二方面的第三种可能的实现方式,在所述接口调用装置的第四种可能的实现方式中,所述缓存信息确定模块,包括:缓存信息确定子模块,用于在编译所述源代码生成所述应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数的调用位置对应的第二缓存条目,得到第二缓存信息,其中,所述第二缓存信息位于所述可执行文件中。26.在本实施例中,通过在编译源代码生成应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数对应的第二缓存条目,得到第二缓存信息,不仅可提高第二缓存信息的生成效率,还可将第二缓存信息保存在应用程序的可执行文件中,不影响应用程序的安装或部署。27.根据第二方面,在所述接口调用装置的第五种可能的实现方式中,所述地址获取模块,包括:缓存条目确定子模块,用于从第一缓存信息中,确定出与所述接口函数的调用位置对应的第一缓存条目;存储地址确定子模块,用于在调用所述接口函数的目标对象所属的类型与所述第一缓存条目中的类型相同的情况下,获取所述第一缓存条目中接口函数的存储地址。通过这种方式,可快速确定接口函数的存储地址。28.根据第二方面,在所述接口调用装置的第六种可能的实现方式中,每个接口函数的调用位置对应至少一个第二缓存条目。29.通过这种方式,可对各个接口函数调用位置的至少一个调用信息进行缓存,从而可提高与第二缓存条目对应的第一缓存条目的命中率。30.根据第二方面,在所述接口调用装置的第七种可能的实现方式中,通过存储地址回填的方式,将第二缓存信息更新为第一缓存信息。通过这种方式,可减少缓存空间的使用。31.根据第二方面或者第二方面的多种可能的实现方式中的一种或几种,在所述接口调用装置的第八种可能的实现方式中,所述应用程序的可执行文件通过方舟编译器编译生成,所述应用程序包括情感化操作系统emui的组件以及运行在情感化操作系统emui上的程序。32.第三方面,本技术的实施例提供了一种接口调用装置,包括处理器及用于存储处理器可执行指令的存储器,其中,所述处理器被配置为执行所述指令时实现上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的接口调用方法。33.本技术实施例的接口调用装置,在应用程序被加载到内存时,可根据应用程序在内存中的存储地址及预设的第二缓存信息,来确定第一缓存信息,使得接口函数在第一次被调用之前,其存储地址已缓存在第一缓存信息中,即对第一缓存信息进行预填;在应用程序的运行过程中,在接口函数被调用时,可根据调用接口函数的目标对象所属的类型,从预填的第一缓存信息中,确定接口函数的存储地址,并从该存储地址读取并执行接口函数,完成接口函数的调用,从而可以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。34.第四方面,本技术的实施例提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的接口调用方法。35.根据本技术的实施例,在应用程序被加载到内存时,可根据应用程序在内存中的存储地址及预设的第二缓存信息,来确定第一缓存信息,使得接口函数在第一次被调用之前,其存储地址已缓存在第一缓存信息中,即对第一缓存信息进行预填;在应用程序的运行过程中,在接口函数被调用时,可根据调用接口函数的目标对象所属的类型,从预填的第一缓存信息中,确定接口函数的存储地址,并从该存储地址读取并执行接口函数,完成接口函数的调用,从而可以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。36.第五方面,本技术的实施例提供了一种计算机程序产品,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备中运行时,所述电子设备中的处理器执行上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的接口调用方法。37.根据本技术的实施例,在应用程序被加载到内存时,可根据应用程序在内存中的存储地址及预设的第二缓存信息,来确定第一缓存信息,使得接口函数在第一次被调用之前,其存储地址已缓存在第一缓存信息中,即对第一缓存信息进行预填;在应用程序的运行过程中,在接口函数被调用时,可根据调用接口函数的目标对象所属的类型,从预填的第一缓存信息中,确定接口函数的存储地址,并从该存储地址读取并执行接口函数,完成接口函数的调用,从而可以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。38.本技术的这些和其他方面在以下(多个)实施例的描述中会更加简明易懂。附图说明39.包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本技术的示例性实施例、特征和方面,并且用于解释本技术的原理。40.图1示出根据本技术一实施例的接口调用方法的应用场景的示意图。41.图2示出根据本技术一实施例的接口调用方法的应用场景的示意图。42.图3示出根据本技术一实施例的终端设备的结构示意图。43.图4示出根据本技术一实施例的终端设备的软件结构框图。44.图5示出根据本技术一实施例的接口调用方法的流程图。45.图6示出根据本技术一实施例的接口调用方法的处理过程的示意图。46.图7示出根据本技术一实施例的编译器的界面的示意图。47.图8示出根据本技术一实施例的接口调用方法的执行效果的示意图。48.图9示出根据本技术一实施例的接口调用装置的框图。具体实施方式49.以下将参考附图详细说明本技术的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。50.在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。51.另外,为了更好的说明本技术,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本技术同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本技术的主旨。52.在面向对象的编程技术中,接口类可包括至少一个接口函数(也可称为接口方法)。为了更好地理解本技术实施例的技术方案,下面通过示例对接口类的多实现进行示例性说明。53.假设有intfa和intfb两个接口类,接口类intfa包括接口函数saycat(),接口类intfb包括接口函数saydog(),子类subclassa和subclassb都实现了intfa和intfb,具体如下表1所示:54.表1接口类及其子类[0055][0056]表1中,接口类intfa既被子类subclassa实现,也被子类subclassb实现,即一个接口类被多个类实现,该实现方式即为接口类的多实现。同样,接口类intfb既被子类subclassa实现,也被子类subclassb实现,也为多实现。[0057]而子类subclassa既实现接口类intfa,也实现接口类intfb,即一个类实现了多个接口类。同样,子类subclassb也实现了intfa和intfb两个接口类。在相关技术中,类的多继承与一个类实现多个接口类类似,此处不再一一赘述。[0058]在对象上调用接口函数时,编译器在编译时无法确定调用接口函数的对象的真实类型。例如,在下述mutter()函数中,在对象intf上调用了接口函数saycat(),而对象intf可能是子类subclassa的对象,也可能是子类subclassb的对象:[0059][0060]由于编译器在编译时无法确定mutter()函数的传入参数intf是子类subclassa的对象还是子类subclassb的对象,编译器会将语句“intf.saycat();”翻译成以下四个步骤,以便在程序运行时动态查找正确的接口函数并进行调用:[0061]第1步,确定intf在运行时的真实类型realtype;[0062]第2步,获取intf的真实类型realtype关联的函数表mtable(也可称为方法表),即真实类型realtype所包括的函数的集合,例如,subclassa的函数表包括接口函数saycat()及接口函数saydog();[0063]第3步,在函数表mtable中,查找接口函数saycat()的地址addr;[0064]第4步,根据查找到的地址addr,调用saycat()。[0065]语句“intf.saycat();”经编译器转换后的伪代码,可示意如下:[0066][0067]在接口类中包括的接口函数的数量较多的情况下,执行上述四个步骤时,尤其是执行第3步时,非常耗时,严重影响程序的运行效率。[0068]而相关经验表明,同一接口函数调用被多次执行时,调用接口函数的对象通常属于同一类型。例如,intf.saycat()被多次执行,假设第一次执行intf.saycat()时,对象intf的类型为subclassa,当再次执行intf.saycat()时,对象intf的类型大概率也为subclassa。[0069]根据上述经验,现有的技术方案采用了内联缓存技术,将每一个接口函数调用与一个缓存条目关联起来,并将第一次执行接口函数调用时确定的对象的类型及接口函数的地址,保存到对应的缓存条目。例如,第一次执行intf.saycat()时,可将确定的对象intf的类型subclassa及saycat()的地址,保存到对应的缓存条目。其中,缓存条目占用的缓存cache可依据实际情况向系统申请。[0070]在第二次执行intf.saycat()时,可首先根据对应的缓存条目,判断intf的类型是否与缓存条目中存储的类型subclassa相同,如果相同,则直接使用该缓存条目中存储的接口函数saycat()的地址,而不用在subclassa的函数表中查找saycat()的地址。[0071]例如,下面的源代码中,函数mutter()被执行了三次,intf.saycat()也被调用了三次:[0072][0073]在使用内联缓存技术时,上述源代码中的mutter()函数经编译器转换后,增加了内联缓存机制相关的伪代码,可示意如下:[0074][0075]其中,cachetable表示缓存表,用于存储缓存条目。源代码编译完成后,缓存表cachetable中的内容为空(例如可表示为xxx)。缓存表cachetable可示意如下:[0076]0[xxx,xxx][0077]1[xxx,xxx][0078]2[xxx,xxx][0079]3[xxx,xxx][0080]在上述缓存表cachetable中,0、1、2、3为缓存条目编号,分别与第0个调用位置、第1个调用位置、第2个调用位置、第3个调用位置相对应。每个缓存条目包括两个字段,第0个字段表示类型,第1个字段表示接口函数的地址。[0081]上述伪代码中,与intf.saycat()对应的缓存条目为第1个缓存条目,cachetable[1][0]表示第1个缓存条目的第0个字段,cachetable[1][1]表示第1个缓存条目的第1个字段。[0082]在第一次执行intf.saycat()时,由于缓存表cachetable中的第1个缓存条目的内容为空,在缓存表cachetable中查找时,无法命中。在第一次查找缓存条目不命中的情况下,将第一次调用saycat()时intf的真实类型subclassa及函数saycat()的地址,保存到对应的缓存条目,即第1个缓存条目,更新后的缓存表cachetable如下所示:[0083]0[xxx,xxx][0084]1[subclassa,saycat()的地址][0085]2[xxx,xxx][0086]3[xxx,xxx][0087]在第二次和第三次调用saycat()时,由于intf的真实类型与第1个缓存条目中存储的类型一致,所以第二次和第三次执行intf.saycat()时,可直接从第1个缓存条目中的第1个字段中,获取saycat()的地址,从而提高了接口函数saycat()的查找速度,进而提升了程序运行效率。[0088]但是,在使用上述内联缓存技术时,由于缓存表cachetable中的缓存条目的初始内容为空,在第一次执行接口函数调用时,必然存在缓存不命中的情况,从而影响程序执行效率,带来性能损失。[0089]为了解决上述技术问题,本技术提供了一种接口调用方法。本技术实施例的接口调用方法,能够减少第一次执行接口函数调用时无法命中缓存条目的情况,从而提高程序执行效率及运行性能。[0090]图1示出根据本技术一实施例的接口调用方法的应用场景的示意图。如图1所示,本技术实施例的接口调用方法应用于第一设备10,第一设备10中部署或安装了至少一个应用程序20,应用程序20通过第二设备30中的源代码40编译生成。[0091]其中,第一设备10可以是能够运行应用程序的服务器或终端设备;第二设备30可以是任何类型的、可用于应用程序开发(包括源代码40的编写、编译等)的设备,例如台式计算机、大型计算机、笔记本电脑、服务器等。本技术对第一设备10及第二设备30的具体类型不作限制。[0092]图2示出根据本技术一实施例的接口调用方法的应用场景的示意图。如图2所示,本技术实施例的接口调用方法应用于第一设备10,与图1不同的是,图2中的第一设备10包括源代码40以及其编译生成的应用程序20。也就是说,图2中的第一设备10可用于应用程序20的开发(例如源代码40的编写、编译等)及运行。[0093]本技术实施例的接口调用方法也可应用于第二设备30。在该应用场景中,第二设备30包源代码40及其编译生成的应用程序20,即第二设备30用于应用程序20的开发及运行。[0094]在一种可能的实现方式中,本技术涉及的终端设备可以是指具有无线连接功能的设备,无线连接的功能是指可以通过wifi、蓝牙等无线连接方式与其他终端设备进行连接,本技术的终端设备也可以具有有线连接进行通信的功能。本技术的终端设备可以是触屏的、也可以是非触屏的、也可以是没有屏幕的,触屏的可以通过手指、触控笔等在显示屏幕上点击、滑动等方式对终端设备进行控制,非触屏的设备可以连接鼠标、键盘、触控面板等输入设备,通过输入设备对终端设备进行控制,没有屏幕的设备比如说可以是没有屏幕的蓝牙音箱等。举例来说,本技术的终端设备可以是智能手机、上网本、平板电脑、笔记本电脑、可穿戴电子设备(如智能手环、智能手表等)、tv、虚拟现实设备、音响、电子墨水,等等。[0095]图3示出根据本技术一实施例的终端设备的结构示意图。以终端设备是手机为例,图3示出了手机200的结构示意图。[0096]手机200可以包括处理器210,外部存储器接口220,内部存储器221,usb接口230,充电管理模块240,电源管理模块241,电池242,天线1,天线2,移动通信模块251,无线通信模块252,音频模块270,扬声器270a,受话器270b,麦克风270c,耳机接口270d,传感器模块280,按键290,马达291,指示器292,摄像头293,显示屏294,以及sim卡接口295等。其中传感器模块280可以包括陀螺仪传感器280a,加速度传感器280b,接近光传感器280g、指纹传感器280h,触摸传感器280k(当然,手机200还可以包括其它传感器,比如温度传感器,压力传感器、距离传感器、磁传感器、环境光传感器、气压传感器、骨传导传感器等,图中未示出)。[0097]可以理解的是,本技术实施例示意的结构并不构成对手机200的具体限定。在本申请另一些实施例中,手机200可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。[0098]处理器210可以包括一个或多个处理单元,例如:处理器210可以包括应用处理器(applicationprocessor,ap),调制解调处理器,图形处理器(graphicsprocessingunit,gpu),图像信号处理器(imagesignalprocessor,isp),控制器,存储器,视频编解码器,数字信号处理器(digitalsignalprocessor,dsp),基带处理器,和/或神经网络处理器(neural-networkprocessingunit,npu)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。其中,控制器可以是手机200的神经中枢和指挥中心。控制器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。[0099]处理器210中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器210中的存储器为高速缓冲存储器。该存储器可以保存处理器210刚用过或循环使用的指令或数据。如果处理器210需要再次使用该指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器210的等待时间,因而提高了系统的效率。[0100]处理器210可以运行本技术实施例提供的接口调用方法,以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。处理器210可以包括不同的器件,比如集成cpu和gpu时,cpu和gpu可以配合执行本技术实施例提供的接口调用方法,比如接口调用方法中部分算法由cpu执行,另一部分算法由gpu执行,以得到较快的处理效率。[0101]显示屏294用于显示图像,视频等。显示屏294包括显示面板。显示面板可以采用液晶显示屏(liquidcrystaldisplay,lcd),有机发光二极管(organiclight-emittingdiode,oled),有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrixorganiclightemittingdiode的,amoled),柔性发光二极管(flexlight-emittingdiode,fled),miniled,microled,micro-oled,量子点发光二极管(quantumdotlightemittingdiodes,qled)等。在一些实施例中,手机200可以包括1个或n个显示屏294,n为大于1的正整数。显示屏294可用于显示由用户输入的信息或提供给用户的信息以及各种图形用户界面(graphicaluserinterface,gui)。例如,显示器294可以显示照片、视频、网页、或者文件等。再例如,显示器294可以显示图形用户界面。其中,图形用户界面上包括状态栏、可隐藏的导航栏、时间和天气小组件(widget)、以及应用的图标,例如浏览器图标等。状态栏中包括运营商名称(例如中国移动)、移动网络(例如4g)、时间和剩余电量。导航栏中包括后退(back)键图标、主屏幕(home)键图标和前进键图标。此外,可以理解的是,在一些实施例中,状态栏中还可以包括蓝牙图标、wi-fi图标、外接设备图标等。还可以理解的是,在另一些实施例中,图形用户界面中还可以包括dock栏,dock栏中可以包括常用的应用图标等。当处理器210检测到用户的手指(或触控笔等)针对某一应用图标的触摸事件后,响应于该触摸事件,打开与该应用图标对应的应用的用户界面,并在显示器294上显示该应用的用户界面。[0102]在本技术实施例中,显示屏294可以是一个一体的柔性显示屏,也可以采用两个刚性屏以及位于两个刚性屏之间的一个柔性屏组成的拼接显示屏。[0103]摄像头293(前置摄像头或者后置摄像头,或者一个摄像头既可作为前置摄像头,也可作为后置摄像头)用于捕获静态图像或视频。通常,摄像头293可以包括感光元件比如镜头组和图像传感器,其中,镜头组包括多个透镜(凸透镜或凹透镜),用于采集待拍摄物体反射的光信号,并将采集的光信号传递给图像传感器。图像传感器根据所述光信号生成待拍摄物体的原始图像。[0104]内部存储器221可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。处理器210通过运行存储在内部存储器221的指令,从而执行手机200的各种功能应用以及数据处理。内部存储器221可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,应用程序(比如相机应用,微信应用等)的代码等。存储数据区可存储手机200使用过程中所创建的数据(比如相机应用采集的图像、视频等)等。[0105]内部存储器221还可以存储本技术实施例提供的接口调用方法对应的一个或多个计算机程序1310。该一个或多个计算机程序1304被存储在上述存储器221中并被配置为被该一个或多个处理器210执行,该一个或多个计算机程序1310包括指令,上述指令可以用于执行如图5或图6相应实施例中的各个步骤。[0106]此外,内部存储器221可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universalflashstorage,ufs)等。[0107]当然,本技术实施例提供的接口调用方法的代码还可以存储在外部存储器中。这种情况下,处理器210可以通过外部存储器接口220运行存储在外部存储器中的接口调用方法的代码。[0108]下面介绍传感器模块280的功能。[0109]陀螺仪传感器280a,可以用于确定手机200的运动姿态。在一些实施例中,可以通过陀螺仪传感器280a确定手机200围绕三个轴(即,x,y和z轴)的角速度。即陀螺仪传感器280a可以用于检测手机200当前的运动状态,比如抖动还是静止。[0110]当本技术实施例中的显示屏为可折叠屏时,陀螺仪传感器280a可用于检测作用于显示屏294上的折叠或者展开操作。陀螺仪传感器280a可以将检测到的折叠操作或者展开操作作为事件上报给处理器210,以确定显示屏294的折叠状态或展开状态。[0111]加速度传感器280b可检测手机200在各个方向上(一般为三轴)加速度的大小。即陀螺仪传感器280a可以用于检测手机200当前的运动状态,比如抖动还是静止。当本技术实施例中的显示屏为可折叠屏时,加速度传感器280b可用于检测作用于显示屏294上的折叠或者展开操作。加速度传感器280b可以将检测到的折叠操作或者展开操作作为事件上报给处理器210,以确定显示屏294的折叠状态或展开状态。[0112]接近光传感器280g可以包括例如发光二极管(led)和光检测器,例如光电二极管。发光二极管可以是红外发光二极管。手机通过发光二极管向外发射红外光。手机使用光电二极管检测来自附近物体的红外反射光。当检测到充分的反射光时,可以确定手机附近有物体。当检测到不充分的反射光时,手机可以确定手机附近没有物体。当本技术实施例中的显示屏为可折叠屏时,接近光传感器280g可以设置在可折叠的显示屏294的第一屏上,接近光传感器280g可根据红外信号的光程差来检测第一屏与第二屏的折叠角度或者展开角度的大小。[0113]陀螺仪传感器280a(或加速度传感器280b)可以将检测到的运动状态信息(比如角速度)发送给处理器210。处理器210基于运动状态信息确定当前是手持状态还是脚架状态(比如,角速度不为0时,说明手机200处于手持状态)。[0114]指纹传感器280h用于采集指纹。手机200可以利用采集的指纹特性实现指纹解锁,访问应用锁,指纹拍照,指纹接听来电等。[0115]触摸传感器280k,也称“触控面板”。触摸传感器280k可以设置于显示屏294,由触摸传感器280k与显示屏294组成触摸屏,也称“触控屏”。触摸传感器280k用于检测作用于其上或附近的触摸操作。触摸传感器可以将检测到的触摸操作传递给应用处理器,以确定触摸事件类型。可以通过显示屏294提供与触摸操作相关的视觉输出。在另一些实施例中,触摸传感器280k也可以设置于手机200的表面,与显示屏294所处的位置不同。[0116]示例性的,手机200的显示屏294显示主界面,主界面中包括多个应用(比如相机应用、微信应用等)的图标。用户通过触摸传感器280k点击主界面中相机应用的图标,触发处理器210启动相机应用,打开摄像头293。显示屏294显示相机应用的界面,例如取景界面。[0117]手机200的无线通信功能可以通过天线1,天线2,移动通信模块251,无线通信模块252,调制解调处理器以及基带处理器等实现。[0118]天线1和天线2用于发射和接收电磁波信号。手机200中的每个天线可用于覆盖单个或多个通信频带。不同的天线还可以复用,以提高天线的利用率。例如:可以将天线1复用为无线局域网的分集天线。在另外一些实施例中,天线可以和调谐开关结合使用。[0119]移动通信模块251可以提供应用在手机200上的包括2g/3g/4g/5g等无线通信的解决方案。移动通信模块251可以包括至少一个滤波器,开关,功率放大器,低噪声放大器(lownoiseamplifier,lna)等。移动通信模块251可以由天线1接收电磁波,并对接收的电磁波进行滤波,放大等处理,传送至调制解调处理器进行解调。移动通信模块251还可以对经调制解调处理器调制后的信号放大,经天线1转为电磁波辐射出去。在一些实施例中,移动通信模块251的至少部分功能模块可以被设置于处理器210中。在一些实施例中,移动通信模块251的至少部分功能模块可以与处理器210的至少部分模块被设置在同一个器件中。在本技术实施例中,移动通信模块251还可以用于与其它终端设备进行信息交互。[0120]调制解调处理器可以包括调制器和解调器。其中,调制器用于将待发送的低频基带信号调制成中高频信号。解调器用于将接收的电磁波信号解调为低频基带信号。随后解调器将解调得到的低频基带信号传送至基带处理器处理。低频基带信号经基带处理器处理后,被传递给应用处理器。应用处理器通过音频设备(不限于扬声器270a,受话器270b等)输出声音信号,或通过显示屏294显示图像或视频。在一些实施例中,调制解调处理器可以是独立的器件。在另一些实施例中,调制解调处理器可以独立于处理器210,与移动通信模块251或其他功能模块设置在同一个器件中。[0121]无线通信模块252可以提供应用在手机200上的包括无线局域网(wirelesslocalareanetworks,wlan)(如无线保真(wirelessfidelity,wi-fi)网络),蓝牙(bluetooth,bt),全球导航卫星系统(globalnavigationsatellitesystem,gnss),调频(frequencymodulation,fm),近距离无线通信技术(nearfieldcommunication,nfc),红外技术(infrared,ir)等无线通信的解决方案。无线通信模块252可以是集成至少一个通信处理模块的一个或多个器件。无线通信模块252经由天线2接收电磁波,将电磁波信号调频以及滤波处理,将处理后的信号发送到处理器210。无线通信模块252还可以从处理器210接收待发送的信号,对其进行调频,放大,经天线2转为电磁波辐射出去。[0122]另外,手机200可以通过音频模块270,扬声器270a,受话器270b,麦克风270c,耳机接口270d,以及应用处理器等实现音频功能。例如音乐播放,录音等。手机200可以接收按键290输入,产生与手机200的用户设置以及功能控制有关的键信号输入。手机200可以利用马达291产生振动提示(比如来电振动提示)。手机200中的指示器292可以是指示灯,可以用于指示充电状态,电量变化,也可以用于指示消息,未接来电,通知等。手机200中的sim卡接口295用于连接sim卡。sim卡可以通过插入sim卡接口295,或从sim卡接口295拔出,实现和手机200的接触和分离。[0123]应理解,在实际应用中,手机200可以包括比图3所示的更多或更少的部件,本技术实施例不作限定。图示手机200仅是一个范例,并且手机200可以具有比图中所示出的更多的或者更少的部件,可以组合两个或更多的部件,或者可以具有不同的部件配置。图中所示出的各种部件可以在包括一个或多个信号处理和/或专用集成电路在内的硬件、软件、或硬件和软件的组合中实现。[0124]终端设备的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。本技术实施例以分层架构的android系统为例,示例性说明终端设备的软件结构。[0125]图4是本技术实施例的终端设备的软件结构框图。[0126]分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将android系统分为四层,从上至下分别为应用程序层,应用程序框架层,安卓运行时(androidruntime)和系统库,以及内核层。[0127]应用程序层可以包括一系列应用程序包。[0128]如图4所示,应用程序包可以包括电话、相机,图库,日历,通话,地图,导航,wlan,蓝牙,音乐,视频,短信息等应用程序。[0129]应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramminginterface,api)和编程框架。应用程序框架层包括一些预先定义的函数。[0130]如图4所示,应用程序框架层可以包括窗口管理器,内容提供器,视图系统,电话管理器,资源管理器,通知管理器等。[0131]窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏,锁定屏幕,截取屏幕等。[0132]内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。[0133]视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。[0134]电话管理器用于提供终端设备的通信功能。例如通话状态的管理(包括接通,挂断等)。[0135]资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。[0136]通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,终端设备振动,指示灯闪烁等。[0137]androidruntime包括核心库和虚拟机。androidruntime负责安卓系统的调度和管理。[0138]核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。[0139]应用程序层和应用程序框架层运行在虚拟机中。虚拟机将应用程序层和应用程序框架层的java文件执行为二进制文件。虚拟机用于执行对象生命周期的管理,堆栈管理,线程管理,安全和异常的管理,以及垃圾回收等功能。[0140]系统库可以包括多个功能模块。例如:表面管理器(surfacemanager),媒体库(medialibraries),三维图形处理库(例如:opengles),2d图形引擎(例如:sgl)等。[0141]表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了2d和3d图层的融合。[0142]媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:mpeg4,h.264,mp3,aac,amr,jpg,png等。[0143]三维图形处理库用于实现三维图形绘图,图像渲染,合成,和图层处理等。[0144]2d图形引擎是2d绘图的绘图引擎。[0145]内核层是硬件和软件之间的层。内核层至少包含显示驱动,摄像头驱动,音频驱动,传感器驱动。[0146]图5示出根据本技术一实施例的接口调用方法的流程图。该方法可以应用于第一设备10。如图5所示,所述接口调用方法包括:[0147]步骤s501,响应于应用程序中接口函数的调用,根据调用所述接口函数的目标对象所属的类型及第一缓存信息,确定所述接口函数的存储地址;[0148]步骤s502,从所述存储地址读取所述接口函数,并执行所述接口函数;[0149]其中,所述第一缓存信息是在所述应用程序被加载到内存时,根据所述应用程序在内存中的存储地址及预设的第二缓存信息确定的,[0150]所述第二缓存信息包括多个第二缓存条目,每个第二缓存条目均对应一个接口函数的调用位置,所述第二缓存条目包括调用接口函数的对象所属的类型的标识及接口函数在所述类型的函数表中的标识。[0151]在本实施例中,在执行步骤s501之前,可先确定第二缓存信息。下面对第二缓存信息的确定方式进行示例性说明。[0152]在一种可能的实现方式中,确定第二缓存信息时,可首先确定应用程序中各个接口函数的调用信息,所述调用信息包括所述接口函数的调用位置标识、调用所述接口函数的对象所属的类型的标识及所述接口函数在所述类型的函数表中的标识,然后根据各个接口函数的调用信息,确定第二缓存信息。[0153]其中,所述应用程序可包括操作系统组件以及运行在操作系统上的程序。其中,操作系统可包括计算机操作系统、手机操作系统及其他操作系统。计算机操作系统可例如windows操作系统、linux操作系统等,手机操作系统可例如android系统、情感化操作系统emui(emotionuserinterface)等。本技术对操作系统的具体类型不作限制。在操作系统为情感化操作系统emui(emotionuserinterface)时,应用程序可包括情感化操作系统emui的组件以及运行在情感化操作系统emui上的程序。[0154]在确定第二缓存信息时,可通过断点调试、采样等方式,确定应用程序中各个接口函数的调用信息。其中,接口函数的调用信息可包括接口函数的调用位置标识、调用接口函数的对象所属的类型的标识及接口函数在所述类型的函数表中的标识。[0155]例如,可将接口函数的调用信息表示为2[5,6],其中,2表示接口函数的调用位置标识,5表示调用接口函数的对象所属的类型的标识,即classindex,6表示接口函数在所述类型的函数表中的标识,即methodindex。[0156]在一种可能的实现方式中,每个接口函数的调用位置可对应至少一条调用信息。例如,可对接口函数的调用位置,进行多次断点调试或采样,查看调用该接口函数的对象的类型,如果在多次断点调试或采样过程中,调用该接口函数的对象的类型不发生变化,或类型变化的概率小于预设的概率阈值,可认为该接口函数的调用位置对应一条调用信息;如果在多次断点调试或采样过程中,调用该接口函数的对象的类型发生变化且是在至少两个类型之间切换,或类型变化的概率大于预设的概率阈值,可认为该接口函数的调用位置对应两条或多条调用信息。本领域技术人员可根据实际情况,设置每个接口函数的调用位置对应的调用信息的最大条数,本技术对此不作限制。[0157]在一种可能的实现方式中,确定应用程序中各个接口函数的调用信息,可包括:对所述应用程序的源代码进行采样编译,生成采样目标码,所述采样编译用于在编译过程中在所述源代码中的各个接口函数的调用位置的后面插入预设的采样代码;执行所述采样目标码,得到各个接口函数的调用信息。[0158]编译器在对应用程序的源代码进行采样编译时,可在源代码中的各个接口函数的调用位置的后面插入预设的采样代码,生成采样目标码。也就是说,采样目标码包括源代码经编译器转换后的代码以及在各个接口函数的调用位置的后面的插入的采样代码。[0159]采样代码在执行的时候,可根据其所在的调用位置,自动捕捉调用接口函数的对象所属的类型的信息(例如类型的标识,即该类型在编译生成的文件中的类数组中的下标),以及所述接口函数的信息(例如接口函数的标识,即所述接口函数在所述类型的函数表中的下标)。采样代码还可以将捕捉的调用信息写入预设文件(例如用于存储调用信息的文本文件)进行保存,以便后续使用。其中,预设文件可以是文本文件、word文件、excel文件等。本领域技术人员可根据实际情况设置预设文件的具体类型,本技术对此不作限制。[0160]举例来说,下述源代码中,接口函数的调用位置为语句“intf.saycat();”:[0161][0162]编译器在对上述源代码进行采样编译时,可在接口函数的调用位置的后面,即语句“intf.saycat();”的后面,插入采样代码。编译器对上述源代码进行采样编译后生成的采样目标码如下所示:[0163][0164]其中,最后三行是编译器在采样编译过程中插入的采样代码,语句“classindex=getindexofrealtypeintheexecutable”用于获取调用接口函数saycat()的对象intf所属的真实类型的标识,语句“methodindex=getindexofsaycatinmtable”用于获取接口函数saycat()在对象intf所属的真实类型的函数表mtable中的标识,语句“saveclassindexandmethodindexofcurrentinvocationintofile”,用于将获取的classindex及methodindex保存到预设文件中。[0165]在一种可能的实现方式中,生成采样目标码后,可执行所述采样目标码,得到各个接口函数的调用信息,同时还可将各个接口函数的调用信息保存至预设文件。其中,调用信息可通过下述格式进行表示:[0166]调用位置标识[调用接口函数的对象所属的类型的标识,接口函数在所述类型的函数表中的标识],即,调用位置标识[classindex,methodindex]。[0167]例如,可将第0-3个调用位置的调用信息表示为:[0168]0[2,5][0169]1[3,1][0170]2[5,6][0171]3[1,0][0172]在一种可能的实现方式中,调用信息还可通过表格、二维矩阵、二维数组等其他方式进行表示,本技术对调用信息的表示方式不作限制。[0173]通过对应用程序的源代码进行采样编译,可在源代码中的各个接口函数的调用位置的后面插入预设的采样代码,并生成采样目标码,执行采样目标码后,可得到各个接口函数的调用信息,简单方便,可提高接口函数的调用信息的获取效率。[0174]在一种可能的实现方式中,获取各个接口函数的调用信息后,可根据各个接口函数的调用信息,确定第二缓存信息。第二缓存信息可包括多个第二缓存条目,其中,第二缓存条目可包括调用接口函数的对象所属的类型的标识及接口函数在所述类型的函数表中的标识。可根据各个接口函数的调用信息,分别建立对应的第二缓存条目,第二缓存条目与调用信息一一对应,即每个第二缓存条目均对应一条调用信息。在一种可能的实现方式中,第二缓存信息可通过缓存表cachetable来表示。[0175]由于每个接口函数的调用位置可对应至少为一条调用信息,在第二缓存条目与调用信息一一对应的情况下,每个接口函数的调用位置可对应至少一个第二缓存条目。通过这种方式,可对各个接口函数调用位置的至少一个调用信息进行缓存,从而可提高与第二缓存条目对应的第一缓存条目的命中率。[0176]在一种可能的实现方式中,所述根据各个接口函数的调用信息,确定第二缓存信息,可包括:在编译所述源代码生成所述应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数的调用位置对应的第二缓存条目,得到第二缓存信息,其中,所述第二缓存信息位于所述可执行文件中。[0177]确定各个接口函数的调用信息后,编译器在对源代码进行编译以生成应用程序的可执行文件的过程中,可为每个接口函数的调用位置分配至少一个第二缓存条目,并从保存调用信息的预设文本中,读取与各个调用位置对应的调用信息中的classindex及methodindex,写入对应的第二缓存条目中,从而得到第二缓存信息,该第二缓存信息位于应用程序的可执行文件中。[0178]其中,根据源代码的开发环境或应用程序的运行环境的不同,编译时使用的编译器可能不同。例如,应用程序为情感化操作系统emui的组件或运行在情感化操作系统emui上的程序时,该应用程序的可执行文件可通过方舟编译器编译生成。本技术对编译器的具体类型不作限制。[0179]通过在编译源代码生成应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数对应的第二缓存条目,得到第二缓存信息,不仅可提高第二缓存信息的生成效率,还可将第二缓存信息保存在应用程序的可执行文件中,不影响应用程序的安装或部署。[0180]根据上述实施例,通过确定应用程序中各个接口函数的调用信息,并根据各个接口函数的调用信息,确定第二缓存信息,可提高第二缓存信息的准确性。[0181]在一种可能的实现方式中,对源代码进行编译,生成应用程序的可执行文件后,可将应用程序的可执行文件安装或部署在目标设备(例如图1中的第一设备)上,安装或部署完成后,即可运行应用程序。[0182]在应用程序被加载到内存时,可根据所述应用程序在内存中的存储地址及第二缓存信息,确定第一缓存信息。其中,第一缓存信息包括多个第一缓存条目,第一缓存条目与第二缓存信息中的第二缓存条目相对应,第一缓存条目包括调用接口函数的对象所属的类型的存储地址及所述接口函数的存储地址。[0183]例如,在应用程序被加载到内存中,执行动态链接时,可对第二缓存信息中的各个第二缓存条目的内容进行解析,并根据应用程序在内存中的存储地址,分别确定各个第二缓存条目中的classindex对应的类在内存中的存储地址,以及methodindex对应的接口函数的存储地址,并根据确定的存储地址,建立对应的第一缓存条目,得到第一缓存信息。[0184]在一种可能的实现方式中,还可通过存储地址回填的方式,将第二缓存信息更新为第一缓存信息。也就是说,对于任一第二缓存条目,可将该第二缓存条目中的classindex,更新为与该classindex对应的类在内存中的存储地址,将该第二缓存条目中的methodindex,更新为与该methodindex对应的接口函数的存储地址,从而得到与该第二缓存条目对应第一缓存条目。通过存储地址回填的方式,将第二缓存信息更新为第一缓存信息,可减少缓存空间的使用。应当理解,本技术对第一缓存信息的确定方式不作限制。[0185]在一种可能的实现方式中,第一缓存信息可通过缓存表cachetable来表示,示意如下:[0186]0[subclassa_addr,saydog_addr][0187]1[subclassa_addr,saycat_addr][0188]2[subclassb_addr,saydog_addr][0189]3[subclassb_addr,saycat_addr][0190]其中,subclassa_addr表示类型subclassa的存储地址;subclassb_addr表示类型subclassb的存储地址;第0个第一缓存条目中的saydog_addr表示类型subclassa中接口函数saydog()的存储地址;第1个第一缓存条目中的saycat_addr表示类型subclassa中接口函数saycat()的存储地址;第2个第一缓存条目中的saydog_addr表示类型subclassb中接口函数saydog()的存储地址;第3个第一缓存条目中的saycat_addr表示类型subclassb中接口函数saycat()的存储地址。[0191]在一种可能的实现方式中,确定第一缓存信息后,在应用程序的运行过程中,可响应于应用程序中接口函数的调用,在步骤s501中,根据调用所述接口函数的目标对象所属的类型及第一缓存信息,确定所述接口函数的存储地址。[0192]也就是说,在应用程序中的接口函数被调用时,可以不使用动态查找的方式确定接口函数的存储地址,而是根据调用该接口函数的目标对象所属的类型及第一缓存信息,确定接口函数的存储地址。[0193]在一种可能的实现方式中,步骤s501可包括:从第一缓存信息中,确定出与所述接口函数的调用位置对应的第一缓存条目;判断调用所述接口函数的目标对象所属的类型与所述第一缓存条目中的类型是否相同(或匹配);在调用所述接口函数的目标对象所属的类型与所述第一缓存条目中的类型相同的情况下,可认为第一缓存条目中的信息与所述接口函数的调用信息相匹配,可直接从第一缓存条目中获取接口函数的存储地址。通过这种方式,可快速确定接口函数的存储地址。[0194]在一种可能的实现方式中,在调用所述接口函数的目标对象所属的类型与所述第一缓存条目中的类型不相同的情况下,可通过动态查找的方式,确定接口函数的存储地址。[0195]在一种可能的实现方式中,在步骤s501中确定出接口函数的存储地址后,可在步骤s502中,从存储地址读取所述接口函数,并执行所述接口函数,以完成接口函数的调用。[0196]例如,应用程序包括下述源代码,其中,接口函数intf.saycat()被调用了三次:[0197][0198]该应用程序的第一缓存信息为:[0199]0[subclassa_addr,saydog_addr][0200]1[subclassa_addr,saycat_addr][0201]2[subclassb_addr,saydog_addr][0202]3[subclassb_addr,saycat_addr][0203]在第一执行接口函数intf.saycat()的调用时,对象intf的真实类型为subclassa,与第一缓存信息中的第一缓存条目“1[subclassa_addr,saycat_addr]”相匹配,从而在第一次执行接口函数intf.saycat()的调用时,就可命中缓存,快速确定intf.saycat()的存储地址,加快执行效率。[0204]本技术实施例的接口调用方法,在应用程序被加载到内存时,可根据应用程序在内存中的存储地址及预设的第二缓存信息,来确定第一缓存信息,使得接口函数在第一次被调用之前,其存储地址已缓存在第一缓存信息中,即对第一缓存信息进行预填;在应用程序的运行过程中,在接口函数被调用时,可根据调用接口函数的目标对象所属的类型,从预填的第一缓存信息中,确定接口函数的存储地址,并从该存储地址读取并执行接口函数,完成接口函数的调用,从而可以提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。[0205]本技术实施例的接口调用方法,可用于对接口函数或接口方法的查找过程进行优化,可应用于多个版本的方舟编译器,例如方舟编译器2.0。通过方舟编译器对情感化操作系统emui的组件及运行在情感化操作系统emui上的程序进行编译,可以优化情感化操作系统emui的组件性能,也可以提高运行在情感化操作系统emui上的程序的执行效率及运行性能。[0206]图6示出根据本技术一实施例的接口调用方法的处理过程的示意图。图如6所示,接口调用方法的处理过程可包括步骤s601至步骤s609,可分为采样、优化编译、运行三个阶段。其中,采样阶段用于获取应用程序中各个接口函数的调用信息,优化编译阶段用于生成第二缓存信息,运行阶段为接口函数的调用执行阶段。[0207]首先是采样阶段,可在步骤s601中,对应用程序的源代码进行采样编译,生成采样目标码,其中,采样编译可在编译过程中在源代码中的各个接口函数的调用位置的后面插入预设的采样代码,并在步骤s602中,执行采样目标码,得到各个接口函数的调用信息。[0208]得到各个接口函数的调用信息后,进入优化编译阶段,可在步骤s603中,将各个接口函数的调用信息及源代码作为优化编译的输入,执行优化编译,在优化编译生成应用程序的可执行文件的过程中,编译器可根据各个接口函数的调用信息,分别创建与各个接口函数的调用位置对应的第二缓存条目,得到第二缓存信息。其中,第二缓存信息位于应用程序的可执行文件中。[0209]得到第二缓存信息后,进入运行阶段。运行阶段可分为第一缓存信息预填阶段(包括步骤s604)及接口函数调用阶段(包括步骤s605至步骤s609)。[0210]可在步骤s604中,执行第一缓存信息的预填,具体地,可在应用程序被加载到内存时或应用程序进行动态链接时,根据应用程序在内存中的存储地址及第二缓存信息,通过存储地址回填的方式,将第二缓存信息更新为第一缓存信息。然后在应用程序的执行过程中,可根据第一缓存信息,对接口函数进行调用,具体地,可在步骤s605中,响应于应用程序中接口函数的调用,从第一缓存信息中,确定出与接口函数的调用位置对应的第一缓存条目,并在步骤s606中,判断调用接口函数的目标对象所属的类型与第一缓存条目中的类型是否相同,如果相同,则执行步骤s607,获取第一缓存条目中接口函数的存储地址,否则,执行步骤s608,动态查找接口函数的存储地址。在步骤s607或s608中获取接口函数的存储地址后,可在步骤s609中,从存储地址读取并执行接口函数,以完成接口函数的调用。[0211]在本实施例中,通过采样编译获得应用程序中各个接口函数的调用信息,通过优化编译生成第二缓存信息,并根据第二缓存信息,在应用程序被加载到内存时或应用程序进行动态链接时,对第一缓存信息进行预填,从而可在应用程序对接口函数的进行第一次调用时,通过预填的第一缓存信息,快速确定接口函数的存储地址,可提高接口函数第一次被调用时的缓存命中率,减少运行时动态查找接口函数的次数,进而提高应用程序的执行效率及运行性能。[0212]在一种可能的实现方式中,为了便于执行采样编译及优化编译,可在编译器的操作界面,增加采样编译快捷方式及优化编译快捷方式。快捷方式可包括工具栏按钮、菜单列表、快捷键等,本技术对此不作限制。[0213]图7示出根据本技术一实施例的编译器的操作界面的示意图。如图7所示,可在编译器操作界面700的工具栏710中,增加采样按钮720及优化编译按钮730。其中,采样按钮被触发时,执行图6中的步骤s601及步骤s602,优化编译按钮730被触发时,执行图6中的步骤s603。[0214]图8示出根据本技术一实施例的接口调用方法的执行效果的示意图。如图8所示,art(androidruntime)表示在安卓系统的运行环境上执行预设的接口测试集时接口函数的平均查找时间。maple(multiplearchitectureprogramminglanguageenvironment)表示方舟编译器,maple-rt(maple-runtime)表示在未使用本技术实施例的接口调用方法的maple的运行环境上执行所述接口测试集时接口函数的平均查找时间,maple-rt比art大约慢一倍。maple-opt-rt(maple-optimisation-runtime)表示在使用本技术的接口调用方法后的maple的运行环境上执行所述接口测试集时接口函数的平均查找时间,maple-opt-rt比art大约快一倍多。可知,使用本技术实施例的接口调用方法后,接口函数的平均查找时间明显降低,从而使得应用程序的运行性能明显提升。[0215]在另一个实施例中,可对使用了本技术实施例的接口调用方法的接口执行时间、未使用本技术实施例的接口调用方法的接口执行时间分别进行测试,并对测试结果进行分析,具体如下表2所示,其中,接口执行时间1表示使用本技术实施例的接口调用方法时的接口执行时间,接口执行时间2表示未使用本技术实施例的接口调用方法时的接口执行时间。[0216]表2接口执行时间比对[0217][0218]由表2可知,使用了本技术实施例的接口调用方法的接口执行时间,均得到不同程度的减少,使得运行性能得到提升。[0219]在一种可能的实现方式中,在确定一个应用程序是否使用了本技术实施例的接口调用方法时,可首先通过逆向应用程序的可执行文件,确认其接口函数的调用位置是否关联缓存表cachetable,如果有关联缓存表,可确认可执行文件的缓存表中存储的classindex及methodindex值是否具有明显的辨识特征,而不是无序的二进制序列。如果classindex及methodindex值具有明显的识别特征,则认为该应用程序使用了本技术实施例的接口调用方法。一般情况下,classindex及methodindex的辨识特征为:classindex的值小于100000,methodindex的值小于2000。[0220]举例来说,在确定一个应用程序是否使用了本技术实施例的接口调用方法时,可对应用程序的二进制代码进行分析,如果使用了本技术实施例的接口调用方法,在接口函数的调用位置,可发现明显的取地址操作,具体的行为特征为“固定地址 偏移”。例如:[0221]取地址操作一:[0222]adrpx0,[0223]__inline_cache_table$$_home_l00510180_usr1_maplesdk_maple_sdk_0706_3_gconly_deveco_build_apk_unzip_helloworld_classes2_dex 48;[0224]取地址操作二:[0225]adrpx0,[0226]__inline_cache_table$$_home_l00510180_usr1_maplesdk_maple_sdk_0706_3_gconly_deveco_build_apk_unzip_helloworld_classes2_dex 40。[0227]从上述两个取地址操作中可以看到,这两个取地址操作的固定地址均为缓存表的存储地址:[0228]__inline_cache_table$$_home_l00510180_usr1_maplesdk_maple_sdk_0706_3_gconly_deveco_build_apk_unzip_helloworld_classes2_dex,[0229]只是不同的接口函数调用,对应的缓存表的偏移是不同的,对于取地址操作一来说,偏移是48,对于取地址操作二来说,偏移是40。[0230]而且,缓存表中存储的数据也应具有一定的规律,例如,对于下述缓存表:[0231]__inline_cache_table$$_home_l00510180_usr1_maplesdk_maple_sdk_0706_3_gconly_deveco_build_apk_unzip_helloworld_classes2_dex,[0232]其二进制内容中的[classindex,methodindex]具有一定的规律:classindex《100000,methodindex《2000。[0233]通过取地址操作及缓存表中存储的数据的规律,可确定应用程序是否使用了本技术实施例的接口调用方法。[0234]图9示出根据本技术一实施例的接口调用装置的框图。如图9所示,所述接口调用装置应用于第一设备10,所述接口调用装置包括:[0235]地址获取模块91,响应于应用程序中接口函数的调用,根据调用所述接口函数的目标对象所属的类型及第一缓存信息,确定所述接口函数的存储地址;[0236]执行模块92,从所述存储地址读取所述接口函数,并执行所述接口函数,[0237]其中,所述第一缓存信息是在所述应用程序被加载到内存时,根据所述应用程序在内存中的存储地址及预设的第二缓存信息确定的,[0238]所述第二缓存信息包括多个第二缓存条目,每个第二缓存条目均对应一个接口函数的调用位置,所述第二缓存条目包括调用接口函数的对象所属的类型的标识及接口函数在所述类型的函数表中的标识。[0239]在一种可能的实现方式中,所述第一缓存信息包括多个第一缓存条目,所述第一缓存条目与所述第二缓存条目相对应,所述第一缓存条目包括调用接口函数的对象所属的类型的存储地址及所述接口函数的存储地址。[0240]在一种可能的实现方式中,所述装置还包括:调用信息确定模块,用于确定所述应用程序中各个接口函数的调用信息,所述调用信息包括所述接口函数的调用位置标识、调用所述接口函数的对象所属的类型的标识及所述接口函数在所述类型的函数表中的标识;缓存信息确定模块,用于根据各个接口函数的调用信息,确定第二缓存信息。[0241]在一种可能的实现方式中,所述调用信息确定模块,包括:采样编译子模块,用于对所述应用程序的源代码进行采样编译,生成采样目标码,所述采样编译用于在编译过程中在所述源代码中的各个接口函数的调用位置的后面插入预设的采样代码;采样执行子模块,用于执行所述采样目标码,得到各个接口函数的调用信息。[0242]在一种可能的实现方式中,所述缓存信息确定模块,包括:缓存信息确定子模块,用于在编译所述源代码生成所述应用程序的可执行文件的过程中,根据各个接口函数的调用信息,分别创建与各个接口函数的调用位置对应的第二缓存条目,得到第二缓存信息,其中,所述第二缓存信息位于所述可执行文件中。[0243]在一种可能的实现方式中,所述地址获取模块91,包括:缓存条目确定子模块,用于从第一缓存信息中,确定出与所述接口函数的调用位置对应的第一缓存条目;存储地址确定子模块,用于在调用所述接口函数的目标对象所属的类型与所述第一缓存条目中的类型相同的情况下,获取所述第一缓存条目中接口函数的存储地址。[0244]在一种可能的实现方式中,每个接口函数的调用位置对应至少一个第二缓存条目。[0245]在一种可能的实现方式中,通过存储地址回填的方式,将第二缓存信息更新为第一缓存信息。[0246]在一种可能的实现方式中,所述应用程序的可执行文件通过方舟编译器编译生成,所述应用程序包括情感化操作系统emui的组件以及运行在情感化操作系统emui上的程序。[0247]本技术的实施例提供了一种接口调用装置,包括:处理器以及用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令时实现上述方法。[0248]本技术的实施例提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。[0249]本技术的实施例提供了一种计算机程序产品,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备的处理器中运行时,所述电子设备中的处理器执行上述方法。[0250]计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(randomaccessmemory,ram)、只读存储器(readonlymemory,rom)、可擦式可编程只读存储器(electricallyprogrammableread-only-memory,eprom或闪存)、静态随机存取存储器(staticrandom-accessmemory,sram)、便携式压缩盘只读存储器(compactdiscread-onlymemory,cd-rom)、数字多功能盘(digitalvideodisc,dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。[0251]这里所描述的计算机可读程序指令或代码可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计integratedcircuit,专用集成电路))来实现,或者可以用硬件和软件的组合,如固件等来实现。[0258]尽管在此结合各实施例对本发明进行了描述,然而,在实施所要求保护的本发明过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。[0259]以上已经描述了本技术的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本
技术领域
:的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本
技术领域
:的其它普通技术人员能理解本文披露的各实施例。当前第1页12当前第1页12
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献