App启动优化的一篇深度好文

原文地址:

http://www.jianshu.com/p/c056e63dc7a2

正文

对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题,比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编程来说十分重要。

Android在线程方面主要使用的是Java本身的Thread类,我们可以在Thread或Runnable接口中的run方法首句加入Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //设置线程优先级为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理

现场优先级:

  • int THREAD_PRIORITY_AUDIO //标准音乐播放使用的线程优先级

  • int THREAD_PRIORITY_BACKGROUND //标准后台程序

  • int THREAD_PRIORITY_DEFAULT // 默认应用的优先级

  • int THREAD_PRIORITY_DISPLAY //标准显示系统优先级,主要是改善UI的刷新

  • int THREAD_PRIORITY_FOREGROUND //标准前台线程优先级

  • int THREAD_PRIORITY_LESS_FAVORABLE //低于favorable

  • int THREAD_PRIORITY_LOWEST //有效的线程最低的优先级

  • int THREAD_PRIORITY_MORE_FAVORABLE //高于favorable

  • int THREAD_PRIORITY_URGENT_AUDIO //标准较重要音频播放优先级

  • int THREAD_PRIORITY_URGENT_DISPLAY //标准较重要显示优先级,对于输入事件同样适用。

一、工具:adb 或Python

adb计算app启动时间:

adb shell am start -w packagename/activity

三个返回结果ThisTime,TotalTime,WaitTime

  1. WaitTime就是app启动时间:WaitTime=startTime-endTime

  2. startTime:记录的刚准备调用startActivityAndWait()的时间点

  3. endTime:记录的是startActivityAndWait()函数调用返回的时间点

ThisTime、TotalTime 的计算在 frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java 文件的 reportLaunchTimeLocked() 函数中。

curTime表示该函数调用的时间点.

displayStartTime表示一连串启动Activity中的最后一个Activity的启动时间点.

mLaunchStartTime表示一连串启动Activity中第一个Activity的启动时间点.

displayStartTime和mLaunchStartTime的区别:分两种情

第一种情况

正常情况下点击桌面图标只启动一个有界面的 Activity,此时 displayStartTime 与mLaunchStartTime 便指向同一时间点,此时 ThisTime=TotalTime。

第二种情况

另一种情况是点击桌面图标应用会先启动一个无界面的 Activity 做逻辑处理(如占位界面),接着又启动一个有界面的Activity,在这种启动一连串 Activity 的情况下(知乎的启动就是属于这种情况),displayStartTime 便指向最后一个 Activity 的开始启动时间点,mLaunchStartTime 指向第一个无界面Activity的开始启动时间点,此时 ThisTime!=TotalTime。 这两种情况如下图:

如果只关心某个应用自身启动耗时,参考TotalTime;如果关心系统启动应用耗时,参考WaitTime;如果关心应用有界面Activity启动耗时,参考ThisTime。

二、热启动

如果是你按Back键,并没有将应用进程杀掉的话,那么执行上述命令就会快一些,因为不用创建进程了,只需要启动一个Activity即可。这也就是我们说的应用热启动。

游戏启动的话,就不适用用命令行的方法来启动了,因为从用户点击桌面图标到登录界面,既有系统的部分也有游戏自己的部分。

系统部分:游戏也有一个 Activity,所以启动的时候还是会去启动这个 Activity,所以系统启动部分也就是用户点击桌面桌面响应到这个Activity启动。

游戏部分:一般游戏的主 Activity 启动后,还会做一些比较耗时的事情,这时候你看到的界面是不能操作的,比如:加载游戏数据、联网更新数据、读取和更新配置文件、游戏引擎初始化等操作。从游戏开发的角度来看,到了真正用户能操作的界面才算是一个游戏真正加载完成的时间。

那么这个时间,就得使用 Log 来记录了,因为加载游戏数据、联网更新数据、读取和更新配置文件、游戏引擎初始化这些操作,都是游戏自己的逻辑,与系统无关,所以得由游戏自己定义加载完成的点。

对于游戏的启动时间,我们更倾向于计算从点击桌面图标到用户可以与游戏进行交互这个时间段作为一个游戏的启动时间

三、冷启动

应用不在后台时第一次启动,系统和App本身都有更多的工作要从头开始!

应用在冷启动之前,要执行三个任务:

  • 加载启动App;

  • App启动之后立即展示出一个空白的Window;

  • 创建App的进程;

而这三个任务执行完毕之后会马上执行以下任务:

创建App对象;

启动Main Thread;

创建启动的Activity对象;

加载View;

布置屏幕;

进行第一次绘制;

而一旦App进程完成了第一次绘制,系统进程就会用Main Activity替换已经展示的Background Window,此时用户就可以使用App了。

总结

