基于Android虚拟机快速提升应用启动性能的方法与流程

文档序号:22544605发布日期:2020-10-17 02:12阅读:168来源:国知局
基于Android虚拟机快速提升应用启动性能的方法与流程

本发明涉及android虚拟机技术领域,特别涉及一种基于android虚拟机快速提升应用启动性能的方法。



背景技术:

android的系统层以及应用都是基于java编写,基于虚拟机编译运行。现有基于android虚拟机的优化采用pgo(profile-guidedoptimization)机制来提升性能时,触发该pgo机制条件苛刻,等待的周期极长,在执行优化时,需要收集全部的profile信息,在漫长的等待周期内,profile信息量变得极大,进一步增长了优化压力与优化耗时,且在优化时极容易因唤醒操作中断优化导致长期无法有效优化,使得用户体验变得更差。



技术实现要素:

本发明旨在至少解决现有技术中存在的技术问题之一。为此,本发明提出一种基于android虚拟机快速提升应用启动性能的方法,能够高频率有效优化应用启动速度。

根据本发明的第一方面实施例的基于android虚拟机快速提升应用启动性能的方法,包括:启动信息收集步骤,android虚拟机在应用进程启动时,通过jit模块收集所述应用进程启动期间的函数及类所产生的启动profile信息;启动编译优化步骤,所述应用进程启动完成,根据所述启动profile信息进行编译优化,生成art镜像代码。

根据本发明实施例的基于android虚拟机快速提升应用启动性能的方法,至少具有如下有益效果:通过收集应用进程启动时的profile信息,根据启动profile信息进行优化编译,生成相应的执行代码,下次启动时,不通过jit模块通过加载该执行代码,加快应用启动速度;采集的数量级小,能在不影响负载的情况下高频率持续有效地提升android虚拟机中应用进程的启动性能,减少用户等待时间。

根据本发明的一些实施例,所述启动信息收集步骤包括:所述andriod虚拟机监测识别所述应用进程的运行状态,检测到所述应用进程切换为启动状态,通过jit模块获取所述应用进程启动期间运行的函数及类,并启动profile线程;根据所述应用进程启动期间运行的函数及类,从profile信息文件中收集得到所述启动profile信息。

根据本发明的一些实施例,所述启动信息收集步骤中还包括:所述andriod虚拟机在收集所述启动profile信息之前,通过设置信息放开启动部分的profile信息收集阈值限制。

根据本发明的一些实施例,所述启动信息收集步骤中还包括:所述启动profile信息被收集后,清除掉所述启动profile信息对应在所述profile信息文件中的数据。

根据本发明的一些实施例,所述启动信息收集步骤中还包括:所述启动profile信息被收集后,在所述andriod虚拟机的runtime中标记所述启动profile信息的收集状态为已完成。

根据本发明的一些实施例,所述启动编译优化步骤包括:所述应用进程启动完成则触发检测线程,所述检测线程判定是否有新收集到所述启动profile信息,得到判断结果;根据判断结果创建编译优化进程,通过dex2oat基于所述启动profile信息进行优化编译,生成art镜像代码。

根据本发明的一些实施例,所述应用进程启动完成则触发检测线程的方法包括:ams触发检测机制,所述检测线程运行在后台包管理服务的消息处理循环队列中;通过所述消息处理循环队列,依次检测所述应用进程是否符合pgo的条件;根据所述启动信息收集状态得到所述判断结果。

根据本发明的一些实施例,所述创建编译优化进程的方法包括:设置dex2oat编译开销线程为-j*,进程调度策略为sp_background,进程优先级为android_priority_lowest。

本发明的附加方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得明显和容易理解,其中:

图1为本发明实施例的主要流程步骤的示意图;

图2为本发明实施例的启动信息收集步骤的示意图;

图3为本发明实施例的启动编译优化步骤的示意图;

图4为本发明实施例在原有pgo机制上增加的新流程示意图。

具体实施方式

下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。

名词解释:

jit:just-in-timecompilation,狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。

ams:activitymanagerservice,android系统的核心服务程序,是android上层框架管理,即应用运行时的管理服务。

pms:,packagemanagerservice,android系统的核心服务程序,是android上层框架管理,即应用程序的安装包管理服务。

pgo:profile-guidedoptimization,android虚拟机提供的一种优化机制。

profile信息:pgo机制中产生的信息,用于优化编译。

dex2oat:android虚拟机提供的一种优化工具。

art镜像:dex2oat生成的.art可执行文件。

