ViewCapture ในแอประบบ

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

ค่าใช้จ่ายในการดำเนินงานส่วนใหญ่เกิดจากการดำเนินการต่อไปนี้

  1. การสํารวจลําดับชั้นใช้เวลา 50 μs แม้จะมีการตัดแต่งแล้วก็ตาม
  2. การดึงออบเจ็กต์จากผู้จัดสรรรายการว่างเพื่อจัดเก็บสำเนาของพร็อพเพอร์ตี้มุมมองจะใช้เวลา 20 μs
  3. การดึงค่าพร็อพเพอร์ตี้แต่ละรายการผ่านฟังก์ชัน Get ส่งผลให้มีการเรียกใช้ฟังก์ชันเพิ่มเติมหลายครั้งต่อมุมมอง ซึ่งใช้เวลา 110 μs

ดังนั้น การเปิดใช้ ViewCapture ในโหมดการติดตามที่เปิดอยู่เสมอ (AOT) จะส่งผลเสียต่อประสิทธิภาพของระบบและทำให้เกิดอาการกระตุก แนวทางนี้ยังไม่พร้อมสําหรับ AOT เนื่องจากข้อจํากัดด้านประสิทธิภาพและหน่วยความจํา เราขอแนะนําให้ใช้ ViewCapture สําหรับการแก้ไขข้อบกพร่องในเครื่องและห้องทดลองเท่านั้น

หน่วยความจำ

วิธีการของ Perfetto ในการติดตาม ViewCapture ใช้บัฟเฟอร์แบบวงแหวนเดียวซึ่งมีร่องรอยหน่วยความจำที่กำหนดไว้ล่วงหน้าเพื่อป้องกันการใช้หน่วยความจำมากเกินไป วิธีนี้ช่วยป้องกันการใช้หน่วยความจํามากเกินไปโดยการหลีกเลี่ยงการใช้บัฟเฟอร์แบบวงแหวนแยกต่างหากสําหรับแต่ละหน้าต่าง แต่ไม่ได้แก้ปัญหาการจัดเก็บลําดับชั้นมุมมองทั้งหมดสําหรับทุกสถานะใน Perfetto สําหรับแต่ละเฟรม การบันทึกหน้าต่างเดียว เช่น NexusLauncher สามารถสร้างข้อมูล ViewCapture ได้นานกว่า 30 วินาทีในบัฟเฟอร์ 10 MB อย่างไรก็ตาม การจับภาพหน้าต่างจาก UI ของระบบมากกว่า 30 รายการจำเป็นต้องใช้บัฟเฟอร์ขนาดใหญ่ขึ้นหรือลดระยะเวลาในการบันทึกให้สั้นลงอย่างมาก

วิธีการ

ทำตามวิธีการต่อไปนี้เพื่อเริ่มต้นใช้งาน ViewCapture ในแอประบบ

  1. เพิ่มทรัพยากรที่ต้องการลงในไฟล์ Android.bp ดังที่แสดงในโค้ด Launcher

    android_library {
        name: "YourLib",
        static_libs: [
              ...
            "//frameworks/libs/systemui:view_capture",
              ...
        ],
        platform_apis: true,
        privileged: true,
    }
    
  2. สร้างอินสแตนซ์ ViewCapture เมื่อสร้างหน้าต่าง เช่น

    • ตัวอย่างที่ 1

      private SafeCloseable mViewCapture;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow());
      }
      
    • ตัวอย่างที่ 2

      private SafeCloseable mViewCapture;
      
      @Override
      protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (enableViewCaptureTracing()) {
            mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext())
              .startCapture(getRootView(), ".NotificationShadeWindowView");
        }
        ...
      }
      
  3. ปิดอินสแตนซ์ ViewCapture เมื่อทำลายหน้าต่าง ดังที่แสดงในตัวอย่างต่อไปนี้