你真的懂Android App的启动优化吗?

知其然知其所以然

凡是不知道的事情,查文档,肯定能查出个究竟
了解启动时,系统和应用程序发生了什么,以及他们在这些状态下做了什么

App 启动的三种状态

每一种状态都会影响你的App对用户可见的时间

冷启动(冷启动是App从零状态开始的状态,相对于其他的状态,我们应该更注重优化这状态下的启动)

什么是冷启动?

在系统关闭App前提下,设备首次启动

冷启动时,系统做了些什么?
  1. 加载和启动应用程序
  2. 在启动后,显示应用的空白启动窗口
  3. 创建app process
  4. app process 就开始做接下来的部分(见下图)
你真的懂Android App的启动优化吗?_第1张图片
image

热启动(热启动和温启动,是系统把正在运行的App从后台带到前台的状态)

重新启动App,但是这个时候App的Activitys都还存在内存中

温启动

我根据官网的解释,重新进入App,重新调用onCreate()方法就是温启动,然后为什么会调用onCreate,可以认为App数据在内存中被清除了

这里可以先来分析下,根据官网提供的图,注意看,在这个单打独斗的日子,我们改不了系统的源码,我们只能做到我们开发中注意的点,两个onCreate回调方法,我们平时肯定是会用到的,不要在这做太多的耗时,影响DislayTime**

App启动流程分析

我在绍文大神的《Android开发高手课》专栏中看到,其实我们真正的业务不止这么简单,我们可能有闪屏页,广告页,然后到主页,这才是单单的页面展示,里面加载广告,热修复框架,插件话框架,等等

你真的懂Android App的启动优化吗?_第2张图片
邵文大神课里的图

查看启动时间

那么你可以通过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的方法,可以来查看从启动到该页面的时间,根据你项目的需求,比如你有一系列懒加载,导致用户不能点击,那么你可以在懒加载完成之后,调用这个函数,告诉系统,然后可以查看。

image

2019-07-26 14:52:23.990 1151-1485/? I/ActivityManager: Fully drawn com.txt.homecredit/.ui.MainActivity: +1s380ms

当然好的工具也很重要,AS的CPU分析器工具真的至少要会一种,因为很多性能分析,找到思路或者是想找到问题,工具能帮助你如虎添翼,有空我分享下

可能出现的启动问题

1. 点击图标很久都不响应,或出现白屏(黑屏)
我们应用要是没有处理的话,都会出现这个问题,这个问题的解决,网上已经有很多方案,有方案说禁用预览窗口,但是官网说建议还是用设置theme的背景图片方法



    
        
    

2. 首页显示的太慢
现在业务多,启动流程越来越复杂,闪屏广告、热修复框架、插件话框架等等都需要在启动阶段完成,所以会导致部分性能不好的机型出现显示很慢的情况
3. 首页显示后无法操作
这个操作是基于首页显示的太慢做的优化,更多的工作在放在异步来处理,但是导致的弊端,页面展示后,有些数据没有出来,导致白屏,或者用户就无法操作页面。

启动优化

  • Application优化
    在上面冷启动的图,能看出在onCreate()尽量不做耗时工作
  • 闪屏优化
    闪屏优化,就是把预览窗口实现成闪屏的效果,可以用我上面说的这个方法来实现
  • 业务优化
    在启动过程中,我们要知道那些模块一定是要用到的,那些是可以在后面加载的
  • 细节优化
    1. 比如在广告页中,需要展示3秒的图片,在获取图片的时候,如果超过了三秒,就下次再展示(此时可以展示之前的图片或者不展示,展示logo之类),如果在3秒内,就展示这次的图片。
    2. 在上面说到的一定要加载的模块,可以再优化下,是不是可以通过算法,或者其他的方式实现,可优的点(这部分感觉要点能力,哈哈,我跟着绍文大神在学习中)
    3. 线程、GC等等比较让人头大的问题都可以优化

参考在开发的道路上,永远也不会被淘汰的是性能问题,感谢邵文大神

有问题找Google开发文档,准没错

启动优化,需要知道系统从启动到展示页面的逻辑,需要清楚了解我们的应用,业务在启动过程中做了什么,我们大部分能做的优化,就是在我们业务上面,通过更好的实现来优化。

你可能感兴趣的:(你真的懂Android App的启动优化吗?)