当前位置: 首页 > news >正文

性能优化比拼:app启动流程之冷热启动Activity的SnapshotWindow

背景

前面文章有对冷启动的Splash Window进行了详细的,但是大家是否有想过稳启动时候的是否也需要有类似的Splash Window呢?
答案是肯定的,具体可以通过WinScope或者Perfetto抓取暖启动的过程来验证:

其实桌面的暖启动也会有一个StartingWindow,名字叫做SnapshotStartingWindow,他的启动时间明显比冷启动SplashWindow要快很多,几乎为SplashWindow时间的1/2,可以看到点击后,SnapshotStartingWindow在68ms后就进行了上帧。

再看看冷启动的SplashWindow的时间:

可以看出桌面点击后,要118ms才有Splash window的绘制帧数据。

SnapshotStartingWindow数据是啥?

冷启动时候大家都知道SplashWindow数据就是ICON + 背景色的样子

但是暖启动时候SnapshotStartingWindow显示内容是啥呢?

实际上他显示内容就是类似最近任务一样的,是activity内容的截图
获取方式:
截图文件保存在:

/data/system_ce/<userId>/snapshots/<随机UUID>/<taskId>.jpg /data/system_ce/<userId>/snapshots/<随机UUID>/<taskId>.proto /data/system_ce/<userId>/snapshots/<随机UUID>/<taskId>_reduced.jpg

实战如下:

adb pull /data/system_ce/0/snapshots/09c8fa2d-ff1b-482f-882c-eb1e0b5ca51d/789.jpg /data/system_ce/0/snapshots/09c8fa2d-ff1b-482f-882c-eb1e0b5ca51d/789.jpg:1filepulled,0skipped.19.7MB/s(86913bytesin0.004s)

为什么感知不到SnapshotStartingWindow存在呢?

其实感知不到SnapshotStartingWindow存在就是系统设计这个SnapshotStartingWindow成功的表现,本身就是想让你无感的点击图标后进入到Activity真实内容,但是因为Activity真实内容显示是需要一定时间的,哪怕暖启动。那么在真实Activity绘制前这段时间就需要使用SnapshotStartingWindow来显示,他显示的内容是上一次Activity退出的task截图。

感知不到SnapshotStartingWindow存在其实有2个因素:
1、SnapshotStartingWindow的显示时间非常短暂,可能是100ms左右,相比SplashWindow显示500ms时间短了很多。

2、SnapshotStartingWindow本身就是显示task的截图,所以内容上和Activity的真实显示内容是高度一致的,所以很难感知出他们的变化,除非画面会有大的变化才可能会有跳变感。

整体流程架构总结

system_server (ATMS/WMS) Shell (com.android.wm.shell) ══════════════════════════ ═══════════════════════════════ ActivityRecord.addStartingWindow() │ ├─ getStartingWindowType() │ │ │ ├─ newTask/!processRunning → SPLASH │ └─ taskSwitch + snapshot → SNAPSHOT ← 温启动命中 │ ├─ createSnapshot() │ └─ new SnapshotStartingData(snapshot) │ ├─ StartingSurfaceController │ .createTaskSnapshotSurface() │ └─ TaskOrganizerController .addStartingWindow() ──Binder IPC──▶ TaskSnapshotWindow.create() │ ├─ IWindowSession.addToDisplay() ├─ IWindowSession.relayout() ├─ SnapshotDrawerUtils │ .drawSnapshotOnSurface() │ └─ setBuffer(HardwareBuffer) └─ reportDrawn() ═══════ Snapshot 显示中,App 首帧正在绘制 ═══════ ActivityRecord.onFirstWindowDrawn() │ └─ removeStartingWindow() │ └─ TaskOrganizerController .removeStartingWindow() ──Binder IPC──▶ TaskSnapshotWindow .removeImmediately() └─ IWindowSession.remove()

添加路径:ActivityRecordStartingSurfaceControllerTaskOrganizerController→ Binder →TaskSnapshotWindow

移除路径:ActivityRecord.onFirstWindowDrawn()TaskOrganizerController→ Binder →TaskSnapshotWindow.removeImmediately()

原文地址:
https://mp.weixin.qq.com/s/mtcG-00_KS-NyVs4bL5zEw

更多fw实战干货请关注下面“千里马学框架”

http://www.jsqmd.com/news/1161077/

相关文章:

  • Rocky、Centos linux常用操作
  • 亲身到店探访合肥亨得利官方名表服务中心|服务热线与门店详细地址(2026年7月更新) - 亨得利官方
  • 旗舰手机与平板中的K4F6E3S4HB-MGCL:16Gb LPDDR4内存应用解析
  • IPXWrapper终极指南:让经典游戏在现代Windows系统上重获联机能力
  • (3-2-03)
  • 【Cursor AI实战指南】:5个React组件生成技巧,让开发效率提升300%(2024最新版)
  • Adobe-GenP 3.0:解锁Adobe全家桶的终极补丁工具
  • 亲身到店探访杭州亨得利官方名表服务中心|热线电话及网点地址(2026年7月更新) - 亨得利官方
  • 2026年7月无锡微软售后专业维修服务中心综合指南|地址电话服务项目维保流程全攻略 - 品牌售后
  • (4-1)
  • 如何将微信聊天记录变成个人数字资产:WeChatMsg终极指南
  • 2026 年 7 月最新资讯|万国国内全部官方腕表维修门店完整地址汇总,专属官方服务热线同步全新上线 - 万国官方维修中心
  • 欧米茄中国官方专柜客户服务电话权威信息声明(2026年7月最新) - 欧米茄服务中心
  • 抖音下载器完整指南:5分钟掌握免费批量下载的高效方法
  • 亨得利官方名表服务中心|热线电话及网点地址权威信息通知(2026年7月更新) - 亨得利官方博客
  • 亨得利中国官方售后服务门店|官网认证电话及地址权威公示(2026年7月最新) - 亨得利售后服务官网
  • 积家中国官方售后服务体系全攻略|官方门店地址及客服电话全新公告(2026年7月最新) - 积家中国服务中心
  • 关于增补2026江诗丹顿国内官方售后维修联络公告(新增服务门店与官方咨询专线) - 江诗丹顿官方维修中心
  • 终极解决方案:HugeJsonViewer如何轻松处理1.4GB超大JSON文件
  • Vue 的双向数据绑定原理是什么?
  • (3-2-02)
  • (11-4 -1 )
  • 常用git命令使用
  • 抖音内容创作者的高效工具:douyin-downloader 批量下载解决方案
  • 2026年7月合肥华硕售后设备故障诊断排查手册|常见问题一站式解答 - 品牌售后
  • SH9递归对抗拓扑学(RAT):将认知对抗过程建模为主纤维丛上的动力学(世毫九实验室原创理论)
  • 【AI大模型选型终极指南】:Kimi vs ChatGPT 2024实测对比(响应速度/中文理解/代码能力/长文本处理/幻觉率5维硬核评测)
  • 斧匠烧烤如何
  • (10-3-05-02)
  • 积家中国区官方售后服务中心|官方售后电话及地址权威公告(2026年7月最新) - 积家中国服务中心