应用程序启动时的初始化方法、装置、电子设备及介质与流程

文档序号:24408607发布日期:2021-03-26 18:23阅读:134来源:国知局
应用程序启动时的初始化方法、装置、电子设备及介质与流程

1.本发明涉及应用程序开发技术领域,尤其涉及一种应用程序启动时的初始化方法、装置、电子设备及介质。


背景技术:

2.目前,应用程序(application,app)在用户使用移动终端时不可或缺,以实现网络浏览、即时通信、文字处理、图像编辑、数据库调用等功能。对移动端应用,尤其是代码量超百万行、月活过亿等大型应用程序的迭代开发需要分模块进行,以便更容易进行扩展和维护。而在行使其正常功能前,多数模块都需要执行初始化操作。初始化操作大多时候是在应用启动时执行的。
3.移动端应用的初始化模块只有一个,在对各个模块进行初始化时,通常的做法是由初始化模块集中调用各个模块,顺次进行初始化操作,如图1所示。
4.在现有的初始化技术中,大量的模块初始化堆积到一处,极易造成应用启动卡顿变慢,也会产生不必要的重复。此外,模块之间存在强依赖关系,容易发生崩溃或初始化无效,同时会使应用开发效率低下。


技术实现要素:

5.本发明提供一种应用程序启动时的初始化方法、初始化装置以及相应的电子设备、非暂态计算机可读存储介质和计算机程序产品,用以解决现有技术中应用程序启动卡顿变慢、初始化崩溃或无效等技术问题,实现对模块初始化规范、有效的管理。
6.第一方面,本发明提供一种应用程序启动时的初始化方法,包括以下步骤:
7.当对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;
8.将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;
9.当启动应用程序时,将数据表加载到初始化模块;以及
10.根据数据表中关于初始化的参数,对相应的模块进行初始化。
11.根据本发明提供的初始化方法,关于初始化的参数优选包括优先级,所述对相应的模块进行初始化按照所述优先级进行。
12.根据本发明提供的初始化方法,在对相应的模块进行初始化时,进一步包括:监控初始化过程中的实际时长,并在实际时长异常时将其上报;以及/或者监控初始化过程中是否发生错误,并在错误发生时将其上报。
13.根据本发明提供的初始化方法,关于初始化的参数优选还包括时长阈值,所述监控初始化过程中的实际时长,并在实际时长异常时将其上报具体包括:通过监控获得实际时长,将实际时长与数据表中的时长阈值进行比较;如果实际时长大于时长阈值,则将实际时长判定为异常并上报。
14.根据本发明提供的初始化方法,关于初始化的参数优选还包括函数名和/或进程参数和/或同步/异步标志,其中函数名指示初始化函数的位置;进程参数指示需要对相应
的模块进行初始化的进程;同步/ 异步标志指示对相应的模块进行初始化是否异步执行。
15.根据本发明提供的初始化方法,所述针对应用程序中的各个模块获取关于初始化的参数具体包括:通过扫描各个模块的注解,搜集关于初始化的参数。
16.第二方面,本发明还提供一种应用程序启动时的初始化装置,包括:
17.获取单元,用于在对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;
18.生成单元,用于将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;
19.加载单元,用于在启动应用程序时,将数据表加载到初始化单元;以及
20.初始化单元,用于根据数据表中关于初始化的参数,对相应的模块进行初始化。
21.第三方面,本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行该计算机程序时实现如上述任一种的应用程序启动时的初始化方法的步骤。
22.第四方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种的应用程序启动时的初始化方法的步骤。
23.第五方面,本发明还提供一种计算机程序产品,该计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现如上述任一种的应用程序启动时的初始化方法的步骤。
24.由上述技术方案可知,本发明提供的应用程序启动时的初始化方法、初始化装置、电子设备、存储介质及程序产品,通过在编译应用程序时获取关于各个模块的初始化的参数生成数据表,并将数据表打包在编译产物中,简化了初始化模块的工作。当启动应用程序时,初始化模块只需加载数据表,获得表中关于初始化的参数,就可以按照该参数对相应的模块进行初始化。由此,建立了一套应用启动时的初始化管理方案,规范了初始化进程,使得对模块的初始化变得简单快捷,减少了由初始化进程导致的崩溃和错误,也避免了现有技术中应用程序启动卡顿变慢的问题,能够对模块的初始化进行规范、有效的管理。
附图说明
25.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍。显而易见地,下面描述中的附图是本发明的一部分实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
26.图1是示出现有技术中的模块初始化方法的示意图;
27.图2是本发明一实施例提供的应用程序启动时的初始化方法的流程图;
28.图3是本发明一实施例提供的应用程序启动时的初始化方法的示意图;
29.图4是本发明一实施例提供的应用程序启动时的初始化方法中的代码片段示意图;
30.图5是本发明一实施例提供的应用程序启动时的初始化装置的示意图;
31.图6是本发明一实施例提供的电子设备的结构示意图。
具体实施方式
32.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
33.发明人对于移动端应用程序中模块的现行初始化方案进行了深入研究,发现其对于应用相对简单时是可行的,然而随着业务累积,模块数量增加,初始化模块会变得越来越难于维护,并带来一系列的问题,主要表现在以下几个方面:
34.应用启动卡慢:现行方案中越来越多的模块初始化堆积到一处执行,没有任何的监控措施,必然造成应用启动速度变慢,而启动速度是一个非常重要的移动应用性能指标,另外,如果某些模块代码不规范,却在初始化代码中同步地进行耗时操作,在现有系统中会非常难以排查;
35.软件崩溃和/或初始化无效:由于各模块之间存在依赖关系,所以初始化的顺序应该被据此进行定义,被依赖的模块应该先行初始化,才能保证整个软件运行正常,但现行方案中因为不存在这种严格定义的顺序,使得开发者可以随意调整模块初始化顺序,容易发生崩溃和无效的初始化;
36.不必要的重复初始化:应用程序的初始化是按照进程进行的,大多数模块并不需要在每个进程都进行初始化,因而需要由初始化模块频繁判断当前进程,如果发生错误,则可能对相应模块本不需要初始化的进程执行了初始化,造成性能问题和安全问题;
37.代码耦合严重:初始化模块要调用其它模块的代码,需要直接或间接依赖这些模块,从而产生强耦合,降低了开发效率,不利于模块化开发。
38.在此基础上,本发明提供了一种应用程序启动时的初始化方法,参见图2,该初始化方法包括以下步骤:
39.当对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;
40.将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;
41.当启动应用程序时,将数据表加载到初始化模块;以及
42.根据数据表中关于初始化的参数,对相应的模块进行初始化。
43.在本实施例中,需要说明的是,各个模块是指执行特定业务逻辑的业务模块,比如网络模块,或下文中的tea模块等,这些模块需要在应用程序启动的时候被初始化。初始化函数一般被各自定义在业务模块当中,方便它调用业务代码。
44.根据本实施例,还需要一个用于实现初始化功能的初始化模块,初始化模块通常设置在主模块之中,作为主模块的子模块运行,协助主模块管理各个业务模块。但本发明不限于此,只要能够与其它各个模块进行通信、交互信息,初始化模块可以在任意模块中运行,因为它与其它模块之间的依赖性降低,不再是强耦合关系,或者说初始化模块是解耦的。
45.这样,本发明的初始化方法只需对各个模块的初始化函数加注解即可,编译应用程序的时候读取这些注解获得参数、生成数据表,以便初始化模块能够有选择地调用这些加了注解的函数的模块。参见图 3,应用程序启动时,在将数据表加载到初始化模块之后,初始化模块就基本上可以简单地通过读取数据表,来按照表中配置的信息,逐个执行初始
化函数,并根据优先级、进程、是否异步等统一管理业务模块的初始化。
46.由上述技术方案可知,本实施例提供的应用程序启动时的初始化方法通过建立数据表降低了模块之间的依赖关系,简化了初始化模块的工作。本实施例的初始化方法采用一套优化的初始化管理方案,规范并简化了应用程序启动时的初始化进程,避免了现有技术中应用程序启动卡顿变慢的问题,也减少了由初始化进程导致的崩溃和错误,从而实现了对模块初始化的规范、有效的管理。
47.基于上述实施例的内容,在本实施例中,针对应用程序中的各个模块获取关于初始化的参数具体包括:通过扫描各个模块的注解,搜集关于初始化的参数。
48.在本实施例中,需要说明的是,在编译时扫描注解,可以搜集到关于各个模块初始化的优先级、时长、初始化函数、进程、同步/异步等参数,据此在编译产物中建立数据表。
49.参见图4,其示出了本实施例的初始化方法中的一段代码。
50.在本实施例中,将所涉及的业务模块,例如用于上报游戏活跃数据的模块,命名为tea。针对模块tea,用注解@initialize进行标记,其表示该模块会在应用程序启动时被自动执行初始化。
51.@initialize的注解中,开发者定义如下三个参数:
52.async=false或async=true,表示需要同步执行还是异步执行,本实施例中是异步的,也就是需要在子线程进行初始化,如果不指定这个参数,可以为其设置默认值,例如,默认为异步执行;
53.priority=initpriority.tea_init_priority,表示初始化的优先级,initpriority.tea_init_priority是预先定义好的常量,优先级定义得越高,相应模块的初始化就会越早被执行,通常来说底层模块被其它模块调用得多,其优先级更高,应当先行初始化;
54.process=processtype.x,表示需要执行初始化的进程,有些模块并不需要在所有进程都进行初始化,在本实施例中,相应模块只在 processtype.x表示的进程执行初始化操作,其它进程不需初始化,又如网络模块,在不需要获取/上传网络数据的那些进程中,就可以不进行初始化。
55.对于本实施例而言,在android系统下使用gradle进行编译,其中transform环节会扫描到注解@initialize,读取并记录上述参数,从而生成数据表,随后被gradle打包进编译产物中。需要说明的是,虽然上文描述了android系统下的示例,但本发明并不限于此,而是也可以适用于如ios等其它终端设备上的操作系统。
56.在本实施例中,初始化函数不需要被任何代码显式调用,只需要关注自身模块的优先级、初始化进程和相关初始化代码,从而实现解耦。
57.基于上述实施例的内容,在本实施例中,关于初始化的参数优选包括优先级,所述对相应的模块进行初始化按照优先级进行。
58.对各个模块的优先级统一使用常量管理,使得各个模块及其优先级一目了然。
59.基于上述实施例的内容,在本实施例中,关于初始化的参数优选还包括进程参数,该进程参数指示需要对相应的模块进行初始化的进程。
60.由于规范定义了需要初始化的进程,可以防止不必要的和/或重复的初始化,例如前文中的示例,在不需要获取/上传网络数据的进程中,可以不对网络模块进行初始化。
61.本实施例通过优先级和进程参数限定了各个模块的初始化进程和顺序,防止了崩溃和无效初始化的发生。
62.基于上述实施例的内容,在本实施例中,关于初始化的参数优选还包括同步/异步标志,该同步/异步标志指示对相应的模块进行初始化是否异步执行。
63.本发明对同步和异步初始化做了区分,并将同步/异步标记也记录在数据表中,然后根据标记对模块进行同步或者异步地初始化。对于高耗时的操作,可以直接声明为异步执行。由于高并发地进行初始化操作,大大提升了启动速度,改善了用户体验。
64.可见,本发明的初始化方法只需在初始化的函数上直接进行注解,声明需要执行初始化的进程、优先级等参数,在应用启动时,就会执行该函数,简单快捷地对模块进行初始化。
65.在现有技术中,模块初始化往往由于开发者图方便都选择在主线程进行,造成界面渲染卡顿,即使有一些并发执行,它的并发也是杂乱不规范的,因为开发者只是随意起一个线程或线程池,也没有考虑复用。而本发明的方法是依据预判的初始化操作时长来预先选择同步还是异步并进行声明,或者如果未进行声明的情况下优选地默认为异步执行,这样落到主线程的任务就减轻了,也不会为各个模块任意地另起新线程,有效地避免了卡顿。
66.基于上述实施例的内容,在本实施例中,在对相应的模块进行初始化时,进一步包括:
67.监控初始化过程中的实际时长,并在实际时长异常时将其上报;以及/或者
68.监控初始化过程中是否发生错误,并在错误发生时将其上报。
69.本发明提供的初始化方法通过例如服务端或客户端对各个模块的初始化过程进行监控,在监控中发现异常时,参见图3,例如发现实际时长过长或者进程出错时,进行上报,给出告警信息。收到告警信息后,可以优化应用启动速度,解决初始化中发生的错误等问题。
70.基于上述实施例的内容,在本实施例中,关于初始化的参数优选还包括时长阈值,所述监控初始化过程中的实际时长,并在实际时长异常时将其上报具体包括:通过监控获得实际时长,将实际时长与数据表中的时长阈值进行比较;如果实际时长大于时长阈值,则将实际时长判定为异常并上报。
71.数据表中的关于初始化的参数中可以包括关于各个模块的初始化时间的参数,比如预判的初始化操作所需时间,其可以是一个可能性最高的点值或一个数值区间。其中,最重要的时间参数是时长阈值,用于判断实际监控到的初始化时长是否异常,因此时长阈值应当大于或至少等于预判的初始化操作所需时间(当该时间的取值为一个数值区间时,时长阈值大于或至少等于该区间的上限)。
72.将被判定为异常的实际时长上报,这样从报表中就能直接获知是哪个模块的问题,便于针对性的处理问题模块、优化性能,而不必在海量的代码中寻找问题出处。
73.对各个模块初始化速度进行监控和对比,既包括各个模块之间的横向比较,也包括一个模块自身的纵向比较。当进行整体性能优化时,横向比较可以随各个模块的时长变化进行排序,帮助找到最耗时的那些模块去进行优化。当进行性能监控时,更关注对每个模块的纵向比较,尤其是在迭代版本中比较某个模块的初始化时长时,它不应该显著增长。开发者会定期收集每个模块的初始化时长数据,进行显著性检验,对于呈现出显著增长的模
块进行处理。
74.由上述技术方案可知,本实施例提供的应用程序启动时的初始化方法,在应用启动过程中,通过对各个模块的初始化速度进行监控、对比和上报,借由报表及早发现高耗时现象,及时找到初始化卡慢的模块并进行优化处理,防止了随着代码规模增大,应用启动变慢问题的发生,有效管理了模块初始化。
75.基于上述实施例的内容,在本实施例中,关于初始化的参数优选还包括函数名,所述对相应的模块进行初始化具体包括:根据数据表中的函数名获知初始化函数的位置,从而通过java反射机制对相应的模块进行初始化。
76.因为代码的函数名已在数据表中进行了定义,所以初始化模块只要读取数据表就可获知初始化函数的位置,从而不必依赖任何业务模块,就可以通过java反射机制执行初始化代码,解决了代码之间耦合严重的问题。
77.根据本发明的初始化方法,只需要关注有限的代码逻辑,就可以解耦地对模块进行初始化,避免了模块之间的直接调用,同时对进程的选择和初始化的次序有很好的支持,对于启动卡慢和初始化错误也可以进行预防和规避,有利于提升开发效率。
78.下面对本发明提供的应用程序启动时的初始化装置进行描述,下文描述的初始化装置与上文描述的初始化方法可相互对应参照。参见图5,本实施例提供的初始化装置具体包括:
79.获取单元21,用于在对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;
80.生成单元23,用于将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;
81.加载单元25,用于在启动应用程序时,将数据表加载到初始化单元27;以及
82.初始化单元27,用于根据数据表中关于初始化的参数,对相应的模块进行初始化。
83.基于上述实施例的内容,在本实施例中,关于初始化的参数包括优先级,初始化单元27对相应的模块进行初始化按照所述优先级进行。
84.基于上述实施例的内容,在本实施例中,初始化装置还包括监控单元,用于在所述对相应的模块进行初始化时,监控初始化过程中的实际时长,并在实际时长异常时将其上报;以及/或者监控初始化过程中是否发生错误,并在错误发生时将其上报。
85.基于上述实施例的内容,在本实施例中,关于初始化的参数还包括时长阈值,监控单元监控初始化过程中的实际时长,并在所述实际时长异常时将其上报具体包括:通过监控获得实际时长,将实际时长与数据表中的时长阈值进行比较;如果实际时长大于时长阈值,则将实际时长判定为异常并上报。
86.基于上述实施例的内容,在本实施例中,关于初始化的参数还包括函数名,初始化单元27对相应的模块进行初始化具体包括:根据数据表中的函数名获知初始化函数的位置,以通过java反射机制对相应的模块进行初始化。
87.基于上述实施例的内容,在本实施例中,关于初始化的参数还包括:
88.进程参数,该进程参数指示需要对相应的模块进行初始化的进程;和/或
89.同步/异步标志,该同步/异步标志指示对相应的模块进行初始化是否异步执行。
90.基于上述实施例的内容,在本实施例中,获取单元21针对应用程序中的各个模块
获取关于初始化的参数具体包括:通过扫描各个模块的注解,搜集关于初始化的参数。
91.由于本发明实施例提供的初始化装置,可以用于执行上述实施例所述的初始化方法,其工作原理和有益效果类似,故此处不再详述,具体内容可参见上述实施例的介绍。
92.在本实施例中,需要说明的是,本发明实施例的装置可以由软件和/或硬件的方式实现,并可以集成在诸如手机、平板电脑等用户终端设备中。该装置中的单元只是按照功能逻辑进行划分的,并且不局限于上述的划分,只要能够实现相应的功能即可。各个单元可以集成于一体,也可以分离部署;可以合并为一个单元,也可以进一步拆分成多个子单元。
93.基于相同的发明构思,本发明又一实施例提供了一种电子设备,参见图6,所述电子设备可以包括:处理器810、通信接口820、存储器830和通信总线840,其中,处理器810、通信接口820、存储器830通过通信总线840完成相互间的通信。
94.处理器810可以调用存储器830中的计算机程序,以执行一种应用程序启动时的初始化方法,该初始化方法例如包括以下步骤:当对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;当启动应用程序时,将数据表加载到初始化模块;以及根据数据表中关于初始化的参数,对相应的模块进行初始化。
95.本领域技术人员可以理解,处理器810还可以实现本发明任意实施例所提供的初始化方法,并且图6所示的电子设备仅仅是一种示例,其也可以通过能够调用指令实现前述初始化方法的任意设备来实现。
96.上述的存储器830中的逻辑指令也可以通过软件功能单元的形式实现并作为独立的产品销售或使用,这时将其存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
97.基于前述发明构思,本发明又一实施例提供了一种非暂态计算机可读存储介质,该非暂态计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述应用程序启动时的初始化方法的步骤。例如,处理器执行该计算机程序时实现下述过程:当对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;当启动应用程序时,将数据表加载到初始化模块;以及根据数据表中关于初始化的参数,对相应的模块进行初始化。
98.通常,前述存储介质可包括诸如u盘、移动硬盘、只读存储器 (rom)、随机存取存储器(ram)、磁碟或者光盘等各种可以存储程序代码的介质。
99.可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上述实施例的描述。
100.基于相同的发明构思,本发明又一实施例提供了一种计算机程序产品,该计算机程序产品包括计算机程序,该计算机程序被处理器执行时实现上述应用程序启动时的初始化方法的步骤。例如,处理器执行该计算机程序时实现下述过程:当对应用程序进行编译时,针对应用程序中的各个模块获取关于初始化的参数;将关于初始化的参数记录到数据表中,并将数据表打包在编译产物中;当启动应用程序时,将数据表加载到初始化模块;以
及根据数据表中关于初始化的参数,对相应的模块进行初始化。
101.可以理解的是,所述计算机程序可以执行的细化功能和扩展功能可参照上述实施例的描述。
102.以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元示出的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
103.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机、服务器或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
104.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1