一种多分包应用冷启动优化方法和装置与流程

文档序号:23151700发布日期:2020-12-04 13:47阅读:91来源:国知局
本发明涉及应用(application,简称app)
技术领域
:,特别地涉及一种多分包应用冷启动优化方法和装置。
背景技术
::在启动应用时,如果后台没有该应用的进程,此时系统需要加载应用并创建一个进程分配给所述应用,然后在主线程根据启动参数启动相应的组件,这种应用启动方式称为冷启动,其是从用户启动app到activity显示的过程。在应用冷启动过程中,首先由android系统完成三个任务:加载并启动app、展示一个空白的背景启动窗口以及创建app进程。完成这三个任务之后,所述app进程接着创建application对象、启动主线程、建立mainactivity、加载view、布置屏幕以及进行首帧绘制得到启动页。当app进程完成初始绘制之后,系统进程用启动页来替换当前显示的背景启动窗口,这个时刻用户就可以使用app了。从上述流程可见,冷启动需要经历一系列的流程,经过测试启动时间可知,相对暖启动和热启动,冷启动耗时最多。在用户点击了应用图标时,如果响应时间过长,则会严重影响用户的使用体验。技术实现要素:针对现有技术中存在的技术问题,本发明提出了一种多分包应用冷启动优化方法和装置,通过优化启动过程以减少冷启动时间,提高用户体验。为了解决上述技术问题,根据本发明的一个方面,本发明提供了一种多分包应用冷启动优化方法,其中所述多分包应用包括主dex文件和从dex文件,所述方法包括:在启动应用过程中同步加载主dex文件;以及在主dex文件加载完成后启动新的工作线程异步加载从dex文件。优选地,所述方法进一步包括:查询加载器中的dexelement数组,根据预置主、从dex文件标识,从所述dexelement数组中确定主、从dex文件及其路径。优选地,同步加载主dex文件的步骤进一步包括:根据主dex文件路径查询是否存储了所述主dex文件的优化文件,响应于查询到所述主dex文件的优化文件,加载所述主dex文件的优化文件。优选地,所述方法进一步包括:响应于没有查询到所述主dex文件的优化文件,优化所述主dex文件以生成其优化文件。优选地,所述方法进一步包括:根据从dex文件数量同时启动相同数量的工作线程分别异步加载所述从dex文件。为了解决上述技术问题,根据本发明的另一个方面,本发明提供了一种多分包应用冷启动优化装置,其中所述多分包应用包括主dex文件和从dex文件,所述装置包括启动模块、同步加载模块和异步加载模块,其中,所述启动模块经配置以完成应用的启动流程;所述同步加载模块经配置在应用的启动过程中同步加载主dex文件;所述异步加载模块经配置在所述同步加载模块完成主dex文件的加载后异步加载从dex文件。优选地,所述装置进一步包括dex文件识别模块,经配置在应用的启动过程中,通过查询加载器中的element数组,根据预置主、从dex文件标识从所述element数组中确定主、从dex文件及其路径。优选地,所述异步加载模块经进一步配置,根据识别的从dex文件数量及其路径,启动对应数量的工作线程异步加载对应的从dex文件。优选地,所述装置进一步包括优化模块,经配置在加载主和/或从dex文件时,在所述主和/或从dex文件没有对应的优化文件时,对所述主和/或从dex文件进行优化。优选地,在加载完所述主dex文件后,所述启动模块继续其启动流程;同时,触发所述异步加载模块用于异步加载从dex文件。本发明在应用冷启动的流程中只同步加载主dex文件,在加载完所述主dex文件后再异步加载其他从dex文件。由于加载其他从dex文件的过程并不影响启动流程,且主dex文件的内容已经大大减少,因而缩短了加载应用的时间,从而缩短了冷启动时间。附图说明下面,将结合附图对本发明的优选实施方式进行进一步详细的说明,其中:图1是根据本发明的一个实施例的应用启动流程图;图2是根据本发明的一个实施例的加载dex文件的流程图;以及图3是根据本发明的一个实施例的多分包应用冷启动优化装置的原理图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。在以下的详细描述中,可以参看作为本申请一部分用来说明本申请的特定实施例的各个说明书附图。在附图中,相似的附图标记在不同图式中描述大体上类似的组件。本申请的各个特定实施例在以下进行了足够详细的描述,使得具备本领域相关知识和技术的普通技术人员能够实施本申请的技术方案。应当理解,还可以利用其它实施例或者对本申请的实施例进行结构、逻辑或者电性的改变。从应用启动过程可知,系统首先需要加载该应用,即加载apk包中的dex文件。在android系统中,由于一个app的所有代码都在dex文件里面,而目前android应用(app)的功能也越来越强大和复杂,因而dex文件的代码量也越来越大,使用的方法也越来越多。因而app启动时用于加载dex文件的耗时也就越来越多,从而使dex文件的加载成为了一个影响冷启动速度的原因之一。本发明中的apk包在编译时创建了一个打包文件,在该打包文件中指定了需要打包到主dex文件中的启动页面中的组件、类,同时也指定了需要打包到从dex文件中的其他的二级、三级页面中的组件、类等。例如,将service、receiver、provider涉及到的代码都放到主dex文件中,把首页activity、laucheractivity、欢迎页的activity等所依赖的class也放到主dex文件中,从而保证主dex文件所含的class以及他们所依赖的所有class都在其内,从而可以保证应用的正常启动。在进行分包操作时,参考所述打包文件生成一个主dex文件和一个或一个以上的从dex文件,并设置标识进行区分。当用户下载了所述apk包时,包结构中包括多个dex文件。图1是根据本发明一个实施例的应用启动流程图,所述应用启动流程包括:步骤s100,在用户点击了桌面的app图标后产生点击事件。步骤s101,打开空白窗口,同时创建app进程和主线程activitythread。具体地,launcher应用程序接收到所述点击事件后,调用activitymanagerservice(活动管理服务,简称ams),通过调用mwindowmanager.setappstartingwindow方法通知wms(windowmanagerservice,窗口管理服务)创建空白色的过渡窗口。ams调用startprocesslocked方法创建新的app进程和主线程activitythread。以下为创建app进程的一个实施例:ams通过socket将参数传递给zygote进程,zygote分裂,调用zygoteinit.man()方法来实例化activitythread并最终返回新的进程pid;随后activitythread一次调用looper.prepareloop()和looper.loop()来开启消息循环。zygote进程调用registerzygotesocket()方法来创建一个server端的socket,然后调用runselectloopmode方法进入循环等待。所述server端socket主要负责接收activitymanagerservice发送过来的创建应用程序进程的请求,而ams是通过调用startprocesslocked方法来发送请求的。当zygote进程的server端接收到来自ams创建应用程序进程的请求后,就会调用forkandspecialize()方法通过分裂(fork)当前进程来创建app进程。而后指定android.app.activitythread类的main方法为入口函数,main方法成功创建activitythread对象即主线程,再调用attach方法完成activitythread对象初始化。从而完成了app进程主线程的创建。步骤s102,加载application,绑定app进程和application。即加载apk包中的主dex文件。具体地,在app进程创建完成后,activitythread发送bind_application消息到messagequeue中,handlerbindapplication()方法调用makeapplication()方法将app主dex文件中的代码库加载到内存中。其中,在调用makeapplication()方加载dex文件时,具体如图2所示:步骤s200,创建pathclassloader加载器。具体地,首先创建loadedapk对象,然后调用getclassloader方法给应用程序创建pathclassloader加载器。如果mloaders列表中已存在该类的类加载器,则使用该类加载器,如果没有,则给该apk创建新的pathclassloader加载器,并将app的目录名和对应的类加载器添加到mloaders列表中。所述pathclassloader加载器执行dalvik加载和解析dex文件的操作,具体包括:步骤s201,由getclassloader方法创建pathclassloader类对象。由于pathclassloader类继承了basedexclassloader父类,pathclassloader构造函数最终调用的是父类的构造函数。步骤s202,采用splitedexpath方法将传递进来的dex路径字符串分割转换成file对象数组。步骤s203,调用makedexelements方法,遍历dexpath中的所有文件来查询dex、jar、apk或zip结尾的文件,并将这些文件保存到dexelements数组中。每一个element保存了一个dex文件或资源文件路径。因而,在本发明中,由于本发明是多dex包,因而此时有多个对应的element。步骤s204,查询dexelement数组,根据预置主、从dex文件标识,从所述dexelement数组中确定主、从dex文件及其路径。例如,文件名中没有数字的是主dex文件,有数字的为从dex文件。例如,class.dex标识的为主dex文件,classes2.dex,classes3.dex、……等为从dex文件。步骤s205,当找到主dex文件时,通过函数loaddexfile加载所述主dex文件,如果该dex文件为已优化的文件,则直接加载,如果没有优化,则先优化再加载。在加载dex文件时采用了opendexfilenative方法,当传递进来的文件类型是dex文件类型时,调用dvmrawdexfileopen加载解析,并将解析后的文件信息保存到rawdexfile结构体中,而后保存到dexorjar结构体对象中,最后调用addtodexfiletable方法将当前解析后的dexorjar对象保存到全局变量gdvm.userdexfiles哈希表数组中,从而将app的主dex文件中的代码加载到内存中。而后所述handlerbindapplication()方法创建和初始化application类,从而绑定了app进程和application。然后执行步骤s103。步骤s206,在主dex文件加载完成后发送消息给主线程activitythread,在该消息中包括从dex文件的数量及标识。步骤s207,activitythread根据从dex文件的数量启动多个工作线程,对从dex文件异步加载。步骤s103,创建application对象。其中,当获取到应用程序的类加载器后,调用mactivitythread.minstrumentation.newapplication方法创建application对象,newapplication采用步骤s102获取的类加载器pathclassloader来加载application类,并调用另一个版本的newapplication。在该方法中,通过上一步加载的主dex文件中的代码创建application类的实例对象,并调用attach方法绑定context,从而完成了application类对象的创建。步骤s104,启动activity。其中,在完成application对象的创建后,回到activitymanagerservice类中的attachapplicationlocked方法中。通过调用mstacksupervisor类对象的attachapplicationlocked方法启动activity。具体启动过程如下:在realstartactivitylocked中,app.thread调用schedulelaunchactivity方法通过binder机制进入到applicationthread类的schedulelaunchactivity方法,发送一个launch_activity的消息到消息队列中,响应于该消息,采用handlelaunchactivity方法完成activity的启动。具体为:handlelaunchactivity方法调用performlaunchactivity方法创建activity对象,其中,在performlaunchactivity方法中,由instrumentation类对象调用newactivity方法创建并返回activity对象。然后调用callactivityoncreate方法启动activity,进行相应的加载和构造view、初始化activity运行所需的对象等,最后完成首页绘制。步骤s105,由绘制好的首页替换之前创建的空白过渡窗口,从而完成了该app的冷启动。在步骤s207中对从dex文件进行异步加载时,与加载主dex文件的过程相同,即在每个线程创建loadedapk对象,调用getclassloader方法创建pathclassloader加载器,由所述pathclassloader加载器来加载从dex文件。具体过程可参考前述对主dex文件加载的说明,在此不再重复说明。在该应用冷启动的流程中只同步加载主dex文件,在加载完所述主dex文件时,再异步加载其他从dex文件。由于主dex文件的内容已经大大减少,因而缩短了加载应用的时间,从而缩短了冷启动时间。为了能够清楚地解释本发明的加载优化过程,本发明结合图1对冷启动过程作了简要说明,该过程仅是简要说明,并省去了部分详细的过程,对于启动过程中不涉及本发明的内容,在此不再过多阐述,本领域的普通技术人员可以参考相关技术指南了解并完成应用的详细启动过程。图3为根据本发明一个实施例的多分包应用冷启动优化装置的原理图。其中,所述装置包括启动模块1、同步加载模块2和异步加载模块3。其中,所述启动模块1用以完成应用的启动流程;如在检测到点击事件时,打开空白窗口,创建新的app进程和主线程activitythread。在加载了主dex文件后绑定app进程和application、创建application对象并启动activity,首页绘制并替换之前创建的空白页。所述同步加载模块2接收启动模块1的指令,在应用的启动过程中同步加载主dex文件。在加载完所述主dex文件后,启动模块1继续其启动流程,同时,在加载完所述主dex文件后触发所述异步加载模块3,用于异步加载其他的从dex文件。其中,所述异步加载模块3根据从dex文件的数量开启相应数据的工作线程,每一个工作线程完成一个从dex文件的加载。在一个实施例中,所述系统还包括dex文件识别模块4,在应用的启动过程中,在加载主dex文件之前,通过查询加载器中的element数组,根据预置主、从dex文件标识从所述element数组中确定主、从dex文件及其路径。在apk编译分包过程,为主、从dex文件设置了相应的标识,例如,将文件名中没有数字的为主dex文件,有数字的为从dex文件;或者又例如,按照数字从小到大依次为dex文件命名,其中数字最小的为dex文件。dex文件识别模块4按照编译时设置的标识来识别主、从dex文件。在识别出来后,将主dex文件的文件名及其路径发送给同步加载模块2,将从dex文件的文件名及其路径发送给异步加载模块3。同步加载模块2和异步加载模块3根据得到的dex文件的文件名及其路径分别在加载条件满足时进行加载。在另一个实施例中,所述系统还包括优化模块5,用以在dex文件没有优化时对其进行优化。当dex文件在该app安装时已被优化,则其优化文件odex文件一般存放在/data/dalvik-cache目录。如果同步加载模块2和异步加载模块3要加载的dex文件为该目录中的优化文件,则直接进行加载。如果要加载的不是odex文件,则由所述优化模块5利用优化工具dexopt对其进行优化,并存到/data/dalvik-cache目录中。其中,根据终端设备上dalvik虚拟机的版本、framework库等的不同,优化工具dexopt的优化过程及结果略有不同。本领域技术人员可根据终端实际情况采用相应的优化过程,在此不再赘述。在一些实施例中,所述系统还包括加速模块(未示出),其能够从网络上加载部分从dex文件。网络上的dex文件的地址也记录在索引文件中。系统评估加载从dex文件的时间。如果时间长度超过预定时间,则将部分从dex文件更改为从网络获取,从而进一步加速加载应用,减少冷启动的时间。本发明应用冷启动的流程中只同步加载主dex文件,在加载完所述主dex文件后再异步加载其他从dex文件;因而缩短了加载应用的时间,减少了冷启动时间,提高了用户的使用体验。上述实施例仅供说明本发明之用,而并非是对本发明的限制,有关
技术领域
:的普通技术人员,在不脱离本发明范围的情况下,还可以做出各种变化和变型,因此,所有等同的技术方案也应属于本发明公开的范畴。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1