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