面试Tip:Android优化之APP启动优化
端午节要到啦~提前祝大家端午节快乐!你选择宅着还是出去浪儿浪呢?
app启动类型
1.冷启动
1.应用程序自启动设备以来第一次启动
2.系统杀死应用程序后再重新启动
2.热启动
应用程序所有的activity仍驻留在内存中(后台有应用程序进程),则该应用程序可以避免重复对象初始化,布局inflate和渲染等
应用程序的热启动比冷启动更简单,开销更低
3.温启动
1.用户退出您的应用,又重新启动它, 该过程可能会继续运行,但应用程序必须通过调用onCreate()从头开始重新创建activity
2.系统从内存中逐出您的应用程序(后台无应用程序进程),然后用户重新启动它。该进程和activity需要重新启动,但是可以传递给onCreate()的已保存实例状态。
app冷启动过程
(图片来源官网)
启动过程
1.点击app启动
2.app启动后直接显示空白窗口(基于主题)
3.创建app进程
4.创建app对象
5.启动main thread
6.创建Activity
7.Inflate Views
8.布局布置
9.执行初始绘制
一旦应用程序进程完成第一次绘制,系统进程便会将当前显示的背景窗口换掉,并将其替换为主要activity。
测量启动时间
1.Displayed
在Android 4.4(API级别19)及更高版本中,logcat包含一个包含名为Displayed的值的输出行。
此值表示启动进程和完成在屏幕上相应Activity的绘制之间所经过的时间量。
2.Adb shell
adb [-d|-e|-s <serialNumber>] shell am start -S -W
com.example.app/.MainActivity
-c android.intent.category.LAUNCHER
-a android.intent.action.MAIN
-c -a可选,用来指定<category>和<action>
输出
Starting: Intent
Activity: com.example.app/.MainActivity
ThisTime: 2044
TotalTime: 2044
WaitTime: 2054
Complete
WaitTime:前一个应用 Activity pause 的时间和新应用启动的时间;
ThisTime:最后一个 Activity 的启动耗时;
TotalTime:新进程的启动和 Activity 的启动的耗时;
3.reportFullyDrawn
使用reportFullyDrawn()方法来测量应用程序启动和完成显示所有资源和视图层次结构之间的已用时间。
当您使用此方法时,logcat显示的值是从创建应用程序对象到调用reportFullyDrawn()时所用的时间。
system_process I/ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms
工具
TrackView
TraceView 是 Android SDK 中内置的一个工具,它可以加载 trace 文件,用图形的形式展示代码的执行时间、次数及调用栈
使用方法
1.使用DMS的start method profiling 查看trace信息,停止则再次点击
2.使用代码
Debug.startMethodTracing(“hello”);
Debug.stopMethodTracing();
5.0以及以上机子使用
Debug.startSimpleMethodTracing
执行程序后 打开DMS,File-open file
名称含义:
(图源来自网络侵删)
优化
1.过重的app初始化
application oncreate
(1)去除过重的初始化
(2)延迟加载不必要的初始化
(3)耗时操作使用异步
(4)延迟SharedPreferences初始化
2.过重的Activity初始化
避免
1.inflate大而复杂的布局
2.阻塞磁盘上的屏幕绘图或网络I / O。
3.加载和解码bitmap。
4.栅格化VectorDrawable对象
5.初始化activity的其他子系统(?)
布局方面
1.通过减少冗余或嵌套布局来展平视图层次结构。
2.不要在启动时不需要显示部分UI。可以使用ViewStub占位符, 在适当的时候动态加载。
资源初始化方面
1.开启线程懒加载资源
2.允许展位图显示图片,等图片下载完成后再显示具体图片
参考资料
官网
https://developer.android.com/topic/performance/vitals/launch-time
app启动优化
https://blog.csdn.net/SakuraMashiro/article/details/78986167
https://blog.csdn.net/eclipsexys/article/details/53044990
app启动过程(源码分析)
https://www.jianshu.com/p/a5532ecc8377
app启动时间分析
http://www.androidperformance.com/2015/12/31/How-to-calculation-android-app-lunch-time/
activity启动优化
https://blog.csdn.net/u014700919/article/details/51178877
traceView
https://blog.csdn.net/u011240877/article/details/54347396
------------我是快乐的分割线------------
本人公众号,会不定期更新!
首发公众号,还有些额外的日常漫画哦~
感谢您的喜欢
请多多关注和支持!
❤️