应用程序启动方法、装置、终端设备及可读存储介质转让专利

申请号 : CN201910755141.7

文献号 : CN110673887B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 钱夏欢安光霖任玉林陈鼐张超

申请人 : 华为技术有限公司

摘要 :

本申请实施例提供一种应用程序启动方法、装置、终端设备及可读存储介质,该方法包括:接收启动目标应用的指示,在接收到该指示后,根据目标应用的启动阶段的热点对象的信息,对目标应用的启动阶段的热点对象进行批量初始化,并基于被批量初始化的热点对象,启动目标应用。该方法可以避免因每次调用一个第一对象前首先进行初始化所产生的额外耗时,从而极大节省目标APP启动过程的耗时。

权利要求 :

1.一种应用程序启动方法,其特征在于,包括:接收启动目标应用的指示;

根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化,所述热点对象为被调用的次数大于第一预设阈值的对象;

基于被批量初始化的所述热点对象,启动所述目标应用;

所述根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化之前,还包括:并行执行创建第二对象以及初始化所述目标应用的运行环境信息,其中,所述第二对象用于加载第一对象以及第三对象,所述第一对象为所述目标应用启动阶段被类初始化方法调用的属于所述热点对象的对象,所述第三对象为所述目标应用启动阶段被类初始化方法调用的不属于所述热点对象的对象。

2.根据权利要求1所述的方法,其特征在于,所述目标应用的启动阶段的热点对象的信息包括:所述热点对象是否属于被类初始化方法调用的对象;

所述根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用启动阶段的热点对象进行批量初始化,包括:

获取所述目标应用的启动阶段的热点对象中属于被类初始化方法调用的多个第一对象;

对所述多个第一对象进行批量初始化。

3.根据权利要求2所述的方法,其特征在于,所述对所述多个第一对象进行批量初始化,包括:

在使用所述类初始化方法首次调用所述多个第一对象中的一个对象时,指示操作系统对所述多个第一对象进行批量初始化。

4.根据权利要求1所述的方法,其特征在于,所述接收启动目标应用的指示之后,还包括:

在所述目标应用的主进程中创建所述目标应用的主线程;

通过所述主线程创建子线程,所述子线程为与所述主线程并发执行的线程。

5.根据权利要求4所述的方法,其特征在于,所述并行执行创建第二对象以及初始化所述目标应用的运行环境信息,包括:在所述主线程中初始化所述目标应用的运行环境信息;

在所述子线程中创建所述第二对象。

6.根据权利要求4或5所述的方法,其特征在于,所述根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化,包括:在所述子线程中根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化。

7.根据权利要求3所述的方法,其特征在于,所述指示操作系统对所述多个第一对象进行批量初始化,包括:

通过触发初始化信号指示所述操作系统对所述多个第一对象进行批量初始化。

8.根据权利要求1-5任一项所述的方法,其特征在于,所述目标应用的启动阶段的热点对象包括类、方法、函数、字段中的至少一种。

9.根据权利要求8所述的方法,其特征在于,所述目标应用的启动阶段的热点对象的信息有序存储于同一分区中,所述分区为安装所述目标应用的终端设备中的存储区域。

10.一种应用程序启动装置,其特征在于,包括:接收模块,用于接收启动目标应用的指示;

处理模块,用于根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化,所述热点对象为被调用的次数大于第一预设阈值的对象;

所述处理模块还用于基于被批量初始化的所述热点对象,启动所述目标应用;

所述处理模块还用于:

并行执行创建第二对象以及初始化所述目标应用的运行环境信息,其中,所述第二对象用于加载第一对象以及第三对象,所述第一对象为所述目标应用启动阶段被类初始化方法调用的属于所述热点对象的对象,所述第三对象为所述目标应用启动阶段被类初始化方法调用的不属于所述热点对象的对象。

11.根据权利要求10所述的装置,其特征在于,所述目标应用的启动阶段的热点对象的信息包括:所述热点对象是否属于被类初始化方法调用的对象;

所述处理模块具体用于:

获取所述目标应用的启动阶段的热点对象中属于被类初始化方法调用的多个第一对象;以及,

对所述多个第一对象进行批量初始化。

12.根据权利要求11所述的装置,其特征在于,所述处理模块具体用于:在使用所述类初始化方法首次调用所述多个第一对象中的一个对象时,指示操作系统对所述多个第一对象进行批量初始化。

13.根据权利要求10所述的装置,其特征在于,所述处理模块还用于:在所述目标应用的主进程中创建所述目标应用的主线程;以及,通过所述主线程创建子线程,所述子线程为与所述主线程并发执行的线程。

14.根据权利要求13所述的装置,其特征在于,所述处理模块具体用于:在所述主线程中初始化所述目标应用的运行环境信息;以及,在所述子线程中创建所述第二对象。

15.根据权利要求13或14所述的装置,其特征在于,所述处理模块具体用于:在所述子线程中根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化。

16.根据权利要求12所述的装置,其特征在于,所述处理模块具体用于:通过触发初始化信号指示所述操作系统对所述多个第一对象进行批量初始化。

17.根据权利要求10-14任一项所述的装置,其特征在于,所述目标应用的启动阶段的热点对象包括类、方法、函数、字段中的至少一种。

18.根据权利要求17所述的装置,其特征在于,所述目标应用的启动阶段的热点对象的信息有序存储于同一分区中,所述分区为安装所述目标应用的终端设备中的存储区域。

19.一种终端设备,其特征在于,包括:存储器、处理器和收发器;

所述处理器用于与所述存储器耦合,读取并执行所述存储器中的指令,以实现权利要求1-9任一项所述的方法步骤;

所述收发器与所述处理器耦合,由所述处理器控制所述收发器进行消息收发。

20.一种计算机可读存储介质,其特征在于,所述计算机存储介质存储有计算机指令,当所述计算机指令被计算机执行时,使得所述计算机执行权利要求1-9任一项所述的方法的指令。

说明书 :

应用程序启动方法、装置、终端设备及可读存储介质

技术领域

[0001] 本申请实施例涉及智能终端技术,尤其涉及一种应用程序启动方法、装置、终端设备及可读存储介质。

背景技术

