ViewCapture เป็นเครื่องมือซอฟต์แวร์ที่บันทึกพร็อพเพอร์ตี้ของมุมมอง (เช่น ตำแหน่ง ขนาด สเกล และระดับการมองเห็น) ที่แนบมากับหน้าต่างที่เชื่อมต่อ ViewCapture จะบันทึกข้อมูลเกี่ยวกับมุมมองต่างๆ ภายในกรอบเวลาและพร็อพเพอร์ตี้ของมุมมองเหล่านั้น ซึ่งจะช่วยให้คุณทราบสถานะของประสบการณ์ของผู้ใช้ในช่วงเวลาหนึ่งๆ และติดตามการเปลี่ยนแปลงเมื่อเวลาผ่านไป
การบันทึกหน้าจอสามารถแสดงภาพสถานะของมุมมอง ณ เวลาหนึ่งๆ และแสดงการเปลี่ยนแปลงของมุมมอง แต่ต้องใช้ทรัพยากร CPU จำนวนมากและอาจส่งผลต่อประสิทธิภาพ เครื่องมือ ViewCapture ส่งผลต่อทรัพยากรน้อยกว่าและเปิดใช้ได้บ่อยขึ้น นอกจากนี้ ViewCapture ยังแสดงภาพข้อมูลทีละเฟรมที่ระดับมุมมอง ซึ่งทำให้ตรวจสอบสถานะมุมมองในช่วงเวลาที่ต้องการได้ง่ายขึ้นเมื่อเทียบกับการบันทึกหน้าจอ
หน้านี้จะอธิบายวิธีเริ่มต้นใช้งาน ViewCapture ในแอประบบ
ใช้
ViewCapture.java
ใช้อินสแตนซ์ของ onDrawListener
และรวบรวมการติดตาม ViewCapture ในระหว่างกระบวนการวาด การวาดเฟรมแต่ละเฟรมใหม่จะทริกเกอร์การเรียกใช้ลําดับชั้นของต้นไม้มุมมองโดยเริ่มจากมุมมองรูทของหน้าต่าง
ViewCapture ใช้เมธอด getter View.java
แบบสาธารณะเพื่อดึงข้อมูลและคัดลอกค่าไปยังเธรดแบ็กกราวด์เพื่อปรับปรุงประสิทธิภาพ การติดตั้งใช้งาน ViewCapture จะเพิ่มประสิทธิภาพกระบวนการนี้โดยตรวจสอบว่ามุมมองไม่ถูกต้องหรือไม่ถูกต้องโดยใช้ captureViewTree
เพื่อหลีกเลี่ยงการวนไปยังลําดับชั้นมุมมองทั้งหมด captureViewTree
ใช้ได้กับแอประบบเท่านั้นและเป็นส่วนหนึ่งของ UnsupportedAppUsage API
การใช้ API นี้จํากัดไว้สําหรับแอปตามเวอร์ชัน SDK เป้าหมายของแอป
ข้อจำกัด
ส่วนต่อไปนี้จะอธิบายข้อจำกัดด้านประสิทธิภาพและหน่วยความจำในการเรียกใช้ ViewCapture
ประสิทธิภาพ
ภาระงานโดยเฉลี่ยของเธรดหลักสําหรับประสิทธิภาพ ViewCapture คือ 195 μs อย่างไรก็ตาม ในสถานการณ์ที่เลวร้ายที่สุด อาจใช้เวลาประมาณ 5 มิลลิวินาที โปรดดูส่วน vc#onDraw
ในร่องรอย Perfetto
ค่าใช้จ่ายในการดำเนินงานส่วนใหญ่เกิดจากการดำเนินการต่อไปนี้
- การสํารวจลําดับชั้นใช้เวลา 50 μs แม้จะมีการตัดแต่งแล้วก็ตาม
- การดึงออบเจ็กต์จากผู้จัดสรรรายการว่างเพื่อจัดเก็บสำเนาของพร็อพเพอร์ตี้มุมมองจะใช้เวลา 20 μs
- การดึงค่าพร็อพเพอร์ตี้แต่ละรายการผ่านฟังก์ชัน Get ส่งผลให้มีการเรียกใช้ฟังก์ชันเพิ่มเติมหลายครั้งต่อมุมมอง ซึ่งใช้เวลา 110 μs
ดังนั้น การเปิดใช้ ViewCapture ในโหมดการติดตามที่เปิดอยู่เสมอ (AOT) จะส่งผลเสียต่อประสิทธิภาพของระบบและทำให้เกิดอาการกระตุก แนวทางนี้ยังไม่พร้อมสําหรับ AOT เนื่องจากข้อจํากัดด้านประสิทธิภาพและหน่วยความจํา เราขอแนะนําให้ใช้ ViewCapture สําหรับการแก้ไขข้อบกพร่องในเครื่องและห้องทดลองเท่านั้น
หน่วยความจำ
วิธีการของ Perfetto ในการติดตาม ViewCapture ใช้บัฟเฟอร์แบบวงแหวนเดียวซึ่งมีร่องรอยหน่วยความจำที่กำหนดไว้ล่วงหน้าเพื่อป้องกันการใช้หน่วยความจำมากเกินไป วิธีนี้ช่วยป้องกันการใช้หน่วยความจํามากเกินไปโดยการหลีกเลี่ยงการใช้บัฟเฟอร์แบบวงแหวนแยกต่างหากสําหรับแต่ละหน้าต่าง แต่ไม่ได้แก้ปัญหาการจัดเก็บลําดับชั้นมุมมองทั้งหมดสําหรับทุกสถานะใน Perfetto สําหรับแต่ละเฟรม การบันทึกหน้าต่างเดียว เช่น NexusLauncher สามารถสร้างข้อมูล ViewCapture ได้นานกว่า 30 วินาทีในบัฟเฟอร์ 10 MB อย่างไรก็ตาม การจับภาพหน้าต่างจาก UI ของระบบมากกว่า 30 รายการจำเป็นต้องใช้บัฟเฟอร์ขนาดใหญ่ขึ้นหรือลดระยะเวลาในการบันทึกให้สั้นลงอย่างมาก
วิธีการ
ทำตามวิธีการต่อไปนี้เพื่อเริ่มต้นใช้งาน ViewCapture ในแอประบบ
เพิ่มทรัพยากรที่ต้องการลงในไฟล์
Android.bp
ดังที่แสดงในโค้ด Launcherandroid_library { name: "YourLib", static_libs: [ ... "//frameworks/libs/systemui:view_capture", ... ], platform_apis: true, privileged: true, }
สร้างอินสแตนซ์ ViewCapture เมื่อสร้างหน้าต่าง เช่น
-
private SafeCloseable mViewCapture; @Override protected void onCreate(Bundle savedInstanceState) { ... mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow()); }
-
private SafeCloseable mViewCapture; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (enableViewCaptureTracing()) { mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext()) .startCapture(getRootView(), ".NotificationShadeWindowView"); } ... }
-
ปิดอินสแตนซ์ ViewCapture เมื่อทำลายหน้าต่าง ดังที่แสดงในตัวอย่างต่อไปนี้
-
@Override public void onDestroy() { ... if (mViewCapture != null) mViewCapture.close(); }
-
@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mViewCaptureCloseable != null) { mViewCaptureCloseable.close(); } ... }
-