原文:https://source.android.com/devices/tech/perf/task-snapshots
介绍
任务快照是Android O中引入的基础架构,它结合了“最近缩略图”的屏幕截图以及窗口管理器中的“已保存的外观”。最近缩略图展示“最近”视图中任务的最后状态。
当活动进入停止状态时,只要该活动位于任务的顶部,Window Manager就不会销毁该活动的外观。如果必须再次显示此活动,则Window Manager可以启动动画而无需等待活动完成绘制其第一帧,因为它可以使用已保存的外观。
架构
“最近缩略图”和“已保存的外观”这两个概念与“任务快照”统一。当任务进入后台时,Window Manager会将此任务的屏幕截图放入GraphicBuffer中。只要任务的顶级活动的应用程序保留在内存中,此GraphicBuffer将保留在内存中。现在,当相同的活动再次出现在前面时,Window Manager将创建一个启动窗口(TaskSnapshotSurface),并附加GraphicBuffer而不复制任何内存到起始窗口的缓冲区队列。一旦活动绘制了第一帧,任务快照启动窗口将像常规启动画面一样平滑淡出。
同样的GraphicBuffer也通过Binder发送到SystemUI,用于在“最近”视图中绘制任务的预览状态。由于这只是对缓冲区的引用,因此通过binder发送它只消耗很少的资源。当GraphicBuffer到达SystemUI时,它被包装到硬件位图中,然后被绘制到屏幕上,而没有任何内存上传到图形内存。
优点
这种新架构有三个主要好处:
- 如果任务快照用作启动窗口,则快照和实际内容之间存在良好的交叉淡入淡出。
- 在SystemUI中绘制任务快照时,不需要进行任何复制。以前必须将位图复制到Ashmem中,然后复制到图形内存中。由于此方法将快照直接存储在图形内存中,因此无需复制。
- 您在“Recents”中看到的状态始终与重新打开应用时首次看到的状态相匹配。在这里使用相同的缓冲区也可以节省大量内存。这就是为什么Recents现在能够以全分辨率显示这些图像的原因。以前,为了节省内存,它被降低采样64%。
实现
此功能完全存在于Android平台中。不需要集成,也不支持自定义。但是,设备制造商可能会完全禁用“任务快照”功能。
要禁用此功能,请修改此功能:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
注意,如果禁用该功能,则“最近”视图不会显示任何缩略图。在低RAM设备上自动禁用此功能。
示例和源码
在TaskSnapshot* 文件中查找此功能的其余代码:
frameworks/base/+/master/services/core/java/com/android/server/wm/