[0002] 随着移动互联网技术以及手机等移动终端的不断发展,利用移动终端使用移动互联网的各种服务,成为越来越多用户首选。其中,用户对于移动终端的评价结果是衡量用户
使用体验的重要指标。用户对于移动终端的评价结果可以包括多种评价维度的评价结果,
评价维度可以包括外观、性能、拍照能力、屏幕显示效果等。由于越来越多的用户选择利用
移动终端使用移动互联网的服务,因此,用户可能在移动终端上安装各种各样的应用程序
(application,APP),而APP的冷启动性能是性能评价维度中的重要一项,因此,提升APP的
冷启动性能,是提升用户对于移动终端的评价结果的重要手段。APP的冷启动性能是指在
APP进程未创建时,从用户点击APP图标到APP界面加载完成所消耗的时间。
[0003] 现有技术中,提出了一种APP冷启动方法,在用户点击APP图标后,由系统服务(system_server)进程向受精卵(zygote)进程发送消息,通知zygote进程孕育一个子进程
作为该APP的主进程,进而在该主进程的主线程中执行活动线程(ActivityThread)的主
(main)函数,以及创建默认类加载器(ClassLoader)。另外,在初始化过程中,由上述主线程
多次执行类初始化(class initialization,clinit)方法分别对APP启动过程中所需使用
的类进行初始化。但是,现有技术的方法使得APP启动时间较长,导致APP的冷启动性能不
佳。

发明内容

[0004] 本申请实施例提供一种应用程序启动方法、装置、终端设备及可读存储介质,用以减少APP启动时间,提升APP冷启动性能。
[0005] 第一方面,本申请实施例提供一种应用程序启动方法,该方法包括:接收启动目标应用的指示,在接收到该指示后,根据目标应用的启动阶段的热点对象的信息,对目标应用
的启动阶段的热点对象进行批量初始化,并基于被批量初始化的热点对象,启动目标应用。
[0006] 该方法中,由于在目标APP中预先包含启动阶段的热点对象的信息,因此,终端设备可以基于该信息对热点对象中需要在目标APP启动阶段调用的对象进行批量初始化,从
而避免因每次调用一个第一对象前首先进行初始化所产生的额外耗时,从而极大节省目标
APP启动过程的耗时。同时,对于APP启动阶段需要被类初始化方法调用的不属于热点对象
的对象不进行批量初始化,可以避免对非热点的对象提前进行不必要的初始化,进而避免
产生新的耗时。
[0007] 在一种可能的实现方式中,上述目标应用的启动阶段的热点对象的信息可以包括:热点对象是否属于被类初始化方法调用的对象。当热点对象的信息包括热点对象是否
属于被类初始化方法调用的对象,终端设备在根据目标应用的启动阶段的热点对象的信
息,对目标应用启动阶段的热点对象进行批量初始化时,可以按照如下过程执行:
[0008] 获取目标应用的启动阶段的热点对象中属于被类初始化方法调用的多个第一对象,并对该多个第一对象进行批量初始化。
[0009] 该方法中,热点对象中属于被类初始化方法调用的对象可能在目标APP启动时被频繁调用,对这些对象进行批量初始化,可以使得批量初始化的针对性更强,效率更高。
[0010] 在一种可能的实现方式中,在对多个第一对象进行批量初始化时,可以在使用类初始化方法首次调用多个第一对象中的一个对象时,指示操作系统对上述多个第一对象进
行批量初始化。
[0011] 在一种可能的实现方式中,在根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化之前,可以首先并行执行创建第二
对象以及初始化所述目标应用的运行环境信息。其中,该第二对象用于加载上述第一对象
以及第三对象,上述第三对象为所述目标应用启动阶段被类初始化方法调用的不属于所述
热点对象的对象。
[0012] 该方法中,通过并行执行创建第二对象以及初始化所述目标应用的运行环境信息,从而可以进一步减少APP冷启动的耗时,进而极大提升APP冷启动的性能。
[0013] 在一种可能的实现方式中,在接收启动目标应用的指示之后,可以在所述目标应用的主进程中创建所述目标应用的主线程,并通过所述主线程创建子线程,所述子线程为
与所述主线程并发执行的线程。
[0014] 在创建子线程的基础上,在上述并行执行创建第二对象以及初始化所述目标应用的运行环境信息时,可以在主线程中初始化所述目标应用的运行环境信息,并在所述子线
程中创建所述第二对象。
[0015] 该方法中,通过在主线程中初始化所述目标应用的运行环境信息,以及在所述子线程中创建所述第二对象,可以实现二者的并发执行,从而可以进一步减少APP冷启动的耗
时,进而极大提升APP冷启动的性能。
[0016] 在一种可能的实现方式中,在上述创建子线程的基础上,在所述根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化
时,可以在所述子线程中根据所述目标应用的启动阶段的热点对象的信息,对所述目标应
用的启动阶段的热点对象进行批量初始化。
[0017] 该方法中,通过在在线程中对所述目标应用的启动阶段的热点对象进行批量初始化,可以实现热点对象批量初始化与初始化所述目标应用的运行环境信息的并发执行,从
而可以进一步减少APP冷启动的耗时,进而极大提升APP冷启动的性能。
[0018] 在一种可能的实现方式中,在指示操作系统对所述多个第一对象进行批量初始化时,可以通过触发初始化信号指示所述操作系统对所述多个第一对象进行批量初始化。
[0019] 在一种可能的实现方式中,所述目标应用的启动阶段的热点对象包括类、方法、函数、字段中的至少一种。
[0020] 在一种可能的实现方式中,所述目标应用的启动阶段的热点对象的信息有序存储于同一分区中,所述分区为安装所述目标应用的终端设备中的存储区域。
[0021] 该方法中,通过目标应用的启动阶段的热点对象包括类、方法、函数、字段中的至少一种,以及将所述目标应用的启动阶段的热点对象的信息有序存储于同一分区中,使得
热点对象被有序存储于同一分区中,终端设备仅需要执行一次分区读取,即可读取到多个
热点对象的信息,当需要调用这些对象时,可以直接进行调用,无需进行频繁的分区读取,
因此,能够明显减少I/O操作。终端设备能够采集的热点对象至少包括类、方法、函数以及字
段,对这些热点对象均可以按照有序存储的同一分区的方式存储,使得减少I/O操作的效果
更佳,进而使得目标APP的性能优化更加深入。
[0022] 第二方面,本申请实施例提供一种应用程序启动装置,该装置包括:接收模块和处理模块。该接收模块,用于接收启动目标应用的指示,该处理模块,用于根据所述目标应用
的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化,
还用于基于被批量初始化的所述热点对象,启动所述目标应用。
[0023] 在一种可能的实现方式中,所述目标应用的启动阶段的热点对象的信息包括:所述热点对象是否属于被类初始化方法调用的对象。
[0024] 所述处理模块具体用于:
[0025] 获取所述目标应用的启动阶段的热点对象中属于被类初始化方法调用的多个第一对象;以及,对所述多个第一对象进行批量初始化。
[0026] 在一种可能的实现方式中,所述处理模块具体用于:
[0027] 在使用所述类初始化方法首次调用所述多个第一对象中的一个对象时,指示操作系统对所述多个第一对象进行批量初始化。
[0028] 在一种可能的实现方式中,所述处理模块还用于:
[0029] 并行执行创建第二对象以及初始化所述目标应用的运行环境信息,其中,所述第二对象用于加载所述第一对象以及第三对象,所述第三对象为所述目标应用启动阶段被类
初始化方法调用的不属于所述热点对象的对象。
[0030] 在一种可能的实现方式中,所述处理模块还用于:
[0031] 在所述目标应用的主进程中创建所述目标应用的主线程;以及,通过所述主线程创建子线程,所述子线程为与所述主线程并发执行的线程。
[0032] 在一种可能的实现方式中,所述处理模块具体用于:
[0033] 在所述主线程中初始化所述目标应用的运行环境信息;以及,在所述子线程中创建所述第二对象。
[0034] 在一种可能的实现方式中,所述处理模块具体用于:
[0035] 在所述子线程中根据所述目标应用的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化。
[0036] 在一种可能的实现方式中,所述处理模块具体用于:
[0037] 通过触发初始化信号指示所述操作系统对所述多个第一对象进行批量初始化。
[0038] 在一种可能的实现方式中,所述目标应用的启动阶段的热点对象包括类、方法、函数、字段中的至少一种。
[0039] 在一种可能的实现方式中,所述目标应用的启动阶段的热点对象的信息有序存储于同一分区中,所述分区为安装所述目标应用的终端设备中的存储区域。
[0040] 第三方面,本申请实施例提供一种装置,包括:输入接口电路,逻辑电路,输出接口电路,其中,所述逻辑电路用于执行上述第一方面所述的方法。
[0041] 第四方面,本申请实施例提供一种终端设备,该终端设备包括:存储器、处理器和收发器;所述处理器用于与所述存储器耦合,读取并执行所述存储器中的指令,以实现上述
第一方面所述的方法步骤;所述收发器与所述处理器耦合,由所述处理器控制所述收发器
进行消息收发。
[0042] 第五方面,本申请实施例提供一种计算机程序产品,所述计算机程序产品包括计算机程序代码,当所述计算机程序代码被计算机执行时,使得所述计算机执行上述第一方
面所述的方法。
[0043] 第六方面,本申请实施例提供一种计算机可读存储介质,所述计算机存储介质存储有计算机指令,当所述计算机指令被计算机执行时,使得所述计算机执行上述第一方面
所述的方法的指令。
[0044] 第七方面,本申请实施例提供一种芯片,所述芯片与存储器相连,用于读取并执行所述存储器中存储的软件程序,以实现上述第一方面所提供的方法。

