一、启动流程的内部机制
1.点击app应用图标,通过binder发送到system_server进程
2.system_server调用Process.start() 收集 uid、gid 等参数信息,通过socket发送给Zygote进程请求创建新进程
3.Zygote进程收到请求后,调用 ZygoteInit.main() 方法进行 runSelectLoop() 循环体内,当有客户端连接时执行 ZygoteConnection.runOnce() 方法,再经过层层调用后 fork 出新的应用进程。
4.开始启动应用,应用的启动流程主要分为三步:启动主线程,创建 Application,创建 MainActivity
5.ActivityThread调用main方法,进行初始化,创建主进程handler,开启looper信息轮训,通过bindApplication方法进行Application创建和初始化,执行Application的生命周期
6.通过主线程 Handler,在主线程中执行 Activity 的创建和启动,执行LifeCycle结束之后,执行到ViewRootImpl,开始页面的真正绘制。
二、确定应用冷启动的开始时间和结束时间
1.开始时间:定位Application的attachBaseContext,应用进程的第一个生命周期,最早的预加载时机。
2.结束时间:页面上的首帧加载完成的时间,即itemView回调perDrawCallback()的时间点作为结束时间。
三、启动时间分析工具
1.Displayed:日志Displayed关键字过滤
2.通过adb shell运行app,查看相应信息
3.reportFullyDrawn:在异步任务完成之后调用activity.reportFullyDrawn()打印系统日志
4.AOP编译插桩技术 埋点
四、具体实用分析工具
1.TraceView:通过在耗时代码前面分别调用Debug.startMethodTracing()与 Debug.stopMethodTracing(),运行应用后,在(SD卡) Android/data/包名/files 目录下找到dmtrace.trace文件,在as中点击分析。
2.CPU Profiler:
(1)在 Android Studio 工具中选择 Run > Edit Configurations 配置界面
(2)在 App 中选择 Profiling,勾选 Start this recording on startup 选项
(3)从菜单中选择 Java/Kotlin Methods Trace
(4)通过选择 Run > Profile,待应用运行起来
(5)在Profiler里面分析。
3.Perfetto技术。
五、可行的实战优化方案
1.视觉优化:在启动页主题中,通过windowBackground设置一个启动背景
2.异步任务优化:启动器
(1)对初始化任务代码 Task 化,启动任务抽象为 Task 类
(2)根据所有任务依赖关系排序生成有向无环图,也就是对所有任务进行有向无环图的拓扑排序算法排序,将并行效率最大化;
(3)多线程按照排序之后的优先级依次执行任务。