ผู้จัดการหน้าต่าง

WindowManager dumps ให้ภาพรวมของ WindowManager ณ เวลาหนึ่งๆ ร่องรอยของ WindowManager แสดงลำดับสถานะตามลำดับเวลาซึ่งให้ข้อมูลเชิงลึกที่มีคุณค่าเกี่ยวกับสาเหตุที่หน้าต่างปรากฏบนหน้าจอ การกำหนดค่าของหน้าต่าง หรือการกำหนดค่าของกิจกรรม งาน การแสดงผล หรือองค์ประกอบอื่นๆ ในลําดับชั้น WindowManager ข้อมูลนี้มีประโยชน์ในการแก้ปัญหาต่างๆ เช่น ทำไมแอปของฉันจึงไม่แสดง หรือฉันเห็นหน้าจอกะพริบขณะสลับใช้แอป

เครื่องมือดู WindowManager ของ Winscope จะแสดงข้อมูลนี้สำหรับทั้งร่องรอยและข้อมูลพุล

ดูข้อมูลเพิ่มเติมเกี่ยวกับการรวบรวมร่องรอยได้ที่ WindowManager

windowmanager

รูปที่ 1 การวิเคราะห์การติดตาม WindowManager

ด้านซ้ายของหน้าจอจะแสดงมุมมอง 3 มิติของหน้าต่าง มุมมอง rects จะพิจารณาขอบเขตของหน้าต่างลําดับชั้น z และความทึบแสง

ส่วนกลางของแท็บจะแสดงลําดับชั้นของหน้าต่าง นอกจากความสัมพันธ์แบบ "หลัก-ย่อย" ระหว่างหน้าต่าง กิจกรรม และงานแล้ว มุมมองนี้ยังมีข้อมูลต่อไปนี้ด้วย

  • V: ระบุหน้าต่างที่มองเห็นได้

ด้านขวาของหน้าจอจะมีการดัมพ์โปรโตของพร็อพเพอร์ตี้ทั้งหมดที่ใช้ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ของส่วนการดัมพ์โปรโตได้ที่พร็อพเพอร์ตี้

@IntDef translation

@IntDef translation เป็นพร็อพเพอร์ตี้หลักของแผงพร็อพเพอร์ตี้ WindowManager @IntDef หมายถึงว่าองค์ประกอบที่มีคำอธิบายประกอบซึ่งมีประเภทจำนวนเต็มแสดงถึงประเภทตรรกะ และค่าขององค์ประกอบต้องเป็นหนึ่งในค่าคงที่ที่มีชื่ออย่างชัดแจ้ง @IntDef ใช้ภายในโค้ดฐานของ Android แทน enum เพื่อลดผลกระทบต่อหน่วยความจำและประสิทธิภาพ

ตัวอย่างการใช้ @IntDef มีดังนี้

/**
  * The modes to control how root task is moved to the front when calling {@link Task#reparent}.
 */
@Retention(RetentionPolicy.SOURCE)
@IntDef({
  REPARENT_MOVE_ROOT_TASK_TO_FRONT,
  REPARENT_KEEP_ROOT_TASK_AT_FRONT,
  REPARENT_LEAVE_ROOT_TASK_IN_PLACE
})
@interface ReparentMoveRootTaskMode {}

// Moves the root task to the front if it was not at the front
static final int REPARENT_MOVE_ROOT_TASK_TO_FRONT = 0;
// Only moves the root task to the front if it was focused or frontmost already
static final int REPARENT_KEEP_ROOT_TASK_AT_FRONT = 1;
// Do not move the root task as a part of reparenting
static final int REPARENT_LEAVE_ROOT_TASK_IN_PLACE = 2;

ระบบจะจัดเก็บ Flag เป็นจำนวนเต็มแทนที่จะใช้ค่าที่มนุษย์อ่านได้ ซึ่งอาจตีความได้ยาก Winscope จะแปล Flag เหล่านี้เป็นค่าที่มนุษย์อ่านได้โดยใช้คำจำกัดความ @IntDef ในระหว่างการคอมไพล์ Winscope จะรวบรวมพจนานุกรมของค่า @IntDef และใช้รายการนี้เพื่อถอดรหัสอินสแตนซ์ @IntDef ให้เป็นรูปแบบที่มนุษย์อ่านออกได้เมื่อรันไทม์ เช่น กิจกรรมที่มี activityType รายการจาก 2 รายการจะแปลเป็น activityType รายการจาก ACTIVITY_TYPE_HOME รายการ ในทำนองเดียวกัน หน้าต่างที่มี flags=2173763840 จะแปลเป็นดังนี้ใน Winscope

flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED | FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR | FLAG_LAYOUT_IN_SCREEN

หาก Winscope แปลอินสแตนซ์ @IntDef อย่างไม่ถูกต้อง ให้ทำตามขั้นตอนในอัปเดตการแมป @IntDef เพื่ออัปเดตรายการอินสแตนซ์ @IntDef ที่ Winscope รู้จัก