WindowManager

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

โปรแกรมดู WindowManager ของ Winscope จะแสดงข้อมูลนี้สําหรับทั้งการติดตาม และการทิ้งข้อมูล

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

windowmanager

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

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

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

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

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

@IntDef translation

@IntDef เป็นพร็อพเพอร์ตี้หลักของแผงพร็อพเพอร์ตี้ 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 จะแปลแฟล็กเหล่านี้เป็นค่าที่มนุษย์อ่านได้โดยใช้คำจำกัดความของ @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 รู้จัก