ภาพรวมงาน

สแนปชอตงานเป็นโครงสร้างพื้นฐานที่เปิดตัวใน Android 8.0 ซึ่งรวมภาพหน้าจอสำหรับ ภาพปกของแอปที่ใช้ล่าสุด รวมถึง พื้นผิวที่บันทึกไว้จากตัวจัดการหน้าต่าง ภาพปกของแอปที่ใช้ล่าสุดแสดงสถานะล่าสุดของงานในมุมมองแอปที่ใช้ล่าสุด

เมื่อกิจกรรมเข้าสู่สถานะหยุด ตัวจัดการหน้าต่างจะไม่ทำลายพื้นผิวของกิจกรรมตราบใดที่กิจกรรมนั้นอยู่ด้านบนสุดของงาน หากต้องแสดงกิจกรรมนี้อีกครั้ง ตัวจัดการหน้าต่างจะเริ่มภาพเคลื่อนไหวได้โดยไม่ต้องรอให้กิจกรรมวาดเฟรมแรกเสร็จ เนื่องจากสามารถใช้พื้นผิวที่บันทึกไว้นี้ได้

สถาปัตยกรรม

แนวคิด 2 อย่างของภาพปกของแอปที่ใช้ล่าสุดและพื้นผิวที่บันทึกไว้จะรวมกันเป็นสแนปชอตงาน เมื่อมีการย้ายงานไปทำงานเบื้องหลัง ตัวจัดการหน้าต่างจะวางภาพหน้าจอของงานนี้ลงใน GraphicBuffer ตราบใดที่แอปของกิจกรรมด้านบนสุดของงานยังคงอยู่ในหน่วยความจำ GraphicBuffer นี้จะยังคงอยู่ในหน่วยความจำ ตอนนี้ เมื่อมีการนำกิจกรรมเดียวกันกลับมาแสดงด้านหน้าอีกครั้ง ตัวจัดการหน้าต่างจะสร้างหน้าต่างเริ่มต้น (TaskSnapshotSurface) และแนบ GraphicBuffer โดยไม่ต้องคัดลอกหน่วยความจำใดๆ ไปยังคิวบัฟเฟอร์ของหน้าต่างเริ่มต้น ทันทีที่กิจกรรมวาดเฟรมแรกเสร็จ หน้าต่างเริ่มต้นของสแนปชอตงานจะจางหายไปอย่างราบรื่นเหมือนกับหน้าจอเริ่มต้นทั่วไป

นอกจากนี้ ระบบยังส่ง GraphicBuffer เดียวกันผ่าน Binder ไปยัง SystemUI เพื่อใช้ในการวาดสถานะการแสดงตัวอย่างของงานในมุมมองแอปที่ใช้ล่าสุด เนื่องจากเป็นเพียงการอ้างอิงบัฟเฟอร์ การส่งผ่าน Binder จึงใช้ทรัพยากรเพียงเล็กน้อย เมื่อ GraphicBuffer มาถึง SystemUI ระบบจะห่อหุ้มบัฟเฟอร์นั้นไว้ใน Bitmap ของฮาร์ดแวร์ แล้ววาดลงบนหน้าจอโดยไม่ต้องอัปโหลดหน่วยความจำไปยังหน่วยความจำกราฟิก

สิทธิประโยชน์

สถาปัตยกรรมใหม่นี้มีสิทธิประโยชน์หลัก 3 ประการ ได้แก่

  • หากใช้สแนปชอตงานเป็นหน้าต่างเริ่มต้น จะมีการเฟดข้ามที่สวยงามระหว่างสแนปชอตกับเนื้อหาจริง
  • เมื่อวาดสแนปชอตงานใน SystemUI ก็สามารถทำได้โดยไม่ต้องคัดลอก ก่อนหน้านี้ต้องคัดลอกบิตแมปลงใน Ashmem แล้วจึงคัดลอกลงในหน่วยความจำกราฟิก เนื่องจากวิธีนี้จะจัดเก็บสแนปชอตในหน่วยความจำกราฟิกโดยตรง จึงไม่จำเป็นต้องคัดลอก
  • สถานะที่คุณเห็นในแอปที่ใช้ล่าสุดจะตรงกับสถานะแรกที่คุณเห็นเมื่อเปิดแอปอีกครั้ง การมีบัฟเฟอร์เดียวกันที่นี่จะช่วยประหยัดหน่วยความจำได้มาก ด้วยเหตุนี้ ตอนนี้แอปที่ใช้ล่าสุดจึงสามารถแสดงรูปภาพเหล่านี้ด้วยความละเอียดเต็มได้ ก่อนหน้านี้ระบบจะลดขนาดลง 64% เพื่อประหยัดหน่วยความจำ

การใช้งาน

ฟีเจอร์นี้มีอยู่ในแพลตฟอร์ม Android ทั้งหมด ไม่จำเป็นต้องผสานรวม และระบบไม่รองรับการปรับแต่ง อย่างไรก็ตาม ผู้ผลิตอุปกรณ์สามารถปิดใช้ฟีเจอร์สแนปชอตงานทั้งหมดได้

หากต้องการปิดใช้ฟีเจอร์นี้ ให้แก้ไขฟังก์ชันนี้

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

โปรดทราบว่าหากปิดใช้ฟีเจอร์นี้ มุมมองแอปที่ใช้ล่าสุดจะไม่แสดงภาพปกใดๆ เลย

สแนปชอตความละเอียดสูงและความละเอียดต่ำ

ระบบจะเขียนสแนปชอตงานลงในดิสก์ด้วย 2 สเกล เมื่อกู้คืนสแนปชอตงานจากดิสก์ ระบบจะอ่านสแนปชอตความละเอียดต่ำก่อน แล้วจึงแทนที่ด้วยสแนปชอตความละเอียดสูง การเพิ่มประสิทธิภาพนี้จะช่วยลดเวลาในการโหลดรูปภาพ มิฉะนั้นอาจเกิดความล่าช้าเล็กน้อยเมื่ออ่านไฟล์สแนปชอตจากดิสก์ และผู้ใช้จะเห็นการ์ดงานว่างเปล่าจนกว่ารูปภาพจะพร้อมใช้งาน คุณสามารถกำหนดค่าสเกลได้ในไฟล์กำหนดค่าการวางซ้อนของอุปกรณ์ overlay/frameworks/base/core/res/res/values/config.xml โดยตั้งค่า config_highResTaskSnapshotScale และ config_lowResTaskSnapshotScale โดยค่าเริ่มต้น ระบบจะตั้งค่าเหล่านี้เป็น 1.0 และ 0.5 ตามลำดับ หากต้องการปิดใช้สแนปชอตความละเอียดต่ำ ให้ตั้งค่า config_lowResTaskSnapshotScale เป็น 0.0

ตัวอย่างและแหล่งที่มา

ดูโค้ดที่เหลือสำหรับฟีเจอร์นี้ได้ในไฟล์ TaskSnapshot* ในตำแหน่งต่อไปนี้

frameworks/base/+/android17-release/services/core/java/com/android/server/wm/