附图说明

[0045] 图1为现有技术提供的一种APP冷启动方法的交互示意图;
[0046] 图2为本申请实施例提供的应用程序启动方法的示例性系统架构图;
[0047] 图3为本申请实施例提供的应用程序启动方法的交互流程图;
[0048] 图4为本申请实施例提供的应用程序启动方法的交互流程图;
[0049] 图5为安卓操作系统中APP启动阶段的对比示意图;
[0050] 图6为本申请实施例提供的一种应用程序启动装置的模块结构图;
[0051] 图7为本申请实施例提供的另一种应用程序启动装置的模块结构图;
[0052] 图8为本申请实施例提供的一种终端设备的结构示意图。

具体实施方式

[0053] 图1为现有技术提供的一种APP冷启动方法的交互示意图,如图1所示,APP冷启动过程包括:
[0054] S101、系统桌面向系统服务进程发送启动APP的消息。
[0055] 系统桌面(Launcher)在检测到用户点击APP图标的操作之后,向system_server进程发送启动APP的消息。
[0056] S102、系统服务进程向受精卵进程发送通知消息。
[0057] 该通知消息用于通知zygote进程孕育子进程。
[0058] S103、受精卵进程孕育出APP的主进程,该主进程中包括主线程。
[0059] S104、受精卵进程向系统服务进程返回所孕育出的APP的主进程的标识。
[0060] S105、系统服务进程向APP的主线程发送绑定应用的消息。
[0061] S106、APP的主线程执行ActivityThread的main函数以及创建默认ClassLoader。
[0062] 执行ActivityThread的main函数以及创建默认ClassLoader均在主线程中进行,因此,需要串行执行。
[0063] S107、APP的主线程加载、初始化以及调用启动中所需对象,启动APP。
[0064] 在上述的处理过程中,在串行完成执行ActivityThread的main函数以及创建默认ClassLoader之后,按照APP的启动流程,在主线程中加载、初始化以及调用APP启动中所所
需的对象。该对象包括类、方法、函数等。其中,在启动流程中每需要调用一个类前,首先需
要执行clinit方法对该类进行初始化,进而调用该类,使得该类执行。APP启动过程中可能
需要调用大量的类,因此需要多次执行clinit方法进行所需调用的类的初始化,这种方法
使得APP的启动时间长,导致APP的冷启动性能下降。
[0065] 另外,APP的主线程在接收到system_server进程发送的绑定应用的消息后,依次执行ActivityThread的main函数,以及创建默认ClassLoader,该过程为串行执行,这种处
理方式也进一步使得APP启动时间变长,进而导致APP的冷启动性能不佳。
[0066] 本申请实施例的技术方案,旨在解决上述问题。
[0067] 在说明本申请实施例的技术方案之前,首先对本申请实施例涉及的技术术语进行解释说明。
[0068] 1、类
[0069] 在面向对象的程序设计中,通过一组数据抽象来建立问题的模型,这种抽象可以称为类。一个类中可以包括若干数据和方法。其中,数据用于描述类的特征,数据具体可以
指字段。
[0070] 2、方法
[0071] 一个类中可以包含若干方法,方法是类中定义的函数,一个方法用于描述类的一个行为。
[0072] 3、函数
[0073] 函数与方法的本质相同,一个函数用于描述一个行为,在本申请实施例中,函数不属于某个类,而方法隶属于一个类。
[0074] 4、热点对象
[0075] 热点对象可以指在APP启动和运行过程中,被调用的次数大于第一预设阈值的对象。热点对象至少可以包括:类、方法、函数、字段。
[0076] 5、clinit
[0077] Java语言中的类初始化方法,在首次加载某个类时被调用,通过clinit方法可以初始化一个类。
[0078] 6、ClassLoader
[0079] Java语言中的类加载器方法,通过调用ClassLoader方法,可以加载一个类。
[0080] 本申请实施例以下以使用Java语言编写运行在安卓操作系统下的APP为例对本申请实施例的技术方案进行说明,但是,这并不能作为对本申请实施例的限制,本申请实施例
同样适用于使用其他语言编写的运行在其他操作系统下的APP。
[0081] 本申请实施例旨在提升安装在终端设备上的APP的冷启动性能,为便于描述,本申请以下实施例将该APP称为“目标APP”。值得说明的是,在本申请实施例中,“目标APP”等同
于“目标应用”。
[0082] 图2为本申请实施例提供的应用程序启动方法的示例性系统架构图,如图2所示,该系统包括云服务器以及终端设备。其中,终端设备的数量可以为一个,也可以为多个。在
该系统中,云服务器用于获取APP的启动阶段的热点对象的信息,将目标APP的启动阶段的
热点对象的信息编译至目标APP的安装文件中,终端设备可以从云服务器获取目标APP的安
装文件进行安装,当目标APP在终端设备上启动时,可以通过本申请实施例的方法减少目标
APP的启动耗时,提升目标APP的冷启动性能。
[0083] 本申请实施例所涉及的终端设备(包括第一终端设备和第二终端设备)也可以称为终端Terminal、用户设备(user equipment,UE)、移动台(mobile station,MS)、移动终端
(mobile terminal,MT)等。终端设备可以是手机(mobile phone)、平板电脑(Pad)、带无线
收发功能的电脑、虚拟现实(Virtual Reality,VR)终端设备、增强现实(Augmented 
Reality,AR)终端设备、工业控制(industrial control)中的无线终端、无人驾驶(self 
driving)中的无线终端、远程手术(remote medical surgery)中的无线终端、智能电网
(smart grid)中的无线终端、运输安全(transportation safety)中的无线终端、智慧城市
(smart city)中的无线终端、智慧家庭(smart home)中的无线终端等等。
[0084] 终端设备可以部署在陆地上,包括室内或室外、手持或车载;也可以部署在水面上;还可以部署在空中的飞机、气球和人造卫星上。本申请的实施例对终端设备的应用场景
不做限定。
[0085] 图3为本申请实施例提供的应用程序启动方法的交互流程图,在图3中,系统桌面、系统服务进程以及受精卵进程均为安卓操作系统下的进程,本领域技术人员能够理解的
是,当本申请实施例的方法应用于其他操作系统时,进程的名称、进程之间交互的过程可能
存在一定的差异。如图3所示,该方法包括:
[0086] S301、系统桌面向系统服务进程发送启动目标APP的消息。
[0087] 系统桌面(Launcher)是安卓操作系统的启动器,在安卓操作系统中,所有APP均通过点击桌面上的应用图标来启动。当用户点击桌面上一个目标APP的图标之后,触发
Launcher向系统服务(system_server)进程发送启动目标APP的指示。对于终端设备来说,
当用户点击目标APP的图标之后,终端设备即接收到启动目标APP的指示。
[0088] S302、系统服务进程向受精卵进程发送通知消息。
[0089] 受精卵(zygote)进程是所有APP进程的父进程,在安卓操作系统中,所有的APP进程均由zygote进程孕育。因此,当system_server进程接收到启动目标APP的消息后,可以向
zygote进程发送通知消息,该通知消息用于通知zygote进程孕育目标APP的主进程。
[0090] S303、受精卵进程孕育出目标APP的主进程,该主进程中包括主线程。
[0091] zygote进程接收到system_server进程的通知消息,根据该通知消息,孕育出目标APP的主进程,并在该主进程中创建目标APP的主线程。对于终端设备来说,终端设备在接收
到启动APP的指示后,可以创建目标APP的主线程。
[0092] 安卓操作系统中,zygote进程为目标APP孕育出主进程之后,目标APP的主进程被分配特定的资源,在主进程中创建主线程后,由主线程使用为主进程所分配的资源,执行目
标APP对应的各项操作。
[0093] S304、受精卵进程向系统服务进程返回所孕育出的目标APP的主进程的标识。
[0094] S305、系统服务进程向目标APP的主线程发送绑定应用的消息。
[0095] system_server进程可以在绑定应用的消息中携带目标APP的安装路径、包名称等信息,以供主线程按照这些信息执行所需的操作。
[0096] S306、目标APP的主线程执行创建第二对象以及初始化目标APP的运行环境信息。
[0097] 其中,第二对象用于加载第一对象和第三对象,第一对象为在目标APP的启动阶段的热点对象中属于被类初始化方法调用的对象,热点对象以及第一对象的信息将在下述实
施例中进行详细描述。第三对象为目标APP启动阶段被类初始化方法调用的不属于热点对
象的对象。
[0098] 示例性的,在安卓操作系统中,上述第二对象可以指类加载器(ClassLoader),在主线程中创建ClassLoader之后,可以由ClassLoader加载在目标APP启动阶段所需调用的
对象,这些对象被加载之后可以被初始化以及调用,以实现各自在目标APP启动阶段的功
能。
[0099] 示例性的,在安卓操作系统中,上述初始化目标APP的运行环境信息可以指执行活动线程(ActivityThread)的主(main)函数,在该函数中,可以对目标APP的运行环境信息进
行初始化,在目标APP的运行环境信息被初始化之后,可以建立目标APP中的消息循环,目标
APP在启动过程中,通过消息循环进行对象的调用,以实现目标APP启动。
[0100] S307、目标APP的主线程根据目标APP的启动阶段的热点对象的信息,对目标APP的启动阶段的热点对象进行批量初始化。
[0101] 可选的,在目标APP发布之前的测试阶段,可以采集目标APP启动过程中的热点对象的信息。该热点对象是指在目标APP启动过程中,被调用的次数大于第一预设阈值的对
象。热点对象至少可以包括:类、方法、函数、字段。该热点对象的信息可以包括热点对象的
标识以及热点对象是否属于被类初始化方法调用的对象。如果一个热点对象属于被类初始
化方法调用的对象,则说明在目标APP启动时,需要首先执行类初始化方法(例如clinit方
法)对该热点对象进行初始化,进而才可以调用该热点对象。本申请实施例中,将目标APP的
启动阶段的热点对象中属于被类初始化方法调用的对象,称为第一对象。第一对象的数量
可以为多个。上述热点对象的信息被编译至目标APP的安装文件中,当目标APP在终端设备
上安装之后,用户点击目标APP的图标之后,终端设备可以根据热点对象的信息对上述多个
第一对象进行批量初始化。
[0102] 如前文所述,目标APP启动阶段的热点对象是指目标APP启动过程中调用次数较多的对象,如果这些热点对象被分别初始化,则目标APP启动耗时较大。而本实施例中,目标
APP中预先包含了热点对象的信息,热点对象的信息除了包括热点对象的标识外,还可以包
括:热点对象是否属于被类初始化方法调用的对象。在进行上述批量初始时,可以从目标
APP所包含的启动阶段的热点对象的信息中获取属于被类初始化方法调用的多个第一对
象,并对该多个第一对象进行批量初始化。通过预先包含热点对象的信息,使得终端设备可
以直接获知目标APP中的热点对象,以及热点对象中需要被类初始化方法调用的第一对象,
进而通过对这些第一对象进行批量初始化,从而避免因每次调用一个第一对象前首先进行
初始化所产生的额外耗时,从而极大节省目标APP启动过程的耗时。同时,仅对热点对象中
需要被类初始化方法调用的对象进行批量初始化,而对于APP启动阶段需要被类初始化方
法调用的不属于热点对象的对象,即上述第三对象,不进行批量初始化,可以避免对非热点
的对象提前进行不必要的初始化,进而避免产生新的耗时。
[0103] 进行上述批量初始化的一种可选方式为:
[0104] 在使用上述的类初始化方法首次调用上述的多个第一对象中的一个对象时,指示操作系统对上述多个第一对象进行批量初始化。
[0105] 其中,在使用上述的类初始化方法首次调用上述的多个第一对象中的一个对象,是指在该多个第一对象中首次调用一个对象。
[0106] 具体的,可以首先获取上述首次调用的对象,进而,根据第一对象的信息,指示操作系统对上述多个第一对象进行批量初始化。
[0107] 以下为获取上述首次调用的对象的过程。
[0108] 按照目标APP的启动流程,终端设备调用各种对象。示例性的,用户点击目标APP的图标之后,终端设备需要显示目标APP的首页面,则终端设备需要调用某个对象A以绘制目
标APP首页面中待显示的组件。
[0109] 终端设备可以读取目标APP启动阶段的热点对象的信息,并根据第一对象的特定标记,从中选择出属于第一对象。第一对象的特定标记将在下述实施例中详细说明。作为一
种示例,这些选择出的第一对象的信息可以存储在特定格式的文件中,例如以.def格式的
文件中。进而,在目标APP的启动流程中,从调用上述文件中的第一个对象开始,判断该对象
是否已经被初始化,若未被初始化,则对上述文件中的所有对象进行批量初始化,若已经被
初始化,则继续按照目标APP的启动流程,继续调用下一个对象,直至被调用的某个对象未
被初始化。
[0110] 在上述判断中,如果被调用的某个对象未被初始化,则说明该对象需要被初始化,即,该对象为第一对象,因此,上述判断过程为获取首个第一对象的过程。
[0111] 可选的,在上述判断某个被调用的对象是否已经被初始化时,可以判断读取的该被调用的对象的地址是否为不可读写地址,若是,则说明该对象还未被初始化,需要首先对
其初始化之后再进行调用。
[0112] 本申请实施例中,第一对象为属于APP启动阶段的热点对象并且在目标APP启动过程中被调用的对象,该对象可以为类,也可以为其他对象,例如方法、函数、字段等。本实施
例中,该第一对象可以为类,需要使用类初始化方法对其进行初始化。
[0113] 以下为指示操作系统对上述多个第一对象进行批量初始化的过程。
[0114] 终端设备在上述获取多个第一对象时,执行在APP层面,即上层应用层面。当获取到被调用的首个第一对象后,终端设备指示操作系统对所有第一对象进行批量初始化。对
第一对象进行批量初始化时,仅需要保证这些对象已经被类加载器(ClassLoader)加载,因
此,对第一对象进行批量初始化仅需要在上述步骤S306的创建第二对象之后执行即可。
[0115] 可选的,在对第一对象进行批量初始化前,可以首先调用ClassLoader批量加载该第一对象。
[0116] 一种可选方式中,可以指示操作系统首先调用ClassLoader批量加载第一对象,再批量初始化第一对象。
[0117] 另一种可选方式中,可以在上述步骤S306创建第二对象之后,获取所有的第一对象的信息,对这些第一对象进行批量加载,进而,在本步骤中,指示操作系统批量初始化该
第一对象。
[0118] 可选的,终端设备在指示操作系统对第一对象进行批量初始化时,可以通过触发初始化信号指示操作系统对上述多个第一对象进行批量初始化。
[0119] 示例性的,在安卓操作系统中,终端设备获取到首个被调用的第一对象之后,发出sigv指示信号,该sigv指示信号可以触发操作系统的runtime批量初始化第一对象。
[0120] S308、目标APP的主线程基于被批量初始化的热点对象,启动目标APP。
[0121] 可选的,在创建第二对象之后,可以由第二对象加载目标APP启动阶段需要被类初始化方法调用的对象,在这些对象被加载后,终端设备按照目标APP的启动流程,初始化以
及调用这些对象。这些需要被类初始化方法调用的对象包括第一对象和第三对象,其中,第
一对象为热点对象中需要被类初始化方法调用的对象,第三对象为不属于热点对象的需要
被类初始化方法调用的对象。在目标APP启动过程中,第一对象按照上述步骤S307的过程被
批量初始化并在目标APP启动流程中被调用,第三对象在目标APP启动流程中被初始化及调
用。除了上述需要被类初始化方法调用的对象外,目标APP在启动阶段还可能调用其他的对
象,包括:方法、函数、字段等。通过调用这些对象,可以实现目标APP的正常启动。
[0122] 本实施例中,由于在目标APP中预先包含启动阶段的热点对象的信息,因此,终端设备可以基于该信息对热点对象中需要在目标APP启动阶段调用的对象进行批量初始化,
从而避免因每次调用一个第一对象前首先进行初始化所产生的额外耗时,从而极大节省目
标APP启动过程的耗时。同时,对于APP启动阶段需要被类初始化方法调用的不属于热点对
象的对象不进行批量初始化,可以避免对非热点的对象提前进行不必要的初始化,进而避
免产生新的耗时。
[0123] 以下说明上述的热点对象的信息的生成过程。
[0124] 目标APP在启动和运行过程中,可能调用到各种各样的对象,该对象可能为类、方法、函数、字段等。当某终端设备(本申请实施例中称为测试终端设备)上安装了测试阶段的
目标APP,该测试阶段的目标APP在测试终端设备上启动和运行时,当对象被调用时,测试终
端设备可以监测对象被调用的行为,并对对象在目标APP启动过程中被调用的次数进行记
录。示例性的,测试终端设备可以通过其运行时(runtime)监测对象被调用的行为以及记录
各对象的调用次数。对于测试终端设备来说,其上所运行的所有APP的运行均基于runtime
进行,因此,runtime能够获知APP中所有对象的调用信息。本实施例中,目标APP基于
runtime运行,当目标APP中的某个对象被调用时,runtime可以记录该调用行为。示例性的,
当目标APP中的某个对象A第一次被调用时,runtime为该对象A分配一个调用次数变量,并
将该变量的值置为1,当对象A再次被调用时,runtime将该变量的值加上1,作为该变量的新
值,依次类推
[0125] 本申请实施例中,测试终端设备能够支持至少如下类型的对象的调用监测以及调用次数记录:
[0126] classmeta:类
[0127] Methodmeta:方法
[0128] Function:函数
[0129] Fieldmeta:字段
[0130] String:C风格字符串
[0131] Literal:Java字符串
[0132] 可选的,测试终端设备在记录各对象的调用次数后,可以对各对象的调用次数进行判断,如果某个对象的调用次数达到第一预设阈值,则将该对象作为一个热点对象。该热
点对象具有唯一的标识,以区别于其他对象。示例性的,可以将热点对象的名称作为热点对
象的标识。同时,测试终端设备还可以记录该热点对象是否属于被类初始化方法调用的对
象。如果某个热点对象属于被类初始化方法调用的对象,则说明在目标APP启动时,需要首
先执行类初始化方法对该热点对象进行初始化。
[0133] 测试终端设备在执行上述的记录过程后,可以得到目标APP在启动中的热点对象的信息,包括热点对象的标识以及热点对象是否属于被类初始化方法调用的对象。测试终
端设备可以将这些热点对象的信息上报至云服务器,由云服务器将该热点对象的信息编译
至目标APP的安装文件中。其中,云服务器在编译过程中,可以将目标应用的启动阶段的热
点对象的信息有序排布于同一文件中,并使用该有序存储的文件生成目标APP的安装文件。
该安装文件被安装至终端设备后,该有序存储的文件中的热点对象的信息被有序存储于终
端设备的同一分区中,其中,该分区为安装目标APP的终端设备中的存储区域。
[0134] 另外,如果热点对象属于被类初始化方法调用的对象,则还可以通过特定方式标记该热点对象中属于被类初始化方法调用的对象。示例性的,云服务器可以将热点对象中
属于被类初始化方法调用的对象存储在特定的文件中,例如.def文件中,以标记出热点对
象中属于被类初始化方法调用的对象。基于该标记方式,在上述步骤S307中进行批量初始
化时,可以直接读取该.def文件中的对象,并对这些对象进行批量初始化。
[0135] 在现有技术中,目标APP中需调用的对象被分散存储于不同的分区中,终端设备在调用时,每次可以读取一个分区的内容并进行调用,如果热点对象被分散存储于不同分区,
则终端设备需要频繁进行分区读取,从而产生大量的I/O操作。而在本实施例中,热点对象
被有序存储于同一分区中,终端设备仅需要执行一次分区读取,即可读取到多个热点对象
的信息,当需要调用这些对象时,可以直接进行调用,无需进行频繁的分区读取,因此,能够
明显减少I/O操作。另外,本实施例中,终端设备能够采集的热点对象至少包括类、方法、函
数以及字段,对这些热点对象均可以按照有序存储的同一分区的方式存储,使得减少I/O操
作的效果更佳,进而使得目标APP的性能优化更加深入。
[0136] 在上述实施例中,步骤S306中执行创建第二对象以及初始化目标APP的运行环境信息时,由目标APP的主线程串行执行,即首先执行创建第二对象,再初始化目标APP的运行
环境信息。而对于执行创建第二对象以及初始化目标APP的运行环境信息来说,二者之间并
不存在先后依赖关系。因此,在本申请实施例中,作为一种可选的实施方式,可以并行执行
创建第二对象以及初始化所述目标APP的运行环境信息。
[0137] 可选的,在行执行创建第二对象以及初始化所述目标APP的运行环境信息时,可以通过并行线程来执行。
[0138] 具体的,终端设备可以在目标APP的主进程中创建目标APP的主线程,并通过主线程创建子线程,该子线程为与主线程并发执行的线程。进而,在主线程中创建第二对象,在
子线程中初始化目标APP的运行环境信息。
[0139] 同时,终端设备可以在子线程中执行前述步骤S307中的批量初始化。
[0140] 以下通过交互流程说明上述线程并发执行的过程。
[0141] 图4为本申请实施例提供的应用程序启动方法的交互流程图,如图4所示,该方法包括:
[0142] S401、系统桌面向系统服务进程发送启动目标APP的消息。
[0143] 该步骤的执行过程与前述步骤S301相同,可以参照前述步骤S301,此处不再赘述。
[0144] S402、系统服务进程向受精卵进程发送通知消息。
[0145] 该步骤的执行过程与前述步骤S302相同,可以参照前述步骤S302,此处不再赘述。
[0146] S403、受精卵进程孕育出目标APP的主进程,该主进程中包括主线程。
[0147] 该步骤的执行过程与前述步骤S303相同,可以参照前述步骤S303,此处不再赘述。
[0148] S404、受精卵进程向系统服务进程返回APP的主进程的标识。
[0149] 该步骤的执行过程与前述步骤S304相同,可以参照前述步骤S304,此处不再赘述。
[0150] S405、系统服务进程向APP的主线程发送绑定应用的消息。
[0151] 该步骤的执行过程与前述步骤S305相同,可以参照前述步骤S305,此处不再赘述。
[0152] S406、通过主线程创建子线程,该子线程与主线程为并发执行的线程。
[0153] 当在目标APP的主进程中创建主线程之后,可以在主线程中创建一个子线程,该子线程为主进程下的线程,该子线程可以与主线程并发执行。因此,对于不存在先后依赖关系
的运行操作,可以分别通过该主线程和子线程来执行。具体的,可以在主线程中初始化目标
APP的运行环境信息,在子线程中创建上述第二对象。而由于对目标应用的启动阶段的热点
对象进行批量初始化需要在创建第二对象后完成,因此,可以在子线程中创建完成第二对
象后,再在子线程中对目标应用的启动阶段的热点对象进行批量初始化。
[0154] 在上述的三个运行操作中,在主线程中初始化目标APP的运行环境信息在下述步骤S407中执行,在子线程中创建上述第二对象在下述步骤S408中执行,在子线程中对目标
应用的启动阶段的热点对象进行批量初始化在下述步骤S409中执行。基于上述的描述可
知,步骤S407分别与步骤S408和步骤S409并发执行,步骤S408和步骤S409为顺序执行,即先
执行步骤S408,再执行步骤S409。
[0155] 另外值得说明的是,步骤S405与步骤S407为顺序执行,而步骤S405与步骤S406并发执行,即只要主线程被创建之后,即可在主线程中创建子线程,而在主线程中初始化目标
APP的运行环境信息需要在接收到系统服务进程的绑定应用的消息后才可以执行。
[0156] S407、在主线程中初始化目标APP的运行环境信息。
[0157] 示例性的,在安卓操作系统中,上述初始化目标APP的运行环境信息可以指执行活动线程(ActivityThread)的主(main)函数,在该函数中,可以对目标APP的运行环境信息进
行初始化,在目标APP的运行环境信息被初始化之后,可以建立目标APP中的消息循环,以实
现目标APP启动。
[0158] 本步骤中,可以在子线程中执行活动线程(ActivityThread)的主(main)函数,执行该函数之后,目标APP的运行环境信息被初始化,基于运行环境信息初始化的结果,可以
在该主线程中建立目标APP中的消息循环,目标APP在启动过程中,通过消息循环进行对象
的调用,并实现APP的启动。
[0159] S408、在子线程中创建上述第二对象。
[0160] 以安卓操作系统为例,上述第二对象可以指加载器(ClassLoader),当在主线程中创建了子线程之后,可以在子线程中创建ClassLoader,ClassLoader之后,可以加载在目标
APP启动阶段所需调用的对象,这些对象被加载之后可以被初始化以及调用,以实现各自在
目标APP启动阶段的功能。
[0161] S409、在子线程中根据目标APP的启动阶段的热点对象的信息,对目标APP的启动阶段的热点对象进行批量初始化。
[0162] 该步骤的执行过程与前述的步骤S307中一致,区别在于该步骤在子线程中进行,而上述步骤S307在主线程中进行。具体执行过程可以前述步骤S307,此处不再赘述。
[0163] S410、目标APP的主线程基于被批量初始化的热点对象,启动目标APP。
[0164] 该步骤在上述步骤S401-S409之后执行。
[0165] 该步骤的执行过程与前述步骤S308相同,可以参照前述步骤S308,此处不再赘述。
[0166] 本实施例中,通过在目标APP的主线程中创建子线程,由子线程创建用于加载其他对象的第二对象以及对目标APP的启动阶段的热点对象进行批量初始化,由主线程初始化
目标APP的运行环境信息,主线程和子线程并发执行,从而使得初始化目标APP的运行环境
信息与创建第二对象和对热点对象批量初始化的过程可以并发执行,从而进一步减少APP
冷启动的耗时,进而极大提升APP冷启动的性能。
[0167] 图5为安卓操作系统中APP启动阶段的对比示意图,如图4所示,基于安卓操作系统的一个APP启动阶段可能涉及4个耗时,其中,0表示zygote进程的启动耗时,1表示开机资源
的加载耗时,2表示Launcher的启动耗时,3表示安卓操作系统下一个APP启动阶段的耗时。
在3中,3-1表示创建第二对象的耗时,3-2表示初始化目标APP的运行环境信息耗时,3-3表
示初始化对象的耗时,3-4表示加载对象以及启动APP的耗时。参照图4,在图1所示的现有处
理流程中,3-1、3-2、3-3和3-4对应的处理过程需要串行执行,因此,3的总耗时为3-1、3-2、
3-3和3-4之和。而在本申请实施例中,3-1、3-2和3-3对应的处理过程可以并发执行,因此,
3-1、3-2、3-3的总耗时为3-1与3-3的耗时之和与3-2的耗时中的最大值。因此,本申请实施
例相比于现有处理过程,可以解答节省APP启动的耗时。
[0168] 假设上述图4中3-1的耗时为T1,3-2的耗时为T2,同时假设现有处理过程中3-3的耗时与本申请实施例中3-3均为T3,如果使用现有处理过程,则在上述3-1、3-2、3-3环节上
的耗时T为下述公式(1)所示:
[0169] T=T1+T2+T3      (1)
[0170] 而在使用本实施例之后,上述3-1、3-2、3-3环节上的耗时T为下述公式(2)所示:
[0171] T=max{T1+T3,T2}       (2)
[0172] 由上述公式(1)和公式(2)进一步可知,在现有处理过程中3-3的耗时与本申请实施例中3-3的耗时相同的情况下,本实施例相比于现有处理过程,由于创建了子线程执行3-
1与3-3,并在主线程中并发执行3-2,因此,可以极大节省APP冷启动的耗时。而如前文所述,
本申请实施例由于对热点对象中需要在目标APP启动阶段调用的对象进行批量初始化,因
此,在初始化对象上的耗时相比现有处理过程中初始化对象的耗时有极大减少,即,本申请
实施例中3-3的耗时比现有处理过程中3-3的耗时明显减少,因此,将本申请实施例中的主
线程和子线程并发执行处理以及批量初始化对象进行结合之后,在目标APP启动阶段上的
耗时相比现有处理过程的耗时有更大程度的减少。
[0173] 图6为本申请实施例提供的一种应用程序启动装置的模块结构图,该装置可以为前述实施例所描述的终端设备,也可以为能够使得终端设备实现本申请实施例提供的方法
中的终端设备的功能的装置,例如该装置可以是终端设备中的装置或芯片系统。如图6所
示,该装置包括:接收模块601和处理模块602。
[0174] 接收模块601,用于接收启动目标应用的指示。
[0175] 处理模块602,用于根据目标应用的启动阶段的热点对象的信息,对目标应用的启动阶段的热点对象进行批量初始化。
[0176] 另外,处理模块602还用于基于被批量初始化的热点对象,启动目标应用。
[0177] 在一种可选的实施方式中,上述目标应用的启动阶段的热点对象的信息包括:热点对象是否属于被类初始化方法调用的对象。当热点对象的信息包括热点对象是否属于被
类初始化方法调用的对象时,处理模块602具体用于:
[0178] 获取目标应用的启动阶段的热点对象中属于被类初始化方法调用的多个第一对象,并对该多个第一对象进行批量初始化。
[0179] 在一种可选的实施方式中,处理模块602具体用于:
[0180] 在使用类初始化方法首次调用上述多个第一对象中的一个对象时,指示操作系统对该多个第一对象进行批量初始化。
[0181] 在一种可选的实施方式中,处理模块602还用于:
[0182] 并行执行创建第二对象以及初始化目标应用的运行环境信息,其中,该第二对象用于加载第一对象以及第三对象,该第三对象为上述目标应用启动阶段被类初始化方法调
用的不属于所述热点对象的对象。
[0183] 在一种可选的实施方式中,处理模块602还用于:
[0184] 在目标应用的主进程中创建目标应用的主线程,以及,通过该主线程创建子线程,该子线程为与该主线程并发执行的线程。
[0185] 在一种可选的实施方式中,处理模块602具体用于:
[0186] 在主线程中初始化目标应用的运行环境信息,以及,在子线程中创建第二对象。
[0187] 在一种可选的实施方式中,处理模块602具体用于:
[0188] 在子线程中根据目标应用的启动阶段的热点对象的信息,对目标应用的启动阶段的热点对象进行批量初始化。
[0189] 在一种可选的实施方式中,处理模块602具体用于:
[0190] 通过触发初始化信号指示操作系统对上述多个第一对象进行批量初始化。
[0191] 在一种可选的实施方式中,上述目标应用的启动阶段的热点对象包括类、方法、函数、字段中的至少一种。
[0192] 在一种可选的实施方式中,上述目标应用的启动阶段的热点对象的信息有序存储于同一分区中,该分区为安装目标应用的终端设备中的存储区域。
[0193] 本申请实施例提供的应用程序启动装置,可以执行上述方法实施例中的方法步骤,其实现原理和技术效果类似,在此不再赘述。
[0194] 需要说明的是,应理解以上装置的各个模块的划分仅仅是一种逻辑功能的划分,实际实现时可以全部或部分集成到一个物理实体上,也可以物理上分开。且这些模块可以
全部以软件通过处理元件调用的形式实现;也可以全部以硬件的形式实现;还可以部分模
块通过处理元件调用软件的形式实现,部分模块通过硬件的形式实现。例如,确定模块可以
为单独设立的处理元件,也可以集成在上述装置的某一个芯片中实现,此外,也可以以程序
代码的形式存储于上述装置的存储器中,由上述装置的某一个处理元件调用并执行以上确
定模块的功能。其它模块的实现与之类似。此外这些模块全部或部分可以集成在一起,也可
以独立实现。这里所描述的处理元件可以是一种集成电路,具有信号的处理能力。在实现过
程中,上述方法的各步骤或以上各个模块可以通过处理器元件中的硬件的集成逻辑电路或
者软件形式的指令完成。
[0195] 例如,以上这些模块可以是被配置成实施以上方法的一个或多个集成电路,例如:一个或多个特定集成电路(application specific integrated circuit,ASIC),或,一个
或多个微处理器(digital signal processor,DSP),或,一个或者多个现场可编程门阵列
(field programmable gate array,FPGA)等。再如,当以上某个模块通过处理元件调度程
序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(central 
processing unit,CPU)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一
起,以片上系统(system-on-a-chip,SOC)的形式实现。
[0196] 在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。该计算机程序产
品包括一个或多个计算机指令。在计算机上加载和执行该计算机程序指令时,全部或部分
地产生按照本申请实施例所描述的流程或功能。上述计算机可以是通用计算机、专用计算
机、计算机网络、或者其他可编程装置。上述计算机指令可以存储在计算机可读存储介质
中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,上述计算机
指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字
用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或
数据中心进行传输。上述计算机可读存储介质可以是计算机能够存取的任何可用介质或者
是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。上述可用介质可以
是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘
solid state disk(SSD))等。
[0197] 基于与本申请上述实施例提供的应用程序启动方法的同一发明构思,本申请实施例还提供了一种应用程序启动装置,用于实现上述实施例中的应用程序启动方法,上述实
施例的应用程序启动方法中的部分或全部可以通过硬件来实现也可以通过软件来实现,当
通过硬件实现时,参见图7所示,该应用程序启动装置700包括:
[0198] 输入接口电路702,逻辑电路704,输出接口电路706,还包括收发器708和天线710,收发器708通过天线710进行数据的收发。
[0199] 其中,逻辑电路704,用于执行图2-图5所示的应用程序启动方法中终端设备的方法步骤,具体请见前面方法实施例中的描述,此处不再赘述。在具体实现时,上述应用程序
启动装置700可以是芯片或者集成电路。
[0200] 图8为本申请实施例提供的一种终端设备的结构示意图。如图8所示,该终端设备800可以包括:处理器81(例如CPU)、存储器82、收发器83;收发器83耦合至处理器81,处理器
81控制收发器83的收发动作。存储器82中可以存储各种指令,以用于完成各种处理功能以
及实现本申请实施例中终端设备执行的方法步骤。可选的,本申请实施例涉及的终端设备
还可以包括:电源84、系统总线85以及通信端口86。收发器83可以集成在终端设备的收发信
机中,也可以为终端设备上独立的收发天线。系统总线85用于实现元件之间的通信连接。上
述通信端口86用于实现终端设备与其他外设之间进行连接通信。
[0201] 在本申请实施例中,上述处理器81用于与存储器82耦合,读取并执行存储器82中的指令,以实现上述方法实施例中终端设备执行的方法步骤。收发器83与处理器81耦合,由
处理器81控制收发器83进行消息收发,其实现原理和技术效果类似,在此不再赘述。
[0202] 该图8中提到的系统总线可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry  standard 
architecture,EISA)总线等。该系统总线可以分为地址总线、数据总线、控制总线等。为便
于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。通信接口用
于实现数据库访问装置与其他设备(例如客户端、读写库和只读库)之间的通信。存储器可
能包含随机存取存储器(random access memory,RAM),也可能还包括非易失性存储器
(non-volatile memory),例如至少一个磁盘存储器。
[0203] 上述的处理器可以是通用处理器,包括中央处理器CPU、网络处理器(network processor,NP)等;还可以是数字信号处理器DSP、专用集成电路ASIC、现场可编程门阵列
FPGA或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
[0204] 可选的,本申请实施例还提供一种计算机可读存储介质,该存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述实施例中终端设备的处理过程。
[0205] 可选的,本申请实施例还提供一种运行指令的芯片,该芯片用于执行上述实施例中终端设备的处理过程。
[0206] 本申请实施例还提供一种程序产品,该程序产品包括计算机程序,该计算机程序存储在存储介质中,至少一个处理器可以从上述存储介质读取上述计算机程序,上述至少
一个处理器执行上述实施例中终端设备的处理过程。
[0207] 在本申请实施例中,“至少一个”是指一个或者多个,“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单
独存在A,同时存在A和B,单独存在B的情况,其中A,B可以是单数或者复数。字符“/”一般表
示前后关联对象是一种“或”的关系;在公式中,字符“/”,表示前后关联对象是一种“相除”
的关系。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或
复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:a,b,c,a-b,a-c,b-c,
或a-b-c,其中,a,b,c可以是单个,也可以是多个。
[0208] 可以理解的是,在本申请的实施例中涉及的各种数字编号仅为描述方便进行的区分,并不用来限制本申请实施例的范围。
[0209] 可以理解的是,在本申请的实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请的实施例的
实施过程构成任何限定。