冷启动的流程

U的流程

第一个阶段从点击事件到添加startingwindow

1.System_server 进程中找iq泳道,点击事件会分发到桌面。

2.桌面进程看主线程处理点击执行binder调用,对端是System_server .execeteActivity.

通过异步binder 调用prev_addStartingWindow. 添加启动页窗口。

3.startingwindow绘制一帧后。通过异步binder 触发WMS 大的刷新。

第二阶段 System_server 唤醒 launcher 远程动画流程

1.onTransitionReady 会通过异步binder调用SystemUi子线程执行AIDL::java::ITransitionPlayer::onTransitionReady::server方法。该方法会唤醒SystemUI 里面的wmshell.main线程。该线程通过异步调用桌面的AIDL::java::IRemoteTransition::startAnimation::server.该线程会唤醒桌面UI线程执行远程动画.

第三阶段 执行桌面远程动画 从trace看时间为750ms.

和桌面沟通动画时间太长了进行了修改。原来的适中 760ms ,现在的适中 460ms。原来的增强  570ms,现在的增强  405ms 。动画波动一两帧属于正常范围。

第四阶段移除startingwindow

桌面远程动画的最后一帧会唤醒桌面UIThreadHelper线程,该线程唤醒SystemUI子线程,唤醒systemui中的wmshell.main线程。该线程会唤醒ll.splashscreen 执行MSG_DIE 移除Startingwindow。

第五阶段移除startingwindow 动画

对端 AIDL::java::IWindowSession::remove::server ,移除Startingwindow 会执行一个窗口移除动画。150ms 的透明度从1.0到0.0的动画。因为是透明度变化的动画,不用等到动画结束人眼就可以看到main window的出帧。

也就是说冷启的时间是从iq抬手到移除splashscreen 动画结束前的两帧左右作为冷启的结束点。这个过程的时间做为用户对冷启的感知时间。(startingingwindow 的窗口层级高于应用window )

T的流程和上面的流程有三个差异

1.桌面远程动画的触发。APPTransitionReady 调用桌面子线,该线程调用桌面主线程触发远程动画

2.远程动画时间

3.startingwindow的移除在应用绘制第一帧后触发

1.后面遇到冷启问题看Android App StartUps 泳道 的应用冷启时间小于startingwindow 移除动画的倒数第2帧。将不再是问题。

2.远程动画时间的修改同样会影响热启动和Home键back键侧边手势退出回桌面的时间。

3.上面分析U的trace是StartUps 泳道 的应用冷启时间小于远程动画的时间。应用冷启的时间超过动画的问题目前还没有分析样本。后面遇到再补充

4.T上因为是首帧绘制后移除startingwindow。如果冷启时间很快。会遇到一种情况就是远程动画还未结束就开始移除startingwindow。这样动画时间会有一段重叠。后面遇到再补充。

应用冷启动是指从用户点击应用图标开始,到应用首页完全展示给用户为止的整个过程。冷启动流程通常包括以下几个关键阶段: 1. **系统加载应用进程**:当用户点击应用图标时,系统会检查是否已经存在该应用的进程。如果不存在,则会创建一个新的进程,并加载应用的主类和资源文件。 2. **初始化应用环境**:包括初始化应用的上下文、全局变量、配置信息等。 3. **执行Application的onCreate方法**:在应用进程启动后,系统会调用Application的onCreate方法,用于执行全局的初始化逻辑。 4. **启动主Activity**:系统会启动应用的主Activity,并执行其生命周期方法,包括onCreate、onStart和onResume。 5. **渲染UI**:在Activity的生命周期方法执行完成后,应用的UI会逐步渲染并展示给用户。 冷启动优化的目标是尽可能缩短上述流程的耗时,以提升用户体验。以下是几种常见的优化方法: ### 1. 延迟加载非关键服务或模块 在冷启动阶段,可以将非必须的服务或模块延迟加载到后续的使用阶段。例如,某些全局变量或后台服务可以在应用启动完成后再初始化,从而减少冷启动阶段的耗时 [^2]。 ### 2. 减少主线程的非UI耗时操作 主线程负责处理UI渲染和用户交互,因此应避免在主线程中执行耗时的非UI操作,如复杂的计算或大量的数据解析。可以通过将这些操作移至后台线程来优化冷启动时间 [^1]。 ### 3. 提前发送网络请求 对于需要依赖网络数据的应用,可以在冷启动阶段提前发送网络请求,以便在数据返回后能够快速渲染UI。例如,可以在Application的onCreate方法中发起首页数据的请求 [^1]。 ### 4. 使用本地缓存优化数据加载 为了减少网络请求的等待时间,可以在冷启动阶段优先展示本地缓存的数据,随后通过网络请求刷新数据。例如,可以使用数据库、Preferences、文件或AppStorage等方式存储首页数据 [^4]。 ### 5. 使用性能监控工具 通过性能监控工具(如TraceView)可以测量应用的冷启动时间,并找出潜在的性能瓶颈。例如,在Activity的onResume和onPause方法中添加方法跟踪代码,以分析冷启动过程中的耗时操作 [^3]。 ### 示例代码:使用TraceView监控冷启动时间 ```java @Override protected void onResume() { super.onResume(); Debug.startMethodTracing("startup_trace"); // 开始启动时间监控 } @Override protected void onPause() { super.onPause(); Debug.stopMethodTracing(); // 停止启动时间监控 } ``` ### 6. 分阶段优化 结合应用启动的不同阶段,针对性地进行优化。例如,在系统加载应用进程阶段,可以通过减少初始加载的类和资源文件来缩短耗时;在渲染UI阶段,可以通过优化布局文件和减少不必要的绘制操作来提升性能 [^1]。 通过以上方法,可以有效缩短应用的冷启动时间,从而提升用户体验。然而,需要注意的是,某些优化方案可能会导致其他场景的耗时增加,因此需要在冷启动优化与其他场景性能之间进行权衡 。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值