作为普通应用,App进程的创建等环节我们是无法主动控制的,可以优化的也就是Application、Activity创建以及回调等过程。

同样,Google也给出了启动加速的方向:

1、利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;

2、避免在启动时做密集沉重的初始化(Heavy app initialization);

3、定位问题:避免I/O操作、反序列化、网络操作、布局嵌套等。

备注:

方向1 属于治标不治本,只是表面上快;

方向2、3可以真实的加快启动速度。

接下来我们就在项目中实际应用。

Android 系统性能优化(72)-----App启动优化相关推荐

  1. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

  2. 实测 性能优化之——App启动优化

    当你看到爱奇艺,支付宝等大厂APP点击图标秒开的时候,感觉产品体验非常棒,纵享丝滑,回头再看看自己的APP,先白屏晾你一会,顿时是不是感觉心里不爽了:为啥别人的产品那么效果那么好呢(千万不要找借口说人 ...

  3. Android性能优化(一):APP启动优化

    Android性能优化(一):APP启动优化 性能优化系列文章: Android性能优化(一):APP启动优化 Android性能优化(二):UI布局优化 Android性能优化(三):响应优化 An ...

  4. Android App启动优化

    一:启动优化 1. 启动状态 应用有三种启动状态,冷启动.温启动与热启动:每种启动状态都会影响该应用向用户显示所需的时间. 在冷启动中,应用从头开始启动. 在另外两种状态中,系统需要将后台运行的应用带 ...

  5. 【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )

    文章目录 一. 界面启动时间 二. 启动优化项目 三. 方法追踪 一. 界面启动时间 在 [Android 性能优化]应用启动优化 ( 启动白屏问题 | 应用启动时间测量 | 冷启动 | 热启动 | ...

  6. App启动优化-一顿操作猛如虎

    前言 ++一个应用App的启动速度能够影响用户的首次体验,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在应用商店针对您的应 ...

  7. [纸上谈兵 1]——App启动优化

    0 纸上谈兵--App启动优化 纸上谈兵系列是我在学习App性能优化的笔记,纸上谈兵这个名字就很好的反应了这次只是启动优化的学习,并没有真正用到实际App的开发过程中(以后专门的同时处理),闲话少说, ...

  8. 【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★

    文章目录 一. 常用的耗时方法优化方案 ( 重要 ) 二. 源码分析梳理 1. 应用启动时间计算相关源码分析 2. Launcher 应用中启动 Android 应用流程 三. 启动白屏解决方案 An ...

  9. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )

    文章目录 一. Launcher 应用 startActivitySafely 方法分析 二. Launcher 中的 startActivity(View v, Intent intent, Obj ...

最新文章

  1. 简单介绍一下R中的几种统计分布及常用模型
  2. C#的UInt64.MaxValue和C语言的0xffffffffffffffc5ull
  3. 华为服务器面板显示,服务器面板怎么查看
  4. Akka的好用例[关闭]
  5. 未来,大脑扫描背包将神经科学带入现实世界
  6. KSQL和Flink SQL的比较
  7. SpringBoot Mybatis EnumTypeHandler自定义统一处理器
  8. 具有Akka反应流的反应队列
  9. 运营管理整改报告范文_整改报告 反馈问题整改报告范文精选5篇
  10. 清华大学霸榜计算机学科第一!2022 USNews世界大学排名出炉,计算机前50中国占19个...
  11. shell命令一览表
  12. 键盘上那个字母代表w ndows,电脑键盘上各个键位作用
  13. 5大免费使用的在线客服系统盘点
  14. 在C语言中怎样定义一个字符串并输入输出
  15. VMware Workstation pro无法在Windows上运行,检查可在Windows上运行的此应用的更新版本(无需卸载原先版本或原先版本卸载的按钮变成灰色)
  16. 广东省污水处理厂数字孪生平台建模_三维可视化平台_吉优赛维数字孪生_三维激光扫描_BIM建模
  17. CV_shortcomings of original GAN
  18. word自带公式编辑_Word公式编辑器下载_Word公式编辑器官方下载-太平洋下载中心...
  19. 将cooledit作为一个音频信号发生器(http://www.zsjys.net/JYJY/ShowArticle.asp?ArticleID=64)
  20. NLP基础知识之语音识别

热门文章

  1. 数字图像处理(作业四)——边缘表达
  2. Nginx基本数据结构之ngx_array_t
  3. C++ - 深入理解new
  4. 嵌入式Linux系统编程学习之八基于文件指针的文件操作
  5. JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)
  6. Java多线程(十):BlockingQueue实现生产者消费者模型
  7. mysql - 索引_07
  8. 十进制与二进制之间的转换
  9. Toast 使用方法大全
  10. Android中动态获取Drawable中的图片