应用启动的一般流程
应用的启动,从桌面点击应用图标到主界面用户可操作,大致遵循下面的流程:
可以看到应用启动过程中,最重要的两个进程就是 SystemServer 和 App Process . 其职责划分如下:
- SystemServer 负责应用的启动流程调度、进程的创建和管理、窗口的创建和管理(StartingWindow 和 AppWindow) 等
- 应用进程被 SystemServer 创建后,进行一系列的进程初始化、组件初始化(Activity、Service、ContentProvider、Broadcast)、主界面的构建、内容填充等
冷启动和热启动
这里还需要引入冷启动和热启动的概念,这也是我们经常会碰到的两个概念
- 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,然后再根据启动的参数,启动对应的进程组件,这个启动方式就是冷启动
- 热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动对应的进程组件,这个方式叫热启动
启动速度的测量
各家应该都有自己的方案,关键在于如何定义启动结束的点,这个也是一直困扰我的一个地方,有的应用很好定义,有的应用则因为比较复杂,无法直接衡量启动速度。像 adb 这种方法自己玩玩可以,生产环境没啥用;录屏本身就有性能损耗…
这里我建议大家学习历时1年,上百万行代码!首次揭秘手淘全链路性能优化(上)中提到的测量方法:自动化、稳定、持续集成
通过OCR提取图片中的文字信息作为关键特征。该算法的优势:1. 在于应用页面上基本都是有文字的, OCR也可以识别到图片上的文字, 文字出现则图片加载完成, 和用户体感是一致的;2. 文字作为特征,过滤掉了很多图片特征可能带来的噪声, 减少了算法调试的工作量;另外阿里集团内有非常成熟和优秀的OCR服务——读光,文档识别率超过99.7%, 使用水滴平台封装的OCR服务,可以快速接入和使用。最终的识别方案就是基于OCR识别来进行的
App 优化
启动窗口优化
启动窗口,也叫启动页、SplashWindow、StartingWindow 等,指的是应用启动时候的预览窗口。iOS App 强制有一个启动页,用户点击桌面 App 图标之后,系统会立即显示这个启动窗口,等 App 主页加载好之后再显示主页面。Android 也有类似的机制 (启动窗口这个是 Android 系统提供的),但是也提供了一个接口,让应用开发者设置是否显示这个启动窗口(默认是显示),部分开发者会把这个系统提供的启动窗口禁掉,启动自己的窗口。
但是启动自己的窗口需要的时间要比直接显示系统的启动窗口所花的时间要长,这就会导致用户在使用的时候,点击图标启动 App 的时候,有一定的延迟,表现在点击图标过了一段时间才进行窗口动画进入 App,我们要尽量避免这种情况
- 不要禁止系统默认的启动窗口:即不要在主题里面设置 android:windowDisablePreview 为 true
- 自己定制启动窗口的内容,比如将启动页主题背景设置成闪屏页图片,或者尽量使闪屏页面的主题和主页一致。可以参考知乎、抖音的做法
- 合并闪屏和主页面的 Activity :微信的做法,不过由于微信设置了 android:windowDisablePreview , 且他在各个厂商的白名单里面,一般不会被杀,冷启动的机会比较少。不过也是一个可以思考的地方
线程优化
线程优化主要是减少 CPU 调度带来的波动