Android性能优化(一)App启动原理分析及启动时间优化

主要内容为以下几个问题
  • app启动黑白屏问题产生原因
  • 冷启动,热启动
  • 简单分析源码的启动流程
  • trace分析工具
一,app启动黑白屏问题产生原因
Android性能优化(一)App启动原理分析及启动时间优化

Android性能优化(一)App启动原理分析及启动时间优化

AppTheme的父类的一个属性windowbackground 的颜色为白色或黑色 ,所以会出现黑白屏的情况

二,冷启动,热启动
1 冷启动:当启动应用时,后台没有该应用的进程。
2 热启动:当启动应用时,后台已有该应用的进程。
adb shell ---ps 。 看所有进程,可以看到热启动是没有重新创建进程的。
输入 Display 可以看到某个activity的启动时长,冷启动734毫秒,热启动146毫秒
Android性能优化(一)App启动原理分析及启动时间优化
只有在安卓4.4之后才会打印以上信息,4.4之前的需要命令行形式打印--->
* windows下
adb shell am start com.example.xxx/com.example.xxxx.myapplication 包名加全类名
Android性能优化(一)App启动原理分析及启动时间优化
  • WaitTime 返回从 startActivity 到应用第一帧完全显示这段时间. 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间;
  • ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时;
  • TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用Activity pause的耗时。
开发者一般只要关心 TotalTime 即可,这个时间才是自己应用真正启动的耗时。
二,简单分析源码的启动流程
1,能通过adb命令打印出以上信息是因为 AM命令:
AM命令 在源码framwork包下frameworks\base\cmds\am\src\com\android\commands\am\Am.java
am 这个类是个main函数 是个可执行文件,里面有startactivity方法 ,启动activity,返回result对象,打印这些信息 Windows下打印的启动时间 就是在 result 对象中定义的。
Android性能优化(一)App启动原理分析及启动时间优化
2,下面面类是ActivityRecord中两个个方法,ActivityRecord这个类返回了上面的result
调用windowsDrawnLocked方法表明 。 界面已经被绘制出来了。。。
该方法调用 reportLaunchTimeLocked(SystemClock.uptimeMillis());方法 传入当前时间 把ActivityRecord这个类返回给result,在这里计算时间
Android性能优化(一)App启动原理分析及启动时间优化
app界面里面 其实就是一个app 。 可以通过命令看到当前启动的app----adb shell dumpsys activity activities
手机主页 是一个叫 launcher的 app 源码里可以看到Launcher 这个类是继承自 activity的。
Launcher类中startActivity是开启一个app,这app实际上是一个可以执行的main函数,这个main函数是activityThread,activityThread是app的入口,会分配内存区域
Android性能优化(一)App启动原理分析及启动时间优化

activityThread --attach--->开启app,application,activity 流程如下:

attach方法中mgr.attachAppliction 。
Android性能优化(一)App启动原理分析及启动时间优化

远端进程会回调handleBindApplication,传过来一些应用信息 在handleBindApplication 方法中创建application对象 。 Application app=data.info.makeApplication 接下来 mInstrument.callApplicationCreat(app) 会调用application 的oncreat 方法

Android性能优化(一)App启动原理分析及启动时间优化

以上为启动APP基本流程,如果application'的 oncreat方法里执行的内容太多,时间太长,会影响app的启动时间,所以在application oncreat之前是进程创建等消耗的时间,无法优化,要优化app的启动时间 ,就是在application的oncreat中进行优化的。
所以要通过工具计算 application oncreat 中的东西的耗时时间是多少 ,进行优化。

四,trace分析工具
Android性能优化(一)App启动原理分析及启动时间优化
先说遇到这个问题
1, Caused by: java.lang.RuntimeException: Unable to open trace file 原因是8.0的手机使用外部存储必须要申请权限。
2,adb pull /storage/emulated/0/app1.trace ~/Downloads/ 根本不行 看的安卓书上mac是这么搞得,坑我一个多小时
其实应该是adb pull /storage/emulated/0/app1.trace ,上传后的文件在用户目录下
然后把文件的打开方式用android studio 打开即可
Android性能优化(一)App启动原理分析及启动时间优化
一个长方体块 代表一个方法,它的长度代表他的执行时间,并且若方法套方法,则在该方法下面显示;
下面把main函数中的方法进行了列举
Android性能优化(一)App启动原理分析及启动时间优化
上面一行 代表该方法执行的次数,时间,

通过对比分析,在applicatin的onCreat 方法中 解决耗时长的方法 比如 第三方初始化 ;
1,把耗时内容放入线程中执行
没有操作UI的方法 ;没有创建hander的方法;异步对其没有影响,不会发生空指针等情况;可以放入线程中执行
也可以延迟加载
2,使用懒加载方式,当用到的时候再去加载;使用单利形式 ,初始化网络,图片加载等对象,以后用到就不用再初始化了;
五,解决方法
1,给人感觉上的启动优化
第一种 设置背景透明 ,但是启动有延迟
<item name="android:windowIsTranslucent">true</item>
第二种 设置背景图,可制作一个启动Activity的背景样式的.9图片,但是真正速度没有变化
<item name="android:windowBackground">@drawable/launching11</item>
2,真正的优化 Application,MainActivity 的onCreat 少做耗时操作
Application是程序的主入口,特别是很多第三方SDK都会需要在Application的onCreate里面做很多初始化操作,不得不说,各种第三方SDK,都特别喜欢这个『兵家必争之地』,再加上自己的一些库的初始化,会让整个Application不堪重负。
● 延迟初始化
● 后台任务
● 界面预加载
减少应用启动时的耗时
1、在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取Callable实现。
2、对于sp的初始化,因为sp的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
3、对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。

一些文章
性能优化总结
白屏产生原因
源码分析APP启动流程
一触即发 App启动优化最佳实践
trace文件分析
启动类型,启动时间
启动时间
Android的multidex带来的性能问题