关于性能优化:百度-App-启动性能优化实践篇
一、前言启动性能是百度App最外围指标之一。用户心愿利用可能及时响应并疾速加载,启动工夫过长的利用不能满足这个冀望,并且可能会令用户悲观,这种蹩脚的体验可能会导致用户在利用商店针对您的利用给出很低的评分,甚至齐全摈弃您的利用。启动性能的优化成为了体验优化中最要害的一环,百度App在此方向继续投入,一直优化,晋升用户体验。 启动性能优化分为概述篇、工具篇、优化篇和防劣化篇,本篇文章次要论述性能优化相干内容,后期已发表文章能够参阅: 百度App 低端机优化-启动性能优化(概述篇) 百度App Android启动性能优化-工具篇 百度App性能优化工具篇-Thor原理及实际 二、优化实践对启动性能优化的认知,决定了启动性能优化的方向与思路,进而会决定优化的成果。较多开发者对启动过程的认知,来源于Google 开发者文档中有段对启动过程的形容: 1、创立利用对象; 2、启动主线程; 3、创立主 activity; 4、裁减视图; 5、布局屏幕; 6、执行初始绘制。 一旦利用过程实现第一次绘制,零碎过程就会换掉以后显示的后盾窗口,替换为主 activity。此时,用户能够开始应用利用。 下面次要介绍了利用在启动过程中的各个阶段,但其实只是大抵概括,其实启动形式会比拟多,极有可能在不同的启动门路执行的逻辑有差别,因而全门路的认知在优化过程中起到了十分重要的作用,如下图所示: 在启动过程中,点击桌面图标是支流冷启动形式,而Push调起,浏览器调起等端外转化也是比拟常见的调起形式,各种启动形式的启动过程根本可拆解为:过程创立、框架加载、首页渲染、预加载四个环节。而启动性能优化次要面对的不只是点击桌面图标这一种门路,更多的须要启动全门路的优化,达到体验的极致优化。 启动过程也须要联合零碎层面来了解,进而开掘优化点,摸索优化的极限。启动过程是非常复杂的过程,须要较多零碎级过程配合能力实现页面的展示,供用户失常应用,下图展现的点击icon的启动过程: 启动过程大略可概括为: 1、Launcher告诉AMS启动APP的主Activity; 2、ActivityManagerService(以下简称AMS)记录要启动的Activity信息,并且告诉Launcher进入pause状态; 3、Launcher进入pause状态后,告诉AMS曾经paused了,开始启动App; 4、App未开启过,AMS启动新的过程,并且在新过程中创立ActivityThread对象,执行其中的main函数办法; 5、App主线程启动结束后告诉AMS,并传入applicationThread以便通信; 6、AMS告诉App绑定Application并启动MainActivity; 7、启动MainActivitiy,并且创立和关联Context,最初调用onCreate办法,最终实现页面绘制和上屏。 次要过程的性能次要是: 1、Launcher过程:为手机桌面过程,负责接管用户的点击事件,并将事件告诉到AMS 2、SystemServer过程:负责利用的启动流程调度、过程的创立和治理、窗口的创立和治理(StartingWindow 和 AppWindow) 等,比拟外围的服务有AMS和WMS(WindowManagerService); 3、Zygote过程:通过fork创立应用程序过程,Zygote过程在初始化时就会会创立虚拟机,同时把须要的零碎类库和资源文件加载到内存中。而Zygote在fork出子过程后,这个子过程也会失去一个曾经加载好根底资源的虚拟机,从而减速利用过程的启动; 4、SurfaceFlinger过程:次要和利用的渲染相干,如Vsync信号处理、窗口的合成解决、帧缓冲区治理等。 有了全局的认知和视线后,咱们就能够站在更高的角度,更加深刻的思考与剖析性能瓶颈,如手机负载合理性、系统资源应用等等,更加全面的思考启动性能的优化形式,达到对启动性能的极致优化。 三、优化落地百度App的启动性能的优化,大抵分为三局部,惯例优化、根底机制优化和底层技术优化三局部。 3.1 惯例优化如果是业务倒退初期,业务的疾速迭代较快,此时的优化会绝对简略,极有可能会呈现短时间内,启动速度晋升秒级别的优化成果。启动性能的优化,也是基于对冷启动的了解以及启动工作的梳理,达到疾速优化的指标。可通过性能工具,如前文提过的Trace工具、Thor Hook工具,发现耗时较为突出问题,评估是否可通过提早、异步、删除等形式优化,根据投入产出状况评估工作优先级,达到疾速优化启动性能的目标。 随着启动场景承载业务逐渐宏大,手百逐步成长为承载业务最多,体量微小的航母级挪动端利用,宏大业务的预加载不可能齐全去除或者通过异步来解决,此局部是启动性能优化中面临的较大难题,须要有机制批量解决业务预加载问题,因而根底机制中的调度机制逐步衍生进去,解决启动过程不同业务的预加载需要。 3.2 根底机制优化根底机制优化次要分为调度机制优化、根底组件性能优化。 3.2.1 任务调度优化业务多,预加载工作的执行诉求各有不同,均衡启动性能和业务预加载,百度App需建设任务调度框架,业务方通过接入可疾速优化性能问题。 任务调度整体建设状况如下,目前还处在疾速迭代中: 智能调度能够依据工作输出和信息输出,做出不同的调度反馈,如: 1、个性化调度策略:辨认出业务预加载工作ID和用户行为习惯相匹配,则会将工作提前做初始化,工作优先级会做晋升,与此同时,在用户进入业务对应页面时,非业务相干工作需做避让; 2、分级体验策略:辨认出在指定的机型配置中有对应的调度策略,则会执行对应的调度能力,如立刻调度、提早调度、不调度等,次要用于体验降级; 3、精细化调度策略:在不同的场景精细化调度业务预加载工作,如在闪屏场景,会辨认闪屏相干业务信息并做预加载,在端内查起场景,会辨认落地页所属业务信息并做对应预加载; 4、分优先级提早调度:有较大量的工作初始化会依赖于提早调度,需保障有序管制业务初始化,因而在提早调度根底上增加优先级概念,能够在提早调度中也分优先级调度,让更高优先级工作能够更快的执行; 5、首页UI并行渲染调度:次要服务于冷启动阶段商业闪屏业务,商业闪屏是否须要展示、展示哪个物料均是冷启动阶段的实时网络申请决定的,需在冷启动阶段尽量进步商业网络申请的可用工夫,进而进步网络申请成功率,百度App目前能够实现,首页能够先初始化,但不做上屏,待首页渲染业务提交的时候再查看商业闪屏是否展示,做到了提供给商业网络申请更多可用工夫的同时不阻塞首页初始化,通过此项技术大幅晋升商业网络申请的成功率,带来了商业支出的晋升。 因为调度器框架中波及细节十分多,在这里只简略介绍其中一种调度器的设计:分级体验调度器。 次要分为3个模块,机型评分、分级配置和分级调度机制,达到不同配置的手机上的最优体验。 机型评分:通过设施信息计算评分信息,称为动态评分;通过性能指标计算评分信息,称为动静评分;根据模型训练评分信息,得出最终机型评分;分级配置:云端配置表:提供各业务级别按设施评分条件下的分级配置表,该表反对动静更新,增量更新,更新后端上及时失效。本地预置表:本地会预置一份配置表,供首次装置时应用;根据机型评分信息和分级配置信息得出控制策略;分级调度:业务方依据机型评分管制不同的业务逻辑,达到高端机全副性能最优体验,中端机局部性能良好体验,低端机外围性能晦涩体验,如首页点赞动画在高端机上抉择开启策略,中端机上抉择提早加载策略,低端机上抉择敞开状态;3.2.2 KV存储优化SharedPreferences是Android平台轻量级的存储类,用来保留应用程序的配置信息,其本质是以“键-值”对的形式保留数据的xml文件,其文件保留在/data/data/pkg/shared\_prefs目录下,长处是以键值对的形式进行存储,使用方便,易于了解;但SharedPreferences的毛病很显著,读写性能慢,IO读写应用xml数据格式,全量更新效率低;多过程反对差,存储数据易失落;创立线程多,导致性能差。 读取性能差 每加载一个SP文件均会创立子线程,源码如下: private final Object mLock = new Object();private boolean mLoaded = false;private void startLoadFromDisk() { synchronized (mLock) { mLoaded = false; } new Thread("SharedPreferencesImpl-load") { public void run() { loadFromDisk(); } }.start();}然而在获取key-value时如果没有加载实现,则会wait期待SP文件加载实现: ...