参照图1,本发明的实施例中,优化方法包括两部分:启动信息收集步骤及启动编译优化步骤。其中,在启动信息收集步骤中,android虚拟机通过jit模块收集应用进程启动期间的函数及类所产生的profile信息,得到启动profile信息。在启动编译优化步骤中,当应用程序启动完成后,根据在启动信息收集步骤中获得的启动profile信息进行编译优化,生成art镜像代码。

本发明实施例中,启动信息收集步骤参照图2,包括:首先,android虚拟机通过设置信息,放开关于应用程序启动部分的profile信息收集阈值限制。google设计中设定了profile信息收集相关的阈值限制,以便降低减少收集信息,打开该限制有利于获取完整启动相关的profile信息,获得较好的优化效果。应用进程启动时,android虚拟机中会将字节码经jit模块编译运行,参见图4,应用进程app的运行过程包括:启动状态、运行中状态及停止状态。android虚拟机监测识别应用程序的启动状态,通过jit模块获取启动状态时相关的函数(在java中,函数也被称为方法,method)及类,启动profile线程。profile线程将会收集所有的profile信息存入到相应的profile文档中。android虚拟机从profile文档中抽取出在启动状态运行的函数及方法所产生的profile信息,得到启动profile信息。在本发明的实施例中,在收集启动profile信息的过程中,还将原profile文档中被采集的相应profile信息进行清除,防止profile文档合并时影响到启动期间的profile;还包括标记启动profile信息的收集状态为已完成。

本发明的实施例的动编译优化步骤,包括:应用进程启动完成则触发检测线程,由检测线程判定是否有新收集到启动profile信息,得到判断结果;根据判断结果创建编译优化进程,通过dex2oat基于启动profile信息进行优化编译,生成art镜像代码。具体地,应用进行启动完成时由应用管理服务(ams)触发检测机制,检测线程运行在后台包管理服务(pms)的消息处理循环队列中。消息处理循环队列会依次检测当前app是否符合pgo的条件,例如判断目标应用是否可编译、目标应用对应虚拟机的profile信息收集文件primary.prof是否有更新及当前是否有足够的系统存储空间等等,若符合pgo条件则进入下一步(即编译优化动作),否则退出;消息处理循环处理可保证互斥请求。然后,获取启动profile信息的收集状态,若已完成收集,则新建线程去调度虚拟机做特殊编译动作,编译选项包括:设置dex2oat编译开销线程的为-j*,配置特殊的dex2oat进程的调度策略为sp_background(后台运行模式),将进程的优先级设置为android_priority_lowest(最低)。由于编译优化依据仅是单次的startprofile信息,数量级较小,降低调度策略和优先级情况下能保证前台的用户操作不受影响,在负载允许的情况下很快就能编译完成,并生成art镜像代码,下次启动就不用再经jit编译执行,同时可以加载art镜像代码,大量提升启动性能。

参照图4,中间竖虚线左边为pgo的大体流程图,右边为本发明实施例的新增机制。其中,androidapp运行过程包括启动、运行中及停止。运行期间若有需要编译的字节码就会被虚拟机中的jit模块编译执行,此时,编译的目标信息会被profile线程捕获,生成相应的profile文件。在pgo优化编译启动前,上述过程一直重复,迭代整合profile文件中的profile信息。专门用来编译优化的后台调度任务,被调度到的周期为1天,需要在充电状态下并保持idle状态4260秒才能触发,且若在触发后机器唤醒就会被中断,需要等待下一次周期机会;profile信息迭代多,而且是针对所有已经收集过的app,整个编译优化流程会特别耗时,影响当前用户的使用,只能经历漫长的等待才能找到机会来提升性能。在本发明的实施例的新增机制中,android虚拟机中识别当前app运行状态,在启动时就马上启动profile线程收集start期间jit的函数(java中也称方法,method)和类(class)所产生的profile信息,得到启动profile信息。在本发明的实施例中,该启动profile信息会随着应用程序的启动次数变得越来越少,因启动期间的profile信息会立即得到编译优化来提升性能。在本发明的实施例中,收集到的启动profile信息被存放到启动profile文件中,该启动profile信息也在采集过程中从原有的profile文件中清除。完成启动profile信息收集后,在虚拟机runtime中标记启动profile信息的收集状态为已完成,特殊编译流程检测到该状态为已完成,新建线程调度虚拟机做特殊编译。在该特殊编译的编译选项中,设置dex2oat编译开销线程的为-j*,配置特殊的dex2oat进程的调度策略为sp_background(后台运行模式),将进程的优先级设置为android_priority_lowest(最低)。

上面结合附图对本发明实施例作了详细说明,但是本发明不限于上述实施例,在所述技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下作出各种变化。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1