应用程序启动方法、装置、终端设备及可读存储介质转让专利
申请号 : CN201910755141.7
文献号 : CN110673887B
文献日 : 2021-05-04
发明人 : 钱夏欢 , 安光霖 , 任玉林 , 陈鼐 , 张超
申请人 : 华为技术有限公司
摘要 :
权利要求 :
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任一项所述的方法的指令。
说明书 :
应用程序启动方法、装置、终端设备及可读存储介质
技术领域
背景技术
使用体验的重要指标。用户对于移动终端的评价结果可以包括多种评价维度的评价结果,
评价维度可以包括外观、性能、拍照能力、屏幕显示效果等。由于越来越多的用户选择利用
移动终端使用移动互联网的服务,因此,用户可能在移动终端上安装各种各样的应用程序
(application,APP),而APP的冷启动性能是性能评价维度中的重要一项,因此,提升APP的
冷启动性能,是提升用户对于移动终端的评价结果的重要手段。APP的冷启动性能是指在
APP进程未创建时,从用户点击APP图标到APP界面加载完成所消耗的时间。
作为该APP的主进程,进而在该主进程的主线程中执行活动线程(ActivityThread)的主
(main)函数,以及创建默认类加载器(ClassLoader)。另外,在初始化过程中,由上述主线程
多次执行类初始化(class initialization,clinit)方法分别对APP启动过程中所需使用
的类进行初始化。但是,现有技术的方法使得APP启动时间较长,导致APP的冷启动性能不
佳。
发明内容
的启动阶段的热点对象进行批量初始化,并基于被批量初始化的热点对象,启动目标应用。
而避免因每次调用一个第一对象前首先进行初始化所产生的额外耗时,从而极大节省目标
APP启动过程的耗时。同时,对于APP启动阶段需要被类初始化方法调用的不属于热点对象
的对象不进行批量初始化,可以避免对非热点的对象提前进行不必要的初始化,进而避免
产生新的耗时。
属于被类初始化方法调用的对象,终端设备在根据目标应用的启动阶段的热点对象的信
息,对目标应用启动阶段的热点对象进行批量初始化时,可以按照如下过程执行:
行批量初始化。
对象以及初始化所述目标应用的运行环境信息。其中,该第二对象用于加载上述第一对象
以及第三对象,上述第三对象为所述目标应用启动阶段被类初始化方法调用的不属于所述
热点对象的对象。
与所述主线程并发执行的线程。
程中创建所述第二对象。
时,进而极大提升APP冷启动的性能。
时,可以在所述子线程中根据所述目标应用的启动阶段的热点对象的信息,对所述目标应
用的启动阶段的热点对象进行批量初始化。
而可以进一步减少APP冷启动的耗时,进而极大提升APP冷启动的性能。
热点对象被有序存储于同一分区中,终端设备仅需要执行一次分区读取,即可读取到多个
热点对象的信息,当需要调用这些对象时,可以直接进行调用,无需进行频繁的分区读取,
因此,能够明显减少I/O操作。终端设备能够采集的热点对象至少包括类、方法、函数以及字
段,对这些热点对象均可以按照有序存储的同一分区的方式存储,使得减少I/O操作的效果
更佳,进而使得目标APP的性能优化更加深入。
的启动阶段的热点对象的信息,对所述目标应用的启动阶段的热点对象进行批量初始化,
还用于基于被批量初始化的所述热点对象,启动所述目标应用。
初始化方法调用的不属于所述热点对象的对象。
第一方面所述的方法步骤;所述收发器与所述处理器耦合,由所述处理器控制所述收发器
进行消息收发。
面所述的方法。
所述的方法的指令。
附图说明
具体实施方式
需的对象。该对象包括类、方法、函数等。其中,在启动流程中每需要调用一个类前,首先需
要执行clinit方法对该类进行初始化,进而调用该类,使得该类执行。APP启动过程中可能
需要调用大量的类,因此需要多次执行clinit方法进行所需调用的类的初始化,这种方法
使得APP的启动时间长,导致APP的冷启动性能下降。
理方式也进一步使得APP启动时间变长,进而导致APP的冷启动性能不佳。
指字段。
同样适用于使用其他语言编写的运行在其他操作系统下的APP。
于“目标应用”。
该系统中,云服务器用于获取APP的启动阶段的热点对象的信息,将目标APP的启动阶段的
热点对象的信息编译至目标APP的安装文件中,终端设备可以从云服务器获取目标APP的安
装文件进行安装,当目标APP在终端设备上启动时,可以通过本申请实施例的方法减少目标
APP的启动耗时,提升目标APP的冷启动性能。
(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)中的无线终端等等。
不做限定。
是,当本申请实施例的方法应用于其他操作系统时,进程的名称、进程之间交互的过程可能
存在一定的差异。如图3所示,该方法包括:
Launcher向系统服务(system_server)进程发送启动目标APP的指示。对于终端设备来说,
当用户点击目标APP的图标之后,终端设备即接收到启动目标APP的指示。
zygote进程发送通知消息,该通知消息用于通知zygote进程孕育目标APP的主进程。
到启动APP的指示后,可以创建目标APP的主线程。
标APP对应的各项操作。
施例中进行详细描述。第三对象为目标APP启动阶段被类初始化方法调用的不属于热点对
象的对象。
对象,这些对象被加载之后可以被初始化以及调用,以实现各自在目标APP启动阶段的功
能。
行初始化,在目标APP的运行环境信息被初始化之后,可以建立目标APP中的消息循环,目标
APP在启动过程中,通过消息循环进行对象的调用,以实现目标APP启动。
象。热点对象至少可以包括:类、方法、函数、字段。该热点对象的信息可以包括热点对象的
标识以及热点对象是否属于被类初始化方法调用的对象。如果一个热点对象属于被类初始
化方法调用的对象,则说明在目标APP启动时,需要首先执行类初始化方法(例如clinit方
法)对该热点对象进行初始化,进而才可以调用该热点对象。本申请实施例中,将目标APP的
启动阶段的热点对象中属于被类初始化方法调用的对象,称为第一对象。第一对象的数量
可以为多个。上述热点对象的信息被编译至目标APP的安装文件中,当目标APP在终端设备
上安装之后,用户点击目标APP的图标之后,终端设备可以根据热点对象的信息对上述多个
第一对象进行批量初始化。
APP中预先包含了热点对象的信息,热点对象的信息除了包括热点对象的标识外,还可以包
括:热点对象是否属于被类初始化方法调用的对象。在进行上述批量初始时,可以从目标
APP所包含的启动阶段的热点对象的信息中获取属于被类初始化方法调用的多个第一对
象,并对该多个第一对象进行批量初始化。通过预先包含热点对象的信息,使得终端设备可
以直接获知目标APP中的热点对象,以及热点对象中需要被类初始化方法调用的第一对象,
进而通过对这些第一对象进行批量初始化,从而避免因每次调用一个第一对象前首先进行
初始化所产生的额外耗时,从而极大节省目标APP启动过程的耗时。同时,仅对热点对象中
需要被类初始化方法调用的对象进行批量初始化,而对于APP启动阶段需要被类初始化方
法调用的不属于热点对象的对象,即上述第三对象,不进行批量初始化,可以避免对非热点
的对象提前进行不必要的初始化,进而避免产生新的耗时。
标APP首页面中待显示的组件。
种示例,这些选择出的第一对象的信息可以存储在特定格式的文件中,例如以.def格式的
文件中。进而,在目标APP的启动流程中,从调用上述文件中的第一个对象开始,判断该对象
是否已经被初始化,若未被初始化,则对上述文件中的所有对象进行批量初始化,若已经被
初始化,则继续按照目标APP的启动流程,继续调用下一个对象,直至被调用的某个对象未
被初始化。
其初始化之后再进行调用。
例中,该第一对象可以为类,需要使用类初始化方法对其进行初始化。
第一对象进行批量初始化时,仅需要保证这些对象已经被类加载器(ClassLoader)加载,因
此,对第一对象进行批量初始化仅需要在上述步骤S306的创建第二对象之后执行即可。
第一对象。
及调用这些对象。这些需要被类初始化方法调用的对象包括第一对象和第三对象,其中,第
一对象为热点对象中需要被类初始化方法调用的对象,第三对象为不属于热点对象的需要
被类初始化方法调用的对象。在目标APP启动过程中,第一对象按照上述步骤S307的过程被
批量初始化并在目标APP启动流程中被调用,第三对象在目标APP启动流程中被初始化及调
用。除了上述需要被类初始化方法调用的对象外,目标APP在启动阶段还可能调用其他的对
象,包括:方法、函数、字段等。通过调用这些对象,可以实现目标APP的正常启动。
从而避免因每次调用一个第一对象前首先进行初始化所产生的额外耗时,从而极大节省目
标APP启动过程的耗时。同时,对于APP启动阶段需要被类初始化方法调用的不属于热点对
象的对象不进行批量初始化,可以避免对非热点的对象提前进行不必要的初始化,进而避
免产生新的耗时。
目标APP,该测试阶段的目标APP在测试终端设备上启动和运行时,当对象被调用时,测试终
端设备可以监测对象被调用的行为,并对对象在目标APP启动过程中被调用的次数进行记
录。示例性的,测试终端设备可以通过其运行时(runtime)监测对象被调用的行为以及记录
各对象的调用次数。对于测试终端设备来说,其上所运行的所有APP的运行均基于runtime
进行,因此,runtime能够获知APP中所有对象的调用信息。本实施例中,目标APP基于
runtime运行,当目标APP中的某个对象被调用时,runtime可以记录该调用行为。示例性的,
当目标APP中的某个对象A第一次被调用时,runtime为该对象A分配一个调用次数变量,并
将该变量的值置为1,当对象A再次被调用时,runtime将该变量的值加上1,作为该变量的新
值,依次类推
点对象具有唯一的标识,以区别于其他对象。示例性的,可以将热点对象的名称作为热点对
象的标识。同时,测试终端设备还可以记录该热点对象是否属于被类初始化方法调用的对
象。如果某个热点对象属于被类初始化方法调用的对象,则说明在目标APP启动时,需要首
先执行类初始化方法对该热点对象进行初始化。
端设备可以将这些热点对象的信息上报至云服务器,由云服务器将该热点对象的信息编译
至目标APP的安装文件中。其中,云服务器在编译过程中,可以将目标应用的启动阶段的热
点对象的信息有序排布于同一文件中,并使用该有序存储的文件生成目标APP的安装文件。
该安装文件被安装至终端设备后,该有序存储的文件中的热点对象的信息被有序存储于终
端设备的同一分区中,其中,该分区为安装目标APP的终端设备中的存储区域。
属于被类初始化方法调用的对象存储在特定的文件中,例如.def文件中,以标记出热点对
象中属于被类初始化方法调用的对象。基于该标记方式,在上述步骤S307中进行批量初始
化时,可以直接读取该.def文件中的对象,并对这些对象进行批量初始化。
则终端设备需要频繁进行分区读取,从而产生大量的I/O操作。而在本实施例中,热点对象
被有序存储于同一分区中,终端设备仅需要执行一次分区读取,即可读取到多个热点对象
的信息,当需要调用这些对象时,可以直接进行调用,无需进行频繁的分区读取,因此,能够
明显减少I/O操作。另外,本实施例中,终端设备能够采集的热点对象至少包括类、方法、函
数以及字段,对这些热点对象均可以按照有序存储的同一分区的方式存储,使得减少I/O操
作的效果更佳,进而使得目标APP的性能优化更加深入。
环境信息。而对于执行创建第二对象以及初始化目标APP的运行环境信息来说,二者之间并
不存在先后依赖关系。因此,在本申请实施例中,作为一种可选的实施方式,可以并行执行
创建第二对象以及初始化所述目标APP的运行环境信息。
子线程中初始化目标APP的运行环境信息。
的运行操作,可以分别通过该主线程和子线程来执行。具体的,可以在主线程中初始化目标
APP的运行环境信息,在子线程中创建上述第二对象。而由于对目标应用的启动阶段的热点
对象进行批量初始化需要在创建第二对象后完成,因此,可以在子线程中创建完成第二对
象后,再在子线程中对目标应用的启动阶段的热点对象进行批量初始化。
应用的启动阶段的热点对象进行批量初始化在下述步骤S409中执行。基于上述的描述可
知,步骤S407分别与步骤S408和步骤S409并发执行,步骤S408和步骤S409为顺序执行,即先
执行步骤S408,再执行步骤S409。
APP的运行环境信息需要在接收到系统服务进程的绑定应用的消息后才可以执行。
行初始化,在目标APP的运行环境信息被初始化之后,可以建立目标APP中的消息循环,以实
现目标APP启动。
在该主线程中建立目标APP中的消息循环,目标APP在启动过程中,通过消息循环进行对象
的调用,并实现APP的启动。
APP启动阶段所需调用的对象,这些对象被加载之后可以被初始化以及调用,以实现各自在
目标APP启动阶段的功能。
目标APP的运行环境信息,主线程和子线程并发执行,从而使得初始化目标APP的运行环境
信息与创建第二对象和对热点对象批量初始化的过程可以并发执行,从而进一步减少APP
冷启动的耗时,进而极大提升APP冷启动的性能。
的加载耗时,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启动的耗时。
的耗时T为下述公式(1)所示:
1与3-3,并在主线程中并发执行3-2,因此,可以极大节省APP冷启动的耗时。而如前文所述,
本申请实施例由于对热点对象中需要在目标APP启动阶段调用的对象进行批量初始化,因
此,在初始化对象上的耗时相比现有处理过程中初始化对象的耗时有极大减少,即,本申请
实施例中3-3的耗时比现有处理过程中3-3的耗时明显减少,因此,将本申请实施例中的主
线程和子线程并发执行处理以及批量初始化对象进行结合之后,在目标APP启动阶段上的
耗时相比现有处理过程的耗时有更大程度的减少。
中的终端设备的功能的装置,例如该装置可以是终端设备中的装置或芯片系统。如图6所
示,该装置包括:接收模块601和处理模块602。
类初始化方法调用的对象时,处理模块602具体用于:
用的不属于所述热点对象的对象。
全部以软件通过处理元件调用的形式实现;也可以全部以硬件的形式实现;还可以部分模
块通过处理元件调用软件的形式实现,部分模块通过硬件的形式实现。例如,确定模块可以
为单独设立的处理元件,也可以集成在上述装置的某一个芯片中实现,此外,也可以以程序
代码的形式存储于上述装置的存储器中,由上述装置的某一个处理元件调用并执行以上确
定模块的功能。其它模块的实现与之类似。此外这些模块全部或部分可以集成在一起,也可
以独立实现。这里所描述的处理元件可以是一种集成电路,具有信号的处理能力。在实现过
程中,上述方法的各步骤或以上各个模块可以通过处理器元件中的硬件的集成逻辑电路或
者软件形式的指令完成。
或多个微处理器(digital signal processor,DSP),或,一个或者多个现场可编程门阵列
(field programmable gate array,FPGA)等。再如,当以上某个模块通过处理元件调度程
序代码的形式实现时,该处理元件可以是通用处理器,例如中央处理器(central
processing unit,CPU)或其它可以调用程序代码的处理器。再如,这些模块可以集成在一
起,以片上系统(system-on-a-chip,SOC)的形式实现。
品包括一个或多个计算机指令。在计算机上加载和执行该计算机程序指令时,全部或部分
地产生按照本申请实施例所描述的流程或功能。上述计算机可以是通用计算机、专用计算
机、计算机网络、或者其他可编程装置。上述计算机指令可以存储在计算机可读存储介质
中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,上述计算机
指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字
用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或
数据中心进行传输。上述计算机可读存储介质可以是计算机能够存取的任何可用介质或者
是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。上述可用介质可以
是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘
solid state disk(SSD))等。
施例的应用程序启动方法中的部分或全部可以通过硬件来实现也可以通过软件来实现,当
通过硬件实现时,参见图7所示,该应用程序启动装置700包括:
启动装置700可以是芯片或者集成电路。
81控制收发器83的收发动作。存储器82中可以存储各种指令,以用于完成各种处理功能以
及实现本申请实施例中终端设备执行的方法步骤。可选的,本申请实施例涉及的终端设备
还可以包括:电源84、系统总线85以及通信端口86。收发器83可以集成在终端设备的收发信
机中,也可以为终端设备上独立的收发天线。系统总线85用于实现元件之间的通信连接。上
述通信端口86用于实现终端设备与其他外设之间进行连接通信。
处理器81控制收发器83进行消息收发,其实现原理和技术效果类似,在此不再赘述。
architecture,EISA)总线等。该系统总线可以分为地址总线、数据总线、控制总线等。为便
于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。通信接口用
于实现数据库访问装置与其他设备(例如客户端、读写库和只读库)之间的通信。存储器可
能包含随机存取存储器(random access memory,RAM),也可能还包括非易失性存储器
(non-volatile memory),例如至少一个磁盘存储器。
FPGA或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
一个处理器执行上述实施例中终端设备的处理过程。
独存在A,同时存在A和B,单独存在B的情况,其中A,B可以是单数或者复数。字符“/”一般表
示前后关联对象是一种“或”的关系;在公式中,字符“/”,表示前后关联对象是一种“相除”
的关系。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或
复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:a,b,c,a-b,a-c,b-c,
或a-b-c,其中,a,b,c可以是单个,也可以是多个。
实施过程构成任何限定。