CN112817657B - 一种应用程序启动项加载方法、装置、系统及存储介质 - Google Patents
一种应用程序启动项加载方法、装置、系统及存储介质 Download PDFInfo
- Publication number
- CN112817657B CN112817657B CN202110129563.0A CN202110129563A CN112817657B CN 112817657 B CN112817657 B CN 112817657B CN 202110129563 A CN202110129563 A CN 202110129563A CN 112817657 B CN112817657 B CN 112817657B
- Authority
- CN
- China
- Prior art keywords
- main thread
- application program
- starting
- function
- data area
- 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
Classifications
-
- 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
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本发明实施例提供了一种应用程序启动项加载方法、装置、系统及存储介质。本方案通过将不同类型的启动项对应的标记写入主线程数据区的各个位置,随着主线程的运行启动相应主线程数据区内的启动项,从而实现对于启动项启动时间的控制,使得启动项与业务场景关联启动,以降低业务场景的启动时间,即减少用户的等待时间,同时,由于应用程序主线程运行之前写入主线程数据区,方便各业务场景定制自己执行的启动项,减少代码耦合易于维护,按业务场景定义不同类型启动项,制定接入规范,满足不同业务需要,降低接入成本,减少启动时间。
Description
技术领域
本发明涉及应用程序技术领域,尤其涉及一种应用程序启动项加载方法、装置、系统及存储介质。
背景技术
应用软件(Application)是和系统软件相对应的,是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合,分为应用软件包和用户程序。应用软件包是利用计算机解决某类问题而设计的程序的集合,多供用户使用。
启动时长是App性能的重要指标,作为用户体验的第一道门,直接决定用户对App的第一印象。由于手机技术的不断发展,各家公司所开发客户端历经几十个版本的迭代开发,产品形态不断完善,业务功能日趋复杂,同时逐渐从独立业务App演进成为一个平台App,因此更多更复杂的工作需要在App启动时完成,给App启动性能带来了挑战。
发明内容
为了解决现有技术存在的问题,本发明的至少一个实施例提供了一种应用程序启动项加载方法、装置、系统及存储介质。
第一方面,本发明实施例提供了一种应用程序启动项加载方法,所述加载方法包括:
在所述应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中;其中,所述数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同;
当所述应用程序运行到任一业务场景对应的主线程数据区时,根据所述主线程数据区内的所述数据块中的标记执行关联的启动项。
基于上述技术方案,本发明实施例还可以做出如下改进。
结合第一方面,在第一方面的第一种实施例中,所述在所述应用程序主线程运行之前,将包含标记的数据块分别写入相应的业务场景对应的主线程数据区中,包括:
针对每个启动项,将所述启动项与标记进行关联组成数据块;其中,属于同一业务场景的启动项关联的标记相同;
在所述应用程序主线程运行之前,将所述数据块分别写入相应的业务场景对应的主线程数据区中。
结合第一方面的第一种实施例,在第一方面的第二种实施例中,所述将启动项与标记进行关联组成数据块,包括:
根据所述标记与指向所述启动项的函数地址的函数指针,构建包含所述函数指针和所述标记的结构体,作为所述数据块。
结合第一方面,在第一方面的第三种实施例中,在所述应用程序主线程运行之前,将至少一个数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中,包括:
构建在所述应用程序主线程运行之前运行的编译函数;
在所述编译函数运行时,将至少一个数据块写入所述标记对应的业务场景的主线程数据区中。
结合第一方面的第三种实施例,在第一方面的第四种实施例中,
所述当所述应用程序运行到任一业务场景对应的主线程数据区时,根据所述主线程数据区内的所述数据块中的标记执行关联的启动项之前,加载方法还包括:
在所述应用程序运行时,获取所述应用程序主线程的主线程数据区中写入的每个数据块;
获取每个数据块内的标记关联的每个启动项对应的函数指针;
根据所述启动项关联的标记对所述函数指针进行分组,使得对应同一标记的启动项对应的函数指针为同一组,分别得到每个标记对应的函数指针列表;
所述当所述应用程序运行到任一业务场景对应的主线程数据区时,根据所述主线程数据区内的所述数据块中的标记执行关联的启动项,包括:
当所述应用程序运行到任一业务场景对应的主线程数据区时,获取所述主线程数据区内的所述数据块中的标记;
获取所述标记对应的所述函数指针列表,根据所述函数指针列表中的函数指针分别执行关联的启动项。
结合第一方面的第四种实施例,在第一方面的第五种实施例中,所述根据所述函数指针列表中的函数指针分别执行关联的启动项,包括:
遍历所述函数指针列表中的函数指针,依次执行函数指针关联的启动项。
结合第一方面或第一方面的第一、第二、第三、第四或第五种实施例,在第一方面的第六种实施例中,所述将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中之前,加载方法还包括:
获取所述应用程序中各个业务场景的对应的主线程数据区的运行顺序;
根据所述标记的预设置的优先级按从高至低的顺序和所述业务场景的运行顺序,将所述标记与业务场景逐个配对;
根据所述标记与所述业务场景的配对结果,将每个所述业务场景下的启动项与业务场景对应的标记进行关联,使得属于同一业务场景的启动项关联的标记相同。
第二方面,本发明实施例提供了一种应用程序启动项加载装置,所述加载装置包括:
第一处理单元,用于在所述应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中;其中,所述数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同;
第二处理单元,用于当所述应用程序运行到任一业务场景对应的主线程数据区时,根据所述主线程数据区内的所述数据块中的标记执行关联的启动项。
第三方面,本发明实施例提供了一种应用程序启动项加载系统,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现第一方面中任一实时例所述的应用程序启动项加载方法。
第四方面,本发明实施例提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现第一方面中任一实施例所述应用程序启动项加载方法。
本发明的上述技术方案与现有技术相比具有如下优点:本发明实施例通过将不同类型的启动项对应的标记写入主线程数据区的各个位置,随着主线程的运行启动相应主线程数据区内的启动项,从而实现对于启动项启动时间的控制,使得启动项与业务场景关联启动,以降低业务场景的启动时间,即减少用户的等待时间,同时,由于应用程序主线程运行之前写入主线程数据区,方便各业务场景定制自己执行的启动项,减少代码耦合易于维护,按业务场景定义不同类型启动项,制定接入规范,满足不同业务需要,降低接入成本,减少启动时间。
附图说明
图1为本发明各个实施例提供的系统的一种示意图;
图2是本发明实施例提供的应用程序启动项加载方法流程示意图;
图3是本发明另一实施例提供的应用程序启动项加载方法流程示意图;
图4是本发明又一实施例提供的应用程序启动项加载方法流程示意图其一;
图5是本发明又一实施例提供的应用程序启动项加载方法流程示意图其二;
图6是本发明又一实施例提供的一种应用程序启动项加载装置结构示意图;
图7是本发明又一实施例提供的一种应用程序启动项加载系统结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,为实现本发明各个实施例的一种系统的结构示意图,包括终端,终端包括:处理器1110和存储器1130,其中,终端可以是诸如手机、平板电脑、笔记本电脑、掌上电脑、个人数字助理(PersonalDigitalAssistant,PDA)、便捷式媒体播放器(PortableMediaPlayer,PMP)、导航装置、可穿戴设备、智能手环、计步器等移动终端,以及诸如数字TV、台式计算机等固定终端。
如图2所示,本发明实施例提供的一种应用程序启动项加载方法。参照图2,加载方法包括如下步骤:
S11、在应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中;其中,数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同。
在本实施例中,在不同编译语言完成的应用程序中,为了方便程序员更高效的完成开发,会在编译语言的底层写入大量SDK(software development kit,软件开发工具包,软件开发工具包一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合),而编译语言的底层SDK中未实现的功能也会有其他程序员提供第三方SDK以完成相应功能,SDK是一系列文件的组合,包括lib、dll、.h、文档、示例等等;API(Application Programming Interface,应用程序接口,是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定)是对程序而言的,提供用户编程时的接口,即一系列模块化的类和函数,可以认为API是包含在SDK中的。
本步骤中的在应用程序主线程运行前完成的逻辑步骤,可以通过clang编译器中提供的编译函数完成,也可以采用宏定义的方式完成,还可以通过改写在应用程序启动时所加载的底层函数来完成本步骤中的特征。
在本实施例中,由于宏定义的内容会在应用程序主线程运行之前加载,所以S11的实现方式可以通过宏定义一个在应用程序主线程运行之前运行的函数方法,在加载该函数方法时实现将数据块写入应用程序主线程相应业务场景对应的主线程数据区中。
在本实施例中,应用程序在不同情况下都有一些需要执行的底层函数,比如,应用程序暂时挂起时会运行的底层函数、点击进入应用程序时运行的底层函数、退出应用程序时会运行的底层函数等等,在本步骤中,上述S11的实现方式还可以通过在点击进入应用程序时运行的底层函数中添加相应的函数方法,在点击进入应用程序时即可运行该函数方法时实现将数据块写入应用程序主线程相应业务场景对应的主线程数据区中。当然,也可以在应用程序主线程运行之前的其他底层函数中添加相应的函数方法,实现将数据块写入应用程序主线程相应业务场景对应的主线程数据区。
clang编译器是一个C语言、C++、Objective-C语言的轻量级编译器。源代码发布于BSD协议下。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
在本实施例中,具体的,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中可以通过如下方式进行:构建在应用程序主线程运行之前运行的编译函数,在编译函数运行时,将包含标记的数据块分别写入应用程序主线程中相应业务场景对应的主线程数据区中;比如,以clang编译器为例,在clang编译器的编译函数运行时,会将标识属性标识为“attribute”的数据写到指定的任意数据区中,所以,我们可以通过clang编译器构建得到属性标识为“attribute”的编译函数,通过编译函数实现将数据块写入主线程数据区中;而为了实现在应用程序主线程运行之前运行上述编译函数,可以已得到的编译函数的基础上,对编译函数再添加属性“constructor”,标记有“constructor”属性的函数会在可执行函数加载时被调用,即在应用程序主线程运行之前被调用执行,所以,对编译函数再添加属性“constructor”后,得到的编译函数即可完成在应用程序主线程运行之前运行,且实现在编译函数运行时,将包含标记的数据块分别写入应用程序主线程中相应业务场景对应的主线程数据区中;不单单clang编译器可以实现本方案S11的步骤,不同类型的编译语言中均有实现将数据块写入主线程数据区的底层API或第三方SDK,本方案对此不再赘述。
在本实施例中,属性标记“attribute”和“constructor”是clang编译器中自带的预定义属性,类似于C语言中的数据类型属性,比如,整型数据的属性为“int”,进一步还有无符号整型的属性为“unsigned int”、短整型的属性为“short int”等等。
在本实施例中,进一步,主线程数据区的数据存储层次包括数据段和数据段下的数据节;通过上述属性标记“attribute”可以将数据块写入主线程数据区的数据段中,进一步,为了实现将数据块放入更加底层的数据节中,可以通过属性标记“section”实现,比如,属性标记为attribute((section(““数据段”,“数据节””))的编译函数可以将一个指定的数据块写入到指定的主线程数据区的段“数据段”的节“数据节”中,其中,“数据段”和“数据节”表示对应的数据段和数据节的名称。
在本实施例中,启动项,就是开机的时候系统会在前台或者后台运行的程序。当操作系统完成登录过程,进程表中出现了很多的进程。各种应用程序启动时都会加载相应的启动项,而有些启动项是应用程序开启必不可少的,而有些启动项则是非必须的,比如,应用程序启动时都需要加载相应的页面窗口,若是应用程序没有开机画面,则直接加载的就是程序内展示的页面启动项,若是有开机画面,则加载的就是开机画面启动项,而其他的一些应用程序的功能模块如果通过启动项提前加载虽然可以使得用户直接使用相应的功能,但是这样就会导致开机时间的加长。
在本实施例中,可以将标记与启动项先关联构成本实施例中的数据块,而若是想要更换启动项或者调整启动项的启动时间,只需调整启动项与标记的关联关系,比如,若是启动项需要靠后启动,只需将启动项与启动时间靠后的业务场景对应标记相关联,或者,若是需要更换启动项,只需将启动项与标记的关联关系删除,本方案通过将启动项与标记进行关联,将包含标记的数据块写入主线程数据区,根据需求关联标记和启动项或者调整关联关系,即可实现启动项与应用程序的松耦合,启动项对应的业务任意插拔的有益效果。
在本实施例中,上述数据块可以是数组、字典、结构体等形式的数据,比如,将标记作为数组名称,在数组中存储对应业务场景的启动项的运行数据或者启动项的地址以便于运行启动项,或者,将标记作为字典的键,在键对应的值中放置数组,在数组中存储所有与该标记对应的启动项的运行数据或启动项的地址,或者,构建结构体,在结构体中添加标记,和,启动项或启动项的地址,当然,也可以采用队列、数据表单等形式,本方案在此不再赘述。
在本实施例中,比如,将标记与启动项先关联构成本实施例中的数据块可以根据指向启动项的函数地址的函数指针与标记,构建包含函数指针和标记的结构体,作为数据块。具体的,将指向启动项的函数地址的函数指针和标记作为结构体的元素,得到包含函数指针和标记的结构体。
在本实施例中,函数指针是指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前,C语言在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
在本实施例中,通过启动项的函数指针与标记构建结构体作为数据块,由于启动项本身实质是一段代码,而函数指针只是指向启动项的函数地址的字符串,函数指针的数据量相较于启动项更少,所以可以有效的减少数据块的数据量,提高编译期编译效率;同时,函数指针本身的作用就是调用函数,所以通过函数指针调用相应函数地址的启动项和直接运行启动项的代码的效率相差不大,不会影响到启动项的运行。
在本实施例中,应用程序主线程就是应用程序的主函数运行的进程,主线程数据区就是主函数的代码区,而不同业务场景的主线程数据区就是应用程序中不同功能模块所对应的代码区,比如,业务场景为聊天窗口,那业务场景对应的主线程数据区就是聊天窗口对应的代码区,业务场景为视频播放窗口,业务场景对应的主线程数据区就是渲染视频播放界面的代码区。
在本实施例中,在应用程序主线程运行前,通过将包含标记的数据块分别写入不同业务场景的主线程数据区,根据需求关联标记和启动项或者调整标记与启动项关联关系,由于标记与对应的业务场景关联,所以启动项也可以根据关联关系随着业务场景的进程而执行,实现启动项与应用程序的松耦合,启动项对应的业务任意插拔的有益效果,业务按需加载启动项的方案。
S12、当应用程序运行到任一业务场景对应的主线程数据区时,根据主线程数据区内的数据块中的标记执行关联的启动项。
在本实施例中,在应用程序的运行过程中,当任一包括数据块的主线程数据区被调用执行时,由于数据块中包含有标记,所以可以通过标记与启动项的关联关系调用相应的启动项运行,以完成对应业务场景的启动项的运行,避免启动应用程序时,所有启动项同时开启,导致应用程序启动等待时间过长,用户体验不佳的问题,有针对性的启动每个业务场景所对应的启动项。
在本实施例中,本方案通过将不同类型的启动项对应的标记写入主线程数据区的各个位置,随着主线程的运行启动相应主线程数据区对应的启动项,以实现对于启动项在何时启动和某一业务场各个启动项启动所需的启动时间的控制,以此降低业务模块的启动时间,有效减少用户的等待时间。
比如,应用程序开机时、应用程序页面跳转时等时刻只开启对应的启动项,可以有效的减少用户等待的时间,同时,由于标记是在用户点击应用程序,应用程序启动之后,应用程序主线程运行之前写入主线程数据区,在编译期注册启动项,而且属于同一业务场景的启动项关联的标记相同,而标记与启动项相关联,需要更换启动项时,只需更换与标记关联的启动项,即可完成对于不同业务场景的启动项的更换,方便各业务定制自己业务的执行任务,减少代码耦合易于维护,按业务场景定义不同类型启动项,制定接入规范,满足不同业务需要,降低接入成本,减少业务启动时间。
比如,某些启动项是需要开机时就加载的,如应用程序的开机画面或开机广告等启动项,而有些启动项并不需要开机时启动,如应用程序内的某个功能模块的功能,减少不必要的开机启动项的数量,可以有效的减少开机时间。
如图3所示,具体的,将包含标记的数据块分别写入相应的业务场景对应的主线程数据区中的方法可以包括如下步骤:
S21、构建在应用程序主线程运行之前运行的编译函数。
S22、在所述编译函数运行时,将至少一个数据块写入标记对应的业务场景的主线程数据区中。
具体的,以clang编译器为例,在clang编译器的编译函数运行时,会将标识属性标识为“attribute”的数据写到指定的任意数据区中,所以,我们可以通过clang编译器构建得到属性标识为“attribute”的编译函数,通过编译函数实现将数据块写入主线程数据区中;而为了实现在应用程序主线程运行之前运行上述编译函数,可以已得到的编译函数的基础上,对编译函数再添加属性“constructor”,标记有“constructor”属性的函数会在可执行函数加载时被调用,即在应用程序主线程运行之前被调用执行,所以,对编译函数再添加属性“constructor”后,得到的编译函数即可完成在应用程序主线程运行之前运行,且实现在编译函数运行时,将包含标记的数据块分别写入应用程序主线程中相应业务场景对应的主线程数据区中;不单单clang编译器可以实现本方案S11的步骤,不同类型的编译语言中均有实现将数据块写入主线程数据区的底层API或第三方SDK,本方案对此不再赘述。
在本实施例中,属性标记“attribute”和“constructor”是clang编译器中自带的预定义属性,类似于C语言中的数据类型属性,比如,整型数据的属性为“int”,进一步还有无符号整型的属性为“unsigned int”、短整型的属性为“short int”等等。
在本实施例中,进一步,主线程数据区的数据存储层次包括数据段和数据段下的数据节;通过上述属性标记“attribute”可以将数据块写入主线程数据区的数据段中,进一步,为了实现将数据块放入更加底层的数据节中,可以通过属性标记“section”实现,比如,属性标记为attribute((section(““数据段”,“数据节””))的编译函数可以将一个指定的数据块写入到指定的主线程数据区的段“数据段”的节“数据节”中,其中,“数据段”和“数据节”表示对应的数据段和数据节的名称。
如图4所示,本发明实施例提供的一种应用程序启动项加载方法。参照图4,加载方法包括如下步骤:
S31、在应用程序主线程运行之前,将包含标记的数据块分别写入相应的业务场景对应的主线程数据区中;其中,数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同。
有关步骤S31,详细可参见步骤S11中的描述,本实施例在此不再赘述。
S32、在应用程序运行时,获取应用程序主线程的主线程数据区中写入的每个数据块。
在本实施例中,由于最初在应用程序的主线程数据区中写入的每个数据块是通过在应用程序主线程之前运行的函数完成的,所以,为了实现获取应用程序主线程的主线程数据区中写入的每个数据块,可以通过在将数据块写入主线程数据区时,在主线程数据区的同一位置添加回调函数,数据块被运行时,同一位置的回调函数也运行以此实现获取数据块的信息的方案,而在回调函数中添加方法实现将数据块的信息进行汇总是可以通过现有技术中的方法实现,本方案对此不做特别限定。
比如,在将数据块写入主线程数据区时,在主线程数据区的同一位置添加回调函数后,当运行到数据块对应的函数时,可以同时执行回调函数以得到数据块的信息,然后将数据块的信息发送到指定位置进行存储,实现对于数据块的信息的汇总。
在本实施例中,除上述获取数据块的信息的方法外,还可以按照在主线程数据区内写入数据块的方式,构建应用程序主线程运行之前,并将数据块写入主线程数据区中之后运行的函数,在所有数据块均写入对应主线程数据区后,通过运行新构建的函数获取、并解析得到每个数据块的信息。
S33、获取每个数据块内的标记关联的每个启动项对应的函数指针。
在本实施例中,获取每个数据块内的标记,基于标记与启动项的关联关系确定各个标记关联的启动项,进一步,获取每个启动项的函数指针,由于软件代码运行时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址,获取每个启动项的函数指针即获取启动项对应的入口地址。
S34、根据启动项关联的标记对函数指针进行分组,使得对应同一标记的启动项对应的函数指针为同一组,分别得到每个标记对应的函数指针列表。
在本实施例中,根据标记分别对函数指针进行分组,分别得到每个标记对应的函数指针的函数指针列表,由于标记分别与业务场景相对应,所以当应用程序运行到某一业务场景对应的主线程数据区时,可以根据相应标记遍历相应的函数指针列表,依次得到函数指针列表中的函数指针,根据函数指针调用相应的启动项实现快速依次加载各个启动项。
S35、当应用程序运行到任一业务场景对应的主线程数据区时,获取主线程数据区内的数据块中的标记。
S36、获取标记对应的函数指针列表,根据函数指针列表中的函数指针分别执行关联的启动项。
在本实施例中,通过获取每个写入主线程数据区内的数据块,根据数据块内的标记获取标记所关联的启动项的函数指针,并基于标记对得到的函数指针进行分组,使得每个业务场景所对应的启动项的函数指针形成函数指针列表,在应用程序运行到任一业务场景对应的主线程数据区时,可以通过遍历遍历所述函数指针列表中的函数指针,依次执行函数指针关联的启动项,完成对于该业务场景的所有启动项的快速加载。
如图5所示,本发明实施例提供了一种应用程序启动项加载方法,加载方法包括如下步骤:
S41、获取应用程序中各个业务场景的对应的主线程数据区的运行顺序。
在本实施例中,根据应用程序中的各个功能模块的运行顺序得到各个业务场景对应的主线程数据区的运行顺序,可以在代码加载时获取得到,也可以在应用程序运行时对各个主线程数据区当运行顺序进行记载,以便于使用。
S42、根据标记的预设置的优先级按从高至低的顺序和业务场景的运行顺序,将标记与业务场景逐个配对。
在本实施例中,业务场景越早运行,则该业务场景对应的启动项也需要越早加载,在本步骤中,预先针对标记设置的优先级,将标记与业务场景逐个进行配对,即业务场景越早运行其配对的标记的优先级越高。
S43、根据所述标记与所述业务场景的配对结果,将每个所述业务场景下的启动项与业务场景对应的标记进行关联,使得属于同一业务场景的启动项关联的标记相同。
在本实施例中,将业务场景下的启动项与该业务场景配对的标记进行关联,通过标记代表启动项,以便于写入应用程序中。
S44、在应用程序主线程运行之前,将包含标记的数据块分别写入相应的业务场景对应的主线程数据区中;其中,数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同。
有关步骤S44,详细可参见步骤S11中的描述,本实施例在此不再赘述。
S45、当应用程序运行到任一业务场景对应的主线程数据区时,根据主线程数据区内的数据块中的标记执行关联的启动项。
有关步骤S45,详细可参见步骤S12中的描述,本实施例在此不再赘述。
在本实施例中,将不同类型启动项与标记按照运行顺序和按优先级顺序进行配对,制定接入规范,满足不同业务需要,降低接入成本,减少启动时间。
在一个具体的实施例中,本发明实施例通过在应用程序的主线程数据区内写入包含标记的数据块,根据数据块内的标记运行相应的启动项,具体的,可以根据标记读取启动项对应的函数指针,基于函数指针运行对应的启动项。
比如,基于Clang编译器实现本发明实施例中的内容,Clang编译器提供了很多的编译函数,可以完成不同的功能,其中,包括section函数,section函数提供了二进制段的读写能力,可以将一些编译期就可以确定的常量写入数据段,即在应用程序主线程运行之前,将数据块写入不同的数据区。具体的实现分为编译期和运行时,在编译期,Clang编译器会将标识了“attribute”和“section()”的数据块写到指定的数据段中,例如,构建一个数据块“{key(key为本发明实施例中的标记),*pointer}”,对该数据块添加属性attribute,然后通过调用“section()”,将数据块写入指定的数据段中,到应用程序运行到相应位置时,根据标记读取出函数指针,完成函数的调用。具体用到Clang编译函数如下:
1)attribute
在编译期,编译器会将标识了“attribute”和“section()”的数据块写到指定的数据段中。
2)used
数据被used修饰以后,意味着即使数据没有被引用,在Release函数进行释放也不会被删除,声明的数据会被保留。
3)section
通常情况下,编译器会将对象放置于DATA段的data或者bss节中;这里我们需要将数据放置于特殊的节中,可以通过section达到目的。
4)constructor
加上这个属性“constructor”的函数会在可执行文件加载时被调用,即在应用程序主函数调用前执行。
具体的,实现上述方案的步骤包括:
a)定义包括标记和指向启动项函数地址的函数指针的结构体作为上述数据块,其中,标记可以作为实现启动项的优先级,并分别与相应的业务场景相关联。
b)将包含函数指针的结构体写入到指定的数据区的指定段,具体写入的指定段可以由标记关联的业务场景确定;可以通过下宏定义的方式实现将结构体写入指定段,实现原理是根据编译器提供的“attribute”和“section”构建attribute((section(“xx段,xxx节”)),基于“attribute((section(“xx段,xxx节”))”将数据块储存到指定的段的指定节中。
若想要确定数据块所写入的数据区的指定段是哪些,可以定义一个启动函数,调用启动函数启动MachOView(MachOView是一种Mach-O文件的可视化文件浏览器)打开Mach-O文件(Mach-O为Mach Object文件格式的缩写,它是一种用于可执行文件,目标代码,动态库,内核转储的文件格式),在MachOView中就可以看到数据块被写入到指定的数据区指定的段和指定的节。
c)运行时读出数据,可以注册回调函数实现读取写入数据区指定段的各个标记,将回调函数写入编译函数内,编译函数用于实现上述将数据块写入数据区的方法,在将数据块写入数据区时,同时会执行回调函数,获取到每个数据块,最后,可以将各个数据块中的信息按标记进行分类存储在相应的列表中。
d)触发启动项,在应用程序启动流程中,在随着应用程序主线程运行阶段,当运行到某一业务场景时,会触发所有写入到该业务场景下的数据区中的数据块,而后,根据数据块中记录的标记和函数指针执行相应的启动项,具体的,结合步骤c中读取数据块信息得到的列表,还可以通过该业务场景关联的标记获取对应的列表,遍历列表中的数据块信息,实现依次加载相应的启动项,通过这种方式,几乎没有任何额外的辅助代码,用一种很简洁的方式完成启动项的自定义加载。
如图6所示,本发明实施例提供了一种应用程序启动项加载装置,加载装置包括:第一处理单元11和第二处理单元12。
在本实施例中,第一处理单元11,用于在应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中;其中,数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同。
在本实施例中,第二处理单元12,用于当应用程序运行到任一业务场景对应的主线程数据区时,根据主线程数据区内的数据块中的标记执行关联的启动项。
在本实施例中,第一处理单元11,具体用于针对每个启动项,将启动项与标记进行关联组成数据块;在应用程序主线程运行之前,将数据块分别写入相应的业务场景对应的主线程数据区中;其中,属于同一业务场景的启动项关联的标记相同。
在本实施例中,第一处理单元11,具体用于根据所述标记与指向所述启动项的函数地址的函数指针,构建包含函数指针和标记的结构体,作为数据块。
在本实施例中,第一处理单元11,具体用于构建在应用程序主线程运行之前运行的编译函数;所述编译函数运行时,将至少一个数据块写入标记对应的业务场景的主线程数据区中。
在本实施例中,加载装置还包括:第三处理单元,用于在应用程序运行时,获取应用程序主线程的主线程数据区中写入的每个数据块;获取每个数据块内的标记关联的每个启动项对应的函数指针;根据启动项关联的标记对函数指针进行分组,使得对应同一标记的启动项对应的函数指针为同一组,分别得到每个标记对应的函数指针列表。
在本实施例中,第二处理单元12,具体用于当应用程序运行到任一业务场景对应的主线程数据区时,获取主线程数据区内的数据块中的标记;获取标记对应的函数指针列表,根据函数指针列表中的函数指针分别执行关联的启动项。
在本实施例中,第二处理单元12,具体用于遍历所述函数指针列表中的函数指针,依次执行函数指针关联的启动项。
在本实施例中,加载装置还包括:第四处理单元,用于获取应用程序中各个业务场景的对应的主线程数据区的运行顺序;根据标记的预设置的优先级按从高至低的顺序和业务场景的运行顺序,将标记与业务场景逐个配对;根据所述标记与所述业务场景的配对结果,将每个所述业务场景下的启动项与业务场景对应的标记进行关联,使得属于同一业务场景的启动项关联的标记相同。
本发明实施例的装置的功能已经在上述的方法实施例中进行了描述,故本实施例的描述中未详尽之处,可以参见前述实施例中的相关说明,在此不做赘述。
如图7所示,本发明实施例提供了一种应用程序启动项加载系统,包括处理器1110、通信接口1120、存储器1130和通信总线1140,其中,处理器1110,通信接口1120,存储器1130通过通信总线1140完成相互间的通信;
存储器1130,用于存放计算机程序;
处理器1110,用于执行存储器1130上所存放的程序时,实现如下步骤:
在应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中;其中,数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同;
当应用程序运行到任一业务场景对应的主线程数据区时,根据主线程数据区内的数据块中的标记执行关联的启动项。
本发明实施例提供的电子设备,处理器1110通过执行存储器1130上所存放的程序通过将不同类型的启动项对应的标记写入主线程数据区的各个位置,随着主线程的运行启动相应主线程数据区内的启动项,从而实现对于启动项启动时间的控制,使得启动项与业务场景关联启动,以降低业务场景的启动时间,即减少用户的等待时间,同时,由于应用程序主线程运行之前写入主线程数据区,方便各业务场景定制自己执行的启动项,减少代码耦合易于维护,按业务场景定义不同类型启动项,制定接入规范,满足不同业务需要,降低接入成本,减少启动时间。
上述电子设备提到的通信总线1140可以是外设部件互连标准(PeripheralComponentInterconnect,简称PCI)总线或扩展工业标准结构(ExtendedIndustryStandardArchitecture,简称EISA)总线等。该通信总线1140可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口1120用于上述电子设备与其他设备之间的通信。
存储器1130可以包括随机存取存储器1130(RandomAccessMemory,简称RAM),也可以包括非易失性存储器1130(non-volatilememory),例如至少一个磁盘存储器1130。可选的,存储器1130还可以是至少一个位于远离前述处理器1110的存储装置。
上述的处理器1110可以是通用处理器1110,包括中央处理器1110(CentralProcessingUnit,简称CPU)、网络处理器1110(NetworkProcessor,简称NP)等;还可以是数字信号处理器1110(DigitalSignalProcessing,简称DSP)、专用集成电路(ApplicationSpecificIntegratedCircuit,简称ASIC)、现场可编程门阵列(Field-ProgrammableGateArray,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
本发明实施例提供了一种计算机可读存储介质,计算机可读存储介质存储有一个或者多个程序,一个或者多个程序可被一个或者多个处理器1110执行,以实现上述任一实施例的应用程序启动项加载方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本发明实施例的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘SolidStateDisk(SSD))等。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (8)
1.一种应用程序启动项加载方法,其特征在于,所述加载方法包括:
在所述应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中,包括:构建在所述应用程序主线程运行之前运行的编译函数;在所述编译函数运行时,将至少一个数据块写入所述标记对应的业务场景的主线程数据区中;其中,所述数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同;
在所述应用程序运行时,获取所述应用程序主线程的主线程数据区中写入的每个数据块;获取每个数据块内的标记关联的每个启动项对应的函数指针;根据所述启动项关联的标记对所述函数指针进行分组,使得对应同一标记的启动项对应的函数指针为同一组,分别得到每个标记对应的函数指针列表;
当所述应用程序运行到任一业务场景对应的主线程数据区时,根据所述主线程数据区内的所述数据块中的标记执行关联的启动项,包括:当所述应用程序运行到任一业务场景对应的主线程数据区时,获取所述主线程数据区内的所述数据块中的标记;获取所述标记对应的所述函数指针列表,根据所述函数指针列表中的函数指针分别执行关联的启动项。
2.根据权利要求1所述的加载方法,其特征在于,所述在所述应用程序主线程运行之前,将包含标记的数据块分别写入相应的业务场景对应的主线程数据区中,包括:
针对每个启动项,将所述启动项与标记进行关联组成数据块;其中,属于同一业务场景的启动项关联的标记相同;
在所述应用程序主线程运行之前,将所述数据块分别写入相应的业务场景对应的主线程数据区中。
3.根据权利要求2所述的加载方法,其特征在于,所述将所述启动项与标记进行关联组成数据块,包括:
根据所述标记与指向所述启动项的函数地址的函数指针,构建包含所述函数指针和所述标记的结构体,作为所述数据块。
4.根据权利要求1所述的加载方法,其特征在于,所述根据所述函数指针列表中的函数指针分别执行关联的启动项,包括:
遍历所述函数指针列表中的函数指针,依次执行函数指针关联的启动项。
5.根据权利要求1~4中任一所述的加载方法,其特征在于,所述将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中之前,加载方法还包括:
获取所述应用程序中各个业务场景的对应的主线程数据区的运行顺序;
根据所述标记的预设置的优先级按从高至低的顺序和所述业务场景的运行顺序,将所述标记与业务场景逐个配对;
根据所述标记与所述业务场景的配对结果,将每个所述业务场景下的启动项与业务场景对应的标记进行关联,使得属于同一业务场景的启动项关联的标记相同。
6.一种应用程序启动项加载装置,其特征在于,所述加载装置包括:
第一处理单元,用于在所述应用程序主线程运行之前,将包含标记的数据块分别写入应用程序主线程中相应的业务场景对应的主线程数据区中,包括:构建在所述应用程序主线程运行之前运行的编译函数;在所述编译函数运行时,将至少一个数据块写入所述标记对应的业务场景的主线程数据区中;其中,所述数据块中的标记与至少一个启动项关联,且属于同一业务场景的启动项关联的标记相同;
在所述应用程序运行时,获取所述应用程序主线程的主线程数据区中写入的每个数据块;获取每个数据块内的标记关联的每个启动项对应的函数指针;根据所述启动项关联的标记对所述函数指针进行分组,使得对应同一标记的启动项对应的函数指针为同一组,分别得到每个标记对应的函数指针列表;
第二处理单元,用于当所述应用程序运行到任一业务场景对应的主线程数据区时,根据所述主线程数据区内的所述数据块中的标记执行关联的启动项,包括:当所述应用程序运行到任一业务场景对应的主线程数据区时,获取所述主线程数据区内的所述数据块中的标记;获取所述标记对应的所述函数指针列表,根据所述函数指针列表中的函数指针分别执行关联的启动项。
7.一种应用程序启动项加载系统,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
存储器,用于存放计算机程序;
处理器,用于执行存储器上所存放的程序时,实现权利要求1~5中任一所述的应用程序启动项加载方法。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现权利要求1~5中任一所述应用程序启动项加载方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110129563.0A CN112817657B (zh) | 2021-01-29 | 2021-01-29 | 一种应用程序启动项加载方法、装置、系统及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110129563.0A CN112817657B (zh) | 2021-01-29 | 2021-01-29 | 一种应用程序启动项加载方法、装置、系统及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112817657A CN112817657A (zh) | 2021-05-18 |
CN112817657B true CN112817657B (zh) | 2023-07-18 |
Family
ID=75860371
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110129563.0A Active CN112817657B (zh) | 2021-01-29 | 2021-01-29 | 一种应用程序启动项加载方法、装置、系统及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112817657B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113326082A (zh) * | 2021-07-30 | 2021-08-31 | 北京达佳互联信息技术有限公司 | 一种应用程序的启动方法、电子设备及存储介质 |
CN113901485B (zh) * | 2021-12-07 | 2022-05-10 | 展讯通信(天津)有限公司 | 应用程序加载方法、电子设备及存储介质 |
CN114860340A (zh) * | 2022-05-17 | 2022-08-05 | 中国平安财产保险股份有限公司 | 配置逻辑代码的启动控制方法、装置、设备及存储介质 |
CN115543342B (zh) * | 2022-11-28 | 2023-03-24 | 天津华来科技股份有限公司 | 在编译时替换启动页面的方法、电子设备、存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10467027B1 (en) * | 2018-08-24 | 2019-11-05 | Sap Se | Dynamic script loading resource files |
CN110471690A (zh) * | 2019-06-25 | 2019-11-19 | 珠海格力电器股份有限公司 | 动态链接库so文件的加载方法、装置及存储介质 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10108406B2 (en) * | 2016-10-24 | 2018-10-23 | International Business Machines Corporation | Linking optimized entry points for local-use-only function pointers |
US10534593B2 (en) * | 2016-10-24 | 2020-01-14 | International Business Machines Corporation | Optimized entry points and local function call tailoring for function pointers |
CN109726067B (zh) * | 2017-10-30 | 2021-08-24 | 腾讯科技(深圳)有限公司 | 一种进程监控方法以及客户端设备 |
CN108415736B (zh) * | 2018-02-06 | 2021-03-30 | 新浪网技术(中国)有限公司 | 利用进程文件系统标记程序进程的方法、装置和设备 |
CN109783159B (zh) * | 2019-01-24 | 2022-03-29 | 武汉瓯越网视有限公司 | 基于配置信息的应用启动方法和装置 |
US10831884B1 (en) * | 2019-09-16 | 2020-11-10 | International Business Machines Corporation | Nested function pointer calls |
CN112181512B (zh) * | 2020-09-14 | 2022-11-11 | 锐捷网络股份有限公司 | 一种业务进程管理方法、装置、电子设备及存储介质 |
-
2021
- 2021-01-29 CN CN202110129563.0A patent/CN112817657B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10467027B1 (en) * | 2018-08-24 | 2019-11-05 | Sap Se | Dynamic script loading resource files |
CN110471690A (zh) * | 2019-06-25 | 2019-11-19 | 珠海格力电器股份有限公司 | 动态链接库so文件的加载方法、装置及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112817657A (zh) | 2021-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112817657B (zh) | 一种应用程序启动项加载方法、装置、系统及存储介质 | |
CN108845839B (zh) | 应用页面加载方法、装置及计算机可读存储介质 | |
Edwards et al. | Developing series 60 applications: a guide for symbian OS C++ developers | |
CN109032693B (zh) | 一种加载展示信息方法、装置、电子设备及可读存储介质 | |
CN112416303B (zh) | 软件开发工具包热修复方法、装置及电子设备 | |
CN115543440A (zh) | 安卓项目迁移到类安卓系统的方法、电子设备和存储介质 | |
CN110941443B (zh) | 修改sdk中文件名的方法、装置及电子设备 | |
CN112395437B (zh) | 一种3d模型的加载方法、装置、电子设备及存储介质 | |
CN115080114B (zh) | 应用程序的移植处理方法、装置和介质 | |
CN111352644A (zh) | 小程序更新方法、装置、服务器及存储介质 | |
US20050268219A1 (en) | Method and system for embedding context information in a document | |
CN111158777A (zh) | 组件调用方法、装置及计算机可读存储介质 | |
US8615744B2 (en) | Methods and system for managing assets in programming code translation | |
CN111796865B (zh) | 一种字节码文件修改方法、装置、终端设备及介质 | |
CN114625373A (zh) | 应用转换方法、装置、电子设备和存储介质 | |
CN109857503B (zh) | 页面交互效果自适应方法、装置与电子设备 | |
CN112711435A (zh) | 版本更新方法、版本更新装置、电子设备和存储介质 | |
CN112068814A (zh) | 可执行文件的生成方法、装置、系统及介质 | |
US7702890B2 (en) | Information processing apparatus and program | |
CN111209225B (zh) | 获取实际地址的方法、装置、介质和电子设备 | |
CN116974653B (zh) | 类加载方法及系统 | |
CN111562913B (zh) | 视图组件的预创建方法、装置、设备及计算机可读介质 | |
WO2023125083A1 (zh) | 资源文件加载方法、装置、电子设备及存储介质 | |
CN112015394B (zh) | 安卓功能模块开发方法和装置、计算机系统和存储介质 | |
CN110489469B (zh) | 数据传输方法、装置、计算机设备以及存储介质 |
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 |