知其然知其所以然
凡是不知道的事情,查文档,肯定能查出个究竟
了解启动时,系统和应用程序发生了什么,以及他们在这些状态下做了什么
App 启动的三种状态
每一种状态都会影响你的App对用户可见的时间
冷启动(冷启动是App从零状态开始的状态,相对于其他的状态,我们应该更注重优化这状态下的启动)
什么是冷启动?
在系统关闭App前提下,设备首次启动
冷启动时,系统做了些什么?
- 加载和启动应用程序
- 在启动后,显示应用的空白启动窗口
- 创建app process
- app process 就开始做接下来的部分(见下图)
热启动(热启动和温启动,是系统把正在运行的App从后台带到前台的状态)
重新启动App,但是这个时候App的Activitys都还存在内存中
温启动
我根据官网的解释,重新进入App,重新调用onCreate()方法就是温启动,然后为什么会调用onCreate,可以认为App数据在内存中被清除了
这里可以先来分析下,根据官网提供的图,注意看,在这个单打独斗的日子,我们改不了系统的源码,我们只能做到我们开发中注意的点,<u>两个onCreate回调方法</u>,我们平时肯定是会用到的,不要在这做太多的耗时,影响DislayTime**
App启动流程分析
我在绍文大神的《Android开发高手课》专栏中看到,其实我们真正的业务不止这么简单,我们可能有闪屏页,广告页,然后到主页,这才是单单的页面展示,里面加载广告,热修复框架,插件话框架,等等
查看启动时间
那么你可以通过logcat中Displayed,来查看你应用到某个页面的时间
2019-07-26 14:36:40.016 1151-1188/? I/ActivityManager: Displayed com.txt.demo/DemoActivity: +847ms (total +2s405ms)
或者通过adb的命令行来查看
adb shell am start -S -W com.txt.demo/DemoActivity
Stopping: com.txt.demo
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.txt.demo/DemoActivity }
Status: ok
Activity: com.txt.demo/DemoActivity
ThisTime: 405
TotalTime: 908
WaitTime: 939
Complete
你还可以通过调用reportFullyDrawn()这是Activity的方法,可以来查看从启动到该页面的时间,根据你项目的需求,比如你有一系列懒加载,导致用户不能点击,那么你可以在懒加载完成之后,调用这个函数,告诉系统,然后可以查看。
2019-07-26 14:52:23.990 1151-1485/? I/ActivityManager: Fully drawn com.txt.homecredit/.ui.MainActivity: +1s380ms
当然好的工具也很重要,AS的CPU分析器工具真的至少要会一种,因为很多性能分析,找到思路或者是想找到问题,工具能帮助你如虎添翼,有空我分享下
可能出现的启动问题
1. 点击图标很久都不响应,或出现白屏(黑屏)
我们应用要是没有处理的话,都会出现这个问题,这个问题的解决,网上已经有很多方案,有方案说禁用预览窗口,但是官网说建议还是用设置theme的背景图片方法
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@mipmap/app_bg"
android:gravity="fill"/>
</item>
</layer-list>
2. 首页显示的太慢
现在业务多,启动流程越来越复杂,闪屏广告、热修复框架、插件话框架等等都需要在启动阶段完成,所以会导致部分性能不好的机型出现显示很慢的情况
3. 首页显示后无法操作
这个操作是基于首页显示的太慢做的优化,更多的工作在放在异步来处理,但是导致的弊端,页面展示后,有些数据没有出来,导致白屏,或者用户就无法操作页面。
启动优化
-
Application优化
在上面冷启动的图,能看出在onCreate()尽量不做耗时工作 -
闪屏优化
闪屏优化,就是把预览窗口实现成闪屏的效果,可以用我上面说的这个方法来实现 -
业务优化
在启动过程中,我们要知道那些模块一定是要用到的,那些是可以在后面加载的 -
细节优化
- 比如在广告页中,需要展示3秒的图片,在获取图片的时候,如果超过了三秒,就下次再展示(此时可以展示之前的图片或者不展示,展示logo之类),如果在3秒内,就展示这次的图片。
- 在上面说到的一定要加载的模块,可以再优化下,是不是可以通过算法,或者其他的方式实现,可优的点(这部分感觉要点能力,哈哈,我跟着绍文大神在学习中)
- 线程、GC等等比较让人头大的问题都可以优化
参考在开发的道路上,永远也不会被淘汰的是性能问题,感谢邵文大神
启动优化,需要知道系统从启动到展示页面的逻辑,需要清楚了解我们的应用,业务在启动过程中做了什么,我们大部分能做的优化,就是在我们业务上面,通过更好的实现来优化。