发明内容
本发明实施例提供一种应用程序启动方法、装置、终端及存储介质,以实现提高应用程序的启动速度。
第一方面,本发明实施例提供了一种应用程序启动方法,该方法包括:
获取目标应用程序的动态链接库DLL文件的初始导入表,其中,所述初始导入表包括启动文件的标识信息和非启动文件的标识信息;
删除所述初始导入表中非启动文件的标识信息,确定DLL文件的启动导入表;
根据所述DLL文件的启动导入表启动所述目标应用程序。
可选的,获取目标应用程序的动态链接库DLL文件的初始导入表,包括:
获取所述目标应用程序的PE文件结构;
根据所述PE文件结构确定所述DLL文件的初始导入表的第一地址信息,并根据所述第一地址信息获取所述DLL文件的初始导入表。
可选的,所述PE文件结构至少包括PE文件头和块表,所述块表中包含所述初始导入表;其中,根据所述PE文件结构确定所述DLL文件的初始导入表的第一地址信息,包括:
获取PE文件头的第二地址信息和所述初始导入表的第一偏移地址;
获取所述PE文件头占用的第一内存和所述块表占用的第二内存;
根据所述第二地址信息、所述第一偏移地址、所述第一内存和所述第二内存确定所述初始导入表的第一地址信息。
可选的,根据所述第二地址信息、所述第一偏移地址、所述第一内存和所述第二内存确定所述初始导入表的第一地址信息,包括:
将所述第一偏移地址、所述第一内存和所述第二内存的和值,确定块表的末端地址;
将所述末端地址与所述第一偏移地址的差值确定为所述初始导入表的第一地址信息。
可选的,删除所述初始导入表中非启动文件的标识信息,确定DLL文件的启动导入表,包括:
获取各DLL文件的标识字段;
根据所述标识字段确定所述各DLL文件是否为非启动文件;
若是,则在所述初始导入表中删除所述非启动文件的标识信息;
将删除所述非启动文件的标识信息后的初始导入表确定为启动导入表。
可选的,根据所述标识字段确定所述各DLL文件是否为非启动文件,包括:
若所述DLL文件的标识字段为空,则确实所述DLL文件为非启动文件。
可选的,在根据所述DLL文件的启动导入表启动所述目标应用程序之后,还包括:
接收控制指令,若所述控制指令对应的DLL文件未加载,则加载所述控制指令对应的DLL文件。
第二方面,本发明实施例还提供了一种应用程序启动装置,该装置包括:
初始导入表获取模块,用于获取目标应用程序的动态链接库DLL文件的初始导入表,其中,所述初始导入表包括启动文件的标识信息和非启动文件的标识信息;
启动导入表确定模块,用于删除所述初始导入表中非启动文件的标识信息,确定DLL文件的启动导入表;
启动模块,用于根据所述DLL文件的启动导入表启动所述目标应用程序。
可选的,所述初始导入表获取模块包括:
PE文件获取单元,用于获取所述目标应用程序PE文件结构;
初始导入表获取单元,用于根据所述PE文件结构确定所述DLL文件的初始导入表的第一地址信息,并根据所述第一地址信息获取所述DLL文件的初始导入表。
可选的,所述PE文件结构至少包括PE文件头和块表,所述块表中包含所述初始导入表;其中,所述初始导入表获取单元包括:
第一信息获取子单元,用于获取PE文件头的第二地址信息和所述初始导入表的第一偏移地址;
第二信息获取子单元,用于获取所述PE文件头占用的第一内存和所述块表占用的第二内存;
初始导入表地址获取子单元,用于根据所述第二地址信息、所述第一偏移地址、所述第一内存和所述第二内存确定所述初始导入表的第一地址信息。
可选的,初始导入表地址获取子单元具体用于:
将所述第一偏移地址、所述第一内存和所述第二内存的和值,确定块表的末端地址;
将所述末端地址与所述第一偏移地址的差值确定为所述初始导入表的第一地址信息。
可选的,启动导入表确定模块包括:
标识字段获取单元,用于获取各DLL文件的标识字段;
文件判断单元,用于根据所述标识字段确定所述各DLL文件是否为非启动文件;
信息删除单元,用于若DLL文件为非启动文件,则在所述初始导入表中删除所述非启动文件的标识信息;
启动导入表确定单元,用于将删除所述非启动文件的标识信息后的初始导入表确定为启动导入表。
可选的,文件判断单元具体用于:
若所述DLL文件的标识字段为空,则确实所述DLL文件为非启动文件。
可选的,所述装置还包括:文件加载模块,用于在根据所述DLL文件的启动导入表启动所述目标应用程序之后,接收控制指令,若所述控制指令对应的DLL文件未加载,则加载所述控制指令对应的DLL文件。
第三方面,本发明实施例还提供了一种终端,该终端包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如本发明任意实施例提供的应用程序启动方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如本发明任意实施例提供的应用程序启动方法。
本发明实施例通过获取目标应用程序的DLL文件的初始导入表,识别并删除初始导入表中非启动文件的标识信息,以生成目标应用程序的启动导入表,并根据仅包含目标应用程序启动所必须的DLL文件的启动导入表启动该目标应用程序,以实现在目标应用程序启动的过程中仅加载目标应用程序启动所必须的DLL文件,减少了在应用程序启动过程中DLL文件的加载数量,提高了应用程序的启动速度。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
图1为本发明实施例一提供的一种应用程序启动方法的流程图,本实施例可适用于提高应用程序的启动速度的情况,该方法可以由本发明实施例提供的终端来执行。该具体包括:
S110、获取目标应用程序的动态链接库DLL文件的初始导入表。
DLL(Dynamic Link Library,动态链接库)文件是windows操作系统为了实现公共代码复用的一种可执行文件,应用程序运行时会依赖多个DLL文件,在应用程序的启动时需加载特定的DLL文件。
目标应用程序指的是需要被启动的应用程序,例如,目标应用程序可以是但不限于斗鱼直播、百度或者淘宝等。DLL文件的初始导入表中包含目标应用程序启动和应用所需的全部的DLL文件的标识信息,其中,标识信息可以是DLL文件的名称或者唯一标识,用于识别DLL文件。
初始导入表中包含目标应用程序的全部DLL文件的标识信息,即初始导入表包括启动文件的标识信息和非启动文件的标识信息,其中,标识信息可以是DLL文件的文件名称或者符号标识,用于唯一标识DLL文件。对于任意目标应用程序包含启动文件和非启动文件,其中,启动文件指的是应用于启动目标应用程序的DLL文件,非启动文件指的是在目标应用程序启动后,响应于控制指令的DLL文件。当目标应用程序的功能增多时,包含的非启动文件也会增多,导致在加载非启动文件所需的时间进一步增加。
若在目标应用程序的启动时,加载所有的DLL文件,启动过程中非必要的非DLL文件会导致目标应用程序的启动速度变慢。
可选的,获取目标应用程序的动态链接库DLL文件的初始导入表,包括:获取目标应用程序的PE文件结构;根据PE文件结构确定DLL文件的初始导入表的第一地址信息,并根据第一地址信息获取DLL文件的初始导入表。
其中,PE(Portable Executable,可移植的执行体)文件结构是windows系统存储可执行文件的信息结构体,保存了程序的代码和数据等信息。可选的,调用GetModuleFile函数获取程序的模块句柄,其中,模式句柄用于标识应用程序中的不同对象和同类对象中的不同的实例,诸如一个窗口、按钮、图标、滚动条、输出设备、控件或者文件等。应用程序能够通过句柄访问相应的对象的信息。本实施例中,通过模式句柄可获取PE文件结构。PE文件结构中包含初始导入表的相关信息,根据PE文件结构的相关信息可确定初始导入表的第一地址信息,并进一步获取DLL文件的初始导入表。
可选的,PE文件结构至少包括PE文件头和块表,块表中包含初始导入表。其中,根据PE文件结构确定DLL文件的初始导入表的第一地址信息,包括:获取PE文件头的第二地址信息和初始导入表的第一偏移地址;获取PE文件头占用的第一内存和块表占用的第二内存;根据第二地址信息、第一偏移地址、第一内存和第二内存确定初始导入表的第一地址信息。
其中,PE文件头用于保存PE文件结构各部分的大小和偏移地址,块表用于存储应用程序的导入表和导出表等数据。可选的,PE文件结构还包括DOS(Disk OperatingSystem,磁盘操作系统)头、数据块和调试信息。DOS头用于标记该应用程序是否为console程序,数据块用于保存应用程序的代码和数据等,调试信息用于保存应用程序的PDB(PalmDataBase,程序数据库)文件和调试信息。
本实施例中,根据PE文件结构的DOS头地址确定PE文件头的第二地址信息。可选的,调用GetDosHeaders函数获取PE文件结构的首地址指针,其中,该首地址指针为DOS头地址。读取DOS头地址结构中的e_lfanew字段,获取PE文件头的地址偏移量,根据DOS头地址和PE文件头的地址偏移量可确定PE文件头的第二地址信息。其中,根据dos_header+dos_header->e_lfanew公式的计算结果为PE文件头的第二地址信息,dos_header为DOS头地址,dos_header->e_lfanew为PE文件头的地址偏移量。
可选的,通过PE文件头结构中存在偏移地址字段,用于表示初始导入表的第一偏移地址,示例性的,基于PE文件头结构中的OptionalHeader.DataDirectory.VirtualAddress字段可确定初始导入表的第一偏移地址。
本实施例中,PE文件头占用的第一内存和块表占用的第二内存分别指PE文件头和块表的大小。其中,在PE文件头结构中存在内存标识字段,用于表示PE文件头和块表的大小,示例性的,PE文件头结构中的OptionalHeader.DataDirectory.Size字段用于表示块表的第二内存。可选的,通过调用GetImageDirectoryEntrySize函数可确定块表的占用的第二内存。
可选的,调用GetFirstImportChunk函数,基于第二地址信息、第一偏移地址、第一内存和第二内存确定初始导入表的第一地址信息。其中,根据第二地址信息、第一偏移地址、第一内存和第二内存确定初始导入表的第一地址信息,包括:将第一偏移地址、第一内存和第二内存的和值,确定块表的末端地址;将末端地址与第一偏移地址的差值确定为初始导入表的第一地址信息。
本实施例中,可以是由NTHeaders表示PE文件头的第二地址信息;由NTHeaders.size表示PE文件头占用的第一内存;由DataSize表示块表占用的第二内存,由VirtualAddress表示初始导入表的第一偏移地址。
示例性的,初始导入表的第一地址信息可通过如下公式确定:NTHeaders+NTHeaders.size+DataSize–VirtualAddress。
S120、删除初始导入表中非启动文件的标识信息,确定DLL文件的启动导入表。
本实施例中,识别初始导入表中的非启动文件并删除,使得生成的启动导入表中仅包含目标应用程序启动所必须的DLL文件,进一步减少目标应用程序在启动过程中加载的DLL文件的数量,提高启动速度。
可选的,删除初始导入表中非启动文件的标识信息,确定DLL文件的启动导入表,包括:获取各DLL文件的标识字段;根据标识字段确定各DLL文件是否为非启动文件;若是,则在初始导入表中删除非启动文件的标识信息;将删除非启动文件的标识信息后的初始导入表确定为启动导入表。
其中,各个DLL文件均设置有标识字段,用于表示DLL文件为启动文件还是非启动文件。可选的,根据标识字段确定各DLL文件是否为非启动文件,包括:若DLL文件的标识字段为空,则确实DLL文件为非启动文件。若DLL文件的标识字段为1,则确定DLL文件为启动文件。遍历目标应用程序的初始导入表中的所有DLL文件,并删除非启动文件的标识信息,生成启动导入表。启动导入表中仅包含目标应用程序启动所必须的DLL文件。
S130、根据DLL文件的启动导入表启动目标应用程序。
根据启动导入表中包含的DLL文件的标识信息,加载对应的DLL文件,以实现启动目标应用程序。
本实施例的技术方案,通过获取目标应用程序的DLL文件的初始导入表,识别并删除初始导入表中非启动文件的标识信息,以生成目标应用程序的启动导入表,并根据仅包含目标应用程序启动所必须的DLL文件的启动导入表启动该目标应用程序,以实现在目标应用程序启动的过程中仅加载目标应用程序启动所必须的DLL文件,减少了在应用程序启动过程中DLL文件的加载数量,提高了应用程序的启动速度。
在上述技术方案的基础上,在根据DLL文件的启动导入表启动目标应用程序之后,还包括:接收控制指令,若控制指令对应的DLL文件未加载,则加载控制指令对应的DLL文件。
在目标应用程序启动之后,实时接收用户输入的控制指令,并检查控制指令对应的DLL文件是否已经加载完成,若已加载完成,则调用并执行对应的DLL文件;若对应的DLL文件未加载,则加载控制指令对应的DLL文件并执行,避免由于目标应用程序的非启动文件未加载,导致的目标应用程序的功能无法实现。
实施例二
图2是本发明实施例二提供的一种应用程序启动装置的结构示意图。该装置包括:
初始导入表获取模块210,用于获取目标应用程序的动态链接库DLL文件的初始导入表,其中,初始导入表包括启动文件的标识信息和非启动文件的标识信息;
启动导入表确定模块220,用于删除初始导入表中非启动文件的标识信息,确定DLL文件的启动导入表;
启动模块230,用于根据DLL文件的启动导入表启动目标应用程序。
可选的,初始导入表获取模块210包括:
PE文件获取单元,用于获取目标应用程序的PE文件结构;
初始导入表获取单元,用于根据PE文件结构确定DLL文件的初始导入表的第一地址信息,并根据第一地址信息获取DLL文件的初始导入表。
可选的,PE文件结构至少包括PE文件头和块表,块表中包含初始导入表;其中,初始导入表获取单元包括:
第一信息获取子单元,用于获取PE文件头的第二地址信息和初始导入表的第一偏移地址;
第二信息获取子单元,用于获取PE文件头占用的第一内存和块表占用的第二内存;
初始导入表地址获取子单元,用于根据第二地址信息、第一偏移地址、第一内存和第二内存确定初始导入表的第一地址信息。
可选的,初始导入表地址获取子单元具体用于:
将第一偏移地址、第一内存和第二内存的和值,确定块表的末端地址;
将末端地址与第一偏移地址的差值确定为初始导入表的第一地址信息。
可选的,启动导入表确定模块220包括:
标识字段获取单元,用于获取各DLL文件的标识字段;
文件判断单元,用于根据标识字段确定各DLL文件是否为非启动文件;
信息删除单元,用于若DLL文件为非启动文件,则在初始导入表中删除非启动文件的标识信息;
启动导入表确定单元,用于将删除非启动文件的标识信息后的初始导入表确定为启动导入表。
可选的,文件判断单元具体用于:
若DLL文件的标识字段为空,则确实DLL文件为非启动文件。
可选的,装置还包括:文件加载模块,用于在根据DLL文件的启动导入表启动目标应用程序之后,接收控制指令,若控制指令对应的DLL文件未加载,则加载控制指令对应的DLL文件。
本发明实施例提供的应用程序启动装置可执行本发明任意实施例所提供的应用程序启动方法,具备执行方法相应的功能模块和有益效果。
实施例三
图3是本发明实施例三提供的一种终端的结构示意图。参见图3,该终端包括:
一个或多个处理器310;
存储器320,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器310执行,使得所述一个或多个处理器310实现如本发明实施例提供的应用程序启动方法。
图3中以一个处理器为例;处理器和存储器可以通过总线或其他方式连接,图3中以通过总线连接为例。
存储器作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块。处理器通过运行存储在存储器中的软件程序、指令以及模块,从而执行终端的各种功能应用以及数据处理,即实现上述的应用程序启动方法。
存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器可进一步包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
另外,根据终端的不同形式,除了处理器和存储器,控制终端还可以包括其他模块或结构,例如,终端可以具备语音播报功能,则还包括扬声器;又如,终端可以是具有显示功能的设备,则还包括显示屏幕,用于显示地图数据,也可供用户在导航软件界面上进行触控操作。
本实施例提出的终端与本发明实施例提出的应用程序启动方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见实施例一,并且本实施例与实施例一具有相同的有益效果。
实施例四
本实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明实施例提出的应用程序启动方法。
本实施例提出的计算机可读存储介质与实施例提出的应用程序启动方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见实施例一,并且本实施例与实施例一具有相同的有益效果。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。