
เมื่อแอป Android รู้สึกว่าทำงานช้า สะดุด หรือมีแอนิเมชั่นสะดุด (ปิดใช้งานแอนิเมชั่นระบบ)มักจะมีตัวการแอบแฝงอยู่เบื้องหลังอยู่เสมอ นั่นคือความล่าช้าและปัญหาที่น่ารำคาญ Android มีเครื่องมือวินิจฉัยหลายอย่าง แต่หนึ่งในเครื่องมือที่ทรงพลังและยืดหยุ่นที่สุดคือ perfettoรวมกับคำสั่งคลาสสิก dumpsys และแหล่งข้อมูล เช่น ftrace, atrace o heapprofdการเข้าใจวิธีใช้งานอย่างถูกต้องจะทำให้คุณเปลี่ยนจากความรู้สึกคลุมเครือว่า "แอปของฉันทำงานแปลกๆ" ไปสู่การมีตัวเลข ร่องรอย และสาเหตุที่แน่ชัด
ในบทความนี้เราจะอธิบายอย่างใจเย็นแต่ตรงไปตรงมามันทำงานอย่างไร perfetto ใน Android มีโหมดการใช้งานอะไรบ้าง สามารถเปิดใช้งานแหล่งข้อมูลใดได้บ้าง และเสริมคำสั่งสำคัญอื่นๆ อย่างไร เช่น dumpsys gfxinfo, dumpsys meminfo o dumpsys batterystatsแนวคิดคือการให้ภาพรวมที่ครบถ้วนเกี่ยวกับทุกสิ่งที่คุณสามารถวัดได้ และวิธีการใช้เพื่อปรับเวลาแฝงให้เหมาะสม กำจัดปัญหา และปรับปรุงการใช้หน่วยความจำ เครือข่าย และแบตเตอรี่โดยบังเอิญ
Perfetto คืออะไร และเหตุใดจึงมีประโยชน์ต่อการลดเวลาแฝงและปัญหาต่างๆ
perfetto เป็นเครื่องมือติดตามประสิทธิภาพที่รวมเข้ากับ Android ซึ่งปกติจะเรียกใช้จากคอมพิวเตอร์โดยใช้ Android Debug Bridge (ADB) ด้วยคำสั่งเช่น adb shell perfetto ...ภารกิจของมันคือการรวบรวมข้อมูลระดับต่ำเกี่ยวกับสิ่งที่เกิดขึ้นบนอุปกรณ์: กิจกรรมเคอร์เนล คำอธิบายประกอบของผู้ใช้ การใช้หน่วยความจำ สถิติกระบวนการ ฯลฯ ทั้งหมดในรูปแบบการติดตามที่คุณสามารถวิเคราะห์ด้วยผู้ดูเช่นเว็บไซต์ของ perfetto.dev.
Perfetto ดึงข้อมูลจาก "แหล่งข้อมูลเฉพาะทาง" หลายแหล่งในหมู่ที่ยืน:
ftraceซึ่งจับเหตุการณ์เคอร์เนล (การกำหนดตารางเธรด ระบบไฟล์ ฯลฯ)atraceมุ่งเน้นไปที่คำอธิบายประกอบจากพื้นที่ผู้ใช้สำหรับบริการและแอปพลิเคชันheapprofdมุ่งเน้นไปที่การสุ่มตัวอย่างการใช้งานหน่วยความจำดั้งเดิมในบริการและแอป
โดยการรวมแหล่งข้อมูลเหล่านี้เข้าด้วยกันอย่างเหมาะสมคุณสามารถบันทึกข้อมูลที่คุณต้องการได้อย่างแม่นยำเพื่อติดตามปัญหาความล่าช้าของ UI เฟรมที่ข้าม CPU พุ่งสูง หรือการล็อกที่เกี่ยวข้องกับ I/O ที่เก็บข้อมูลยูเอฟเอส.

ไวยากรณ์พื้นฐานของ Perfetto และโหมดการทำงาน
Perfetto สามารถใช้งานได้สองโหมดหลัก: โหมดแสงและโหมดปกติทั้งสองถูกเรียกจาก ADB แต่มีความแตกต่างอย่างมากในวิธีการกำหนดค่าสิ่งที่จะพล็อตและวิธีการบันทึก
ความคิดโดยทั่วไปก็เหมือนกันเสมอ: ดำเนินการคำสั่ง adb shell perfetto โดยระบุระยะเวลา ขนาดบัฟเฟอร์ แหล่งข้อมูล และไฟล์ติดตามผลลัพธ์ โดยทั่วไปไฟล์ผลลัพธ์จะถูกสร้างขึ้นตามรูปแบบโปรโตคอล trace.proto จาก AOSP ซึ่งคุณสามารถเปิดได้ในเครื่องมือวิเคราะห์ของ Perfetto
ตัวเลือกทั่วไปเมื่อเรียกใช้ Perfetto
ไม่ว่าจะโหมดไหน (เบาหรือปกติ)มีแฟล็กทั่วไปจำนวนหนึ่งที่ควบคุมวิธีการดำเนินการจับภาพ สิ่งที่ทำกับไฟล์ที่สร้างขึ้น และวิธีการรวมเข้ากับการแจ้งเตือนหรือระบบอัปโหลดระยะไกล:
--backgroundo-d: ทำให้perfettoออกจากอินเทอร์เฟซบรรทัดคำสั่งและดำเนินการบันทึกต่อในพื้นหลัง--background-waito-Dคล้ายกับวิธีก่อนหน้านี้ แต่จะต้องรอนานถึง 30 วินาทีเพื่อให้แหล่งข้อมูลทั้งหมดยืนยันว่าได้เริ่มต้นใช้งานแล้ว รหัสออกจะเป็น 0 หากทุกอย่างทำงานอย่างถูกต้อง และจะเป็นค่าอื่นที่ไม่ใช่ 0 หากมีข้อผิดพลาดหรือหมดเวลา--alert-id,--config-id,--config-uidy--subscription-id: ตัวระบุที่เชื่อมโยงการติดตามกับการแจ้งเตือนหรือการกำหนดค่าทริกเกอร์ กำหนดไว้ในระบบ ซึ่งมีประโยชน์ในสถานการณ์การตรวจสอบอัตโนมัติ--out OUT_FILEo-o OUT_FILE: เส้นทางเต็มที่จะบันทึกไฟล์ติดตามหรือ-หากคุณต้องการให้ฉันไปstdoutไดเร็กทอรีโดยทั่วไปใช้เป็น/data/misc/perfetto-traces.--upload: เมื่อการจับภาพเสร็จสิ้น ให้ส่งไฟล์ติดตามไปยังแพ็กเก็ตที่ระบุโดยข้อความIncidentReportConfigในการกำหนดค่าต้นแบบ--no-guardrailsy--reset-guardrails: พวกเขาควบคุมกลไกการรักษาความปลอดภัยและข้อจำกัดของทรัพยากร เมื่อเปิดใช้งานการอัพโหลดอัตโนมัติ (--upload) ออกแบบมาเพื่อการทดสอบเท่านั้น ไม่ได้ออกแบบมาเพื่อการผลิตโดยเฉพาะ--rsave-for-bugreport: หากการจับภาพมีbugreport_scoreมากกว่า 0 จะบันทึกการติดตามลงในไฟล์และแสดงเส้นทางเมื่อเสร็จสิ้น เพื่อให้แนบไปกับรายงานข้อผิดพลาดได้ง่าย--queryy--query-rawพวกเขาสอบถามสถานะของบริการติดตาม บริการแรกให้ผลลัพธ์ที่อ่านได้ บริการที่สองส่งคืนเนื้อหาที่เข้ารหัสด้วยโปรโตโค้ดtracing_service_state.proto.--helpo-h: พิมพ์ความช่วยเหลือในตัวของเครื่องมือ
โหมดแสงของ Perfetto: รวดเร็วและคล้ายกับ Systrace
โหมดแสงของ Perfetto ได้รับการออกแบบมาเพื่อการติดตามอย่างรวดเร็วคล้ายคลึงกันมากกับวิธีที่เคยใช้ในอดีต systraceช่วยให้คุณสามารถเลือกเฉพาะชุดย่อยพื้นฐานของแหล่งที่มา: โดยพื้นฐานแล้ว atrace y ftraceและมันมีประโยชน์ควบคู่ไปด้วย แอปเพื่อเพิ่มประสิทธิภาพการทำงาน.
รูปแบบไวยากรณ์ทั่วไปในโหมดน้ำหนักเบา มันเป็นประมาณนี้:
adb shell perfetto ... --out FILE
ในบรรดาตัวเลือกเฉพาะที่เกี่ยวข้องที่สุดของโหมดแสง เราพบว่า:
--time TIMEo-t TIME: ระยะเวลาของการติดตามเป็นวินาที นาที หรือชั่วโมง ตัวอย่างเช่น--time 1mจับภาพเป็นเวลาหนึ่งนาที หากไม่ได้ระบุอะไรไว้ ค่าเริ่มต้นจะใช้ 10 วินาที--buffer SIZEo-b SIZE: ขนาดของบัฟเฟอร์วงกลมในหน่วยความจำ ค่าเริ่มต้นมักจะเป็นประมาณนี้--buffer 32mb.--size SIZEo-s SIZE: ขีดจำกัดขนาดไฟล์สูงสุดบนดิสก์ หากไม่ได้กำหนดค่า Perfetto จะสามารถเขียนลงในบัฟเฟอร์หน่วยความจำได้เท่านั้น--appo-a: ชื่อของแพ็คเกจแอพ Android ที่จะใช้ในคำอธิบายประกอบatrace.
ต่อไปนี้คือรายการ "ตัวระบุเหตุการณ์"ซึ่งจะกำหนดว่าจะบันทึกหมวดหมู่หรือเหตุการณ์ใด:
ATRACE_CAT: หมวดหมู่ของatraceที่คุณต้องการเปิดใช้งาน (ตัวอย่างเช่นwm(สำหรับ WindowManager) คำสั่งทั่วไปจะเป็นดังนี้:adb shell perfetto --out FILE wm.FTRACE_GROUP/FTRACE_NAME: เหตุการณ์เฉพาะของftraceในขณะที่sched/sched_switchคุณสามารถวิ่งได้:adb shell perfetto --out FILE sched/sched_switch.
โหมดปกติของ Perfetto: การควบคุมสูงสุดและแหล่งข้อมูลเพิ่มเติม
โหมดปกติของ Perfetto มีประสิทธิภาพและกำหนดค่าได้มากกว่ามากแทนที่จะส่งหมวดหมู่แต่ละหมวดหมู่ คุณจะได้รับไฟล์การกำหนดค่า (โปรโต) ที่อธิบายรายละเอียดว่าต้องเปิดใช้งานแหล่งข้อมูลใด วิธีการสุ่มตัวอย่าง บัฟเฟอร์ใดที่จะใช้ ฯลฯ
รูปแบบไวยากรณ์ปกติสำหรับโหมดปกติ มันเป็น:
adb shell perfetto --config CONFIG_FILE --out FILE
แฟล็กเฉพาะที่เป็นคีย์ในโหมดนี้ เสียง:
--config CONFIG_FILEo-c CONFIG_FILE: เส้นทางไปยังไฟล์การกำหนดค่าที่ปฏิบัติตามรูปแบบของtrace_config.protoใน AOSP ภายในต้นแบบนี้ มีองค์ประกอบต่างๆ เช่นTraceConfigyDataSourceConfig(กำหนดไว้ในdata_source_config.proto) เพื่อเลือกและกำหนดพารามิเตอร์แหล่งข้อมูล--txt: ระบุว่าไฟล์การกำหนดค่าอยู่ในรูปแบบข้อความpbtxtแทนไบนารี สะดวกมากสำหรับการสร้างต้นแบบในพื้นที่ แต่ไม่แนะนำให้ใช้เป็นรูปแบบการผลิตขั้นสุดท้าย
แหล่งข้อมูลที่เข้ากันได้กับ Perfetto
จุดแข็งที่แท้จริงของ Perfetto อยู่ที่ทรัพยากรต่างๆ ที่สามารถเปิดใช้งานได้แต่ละอันได้รับการกำหนดค่าจากต้นแบบผ่านบล็อกของ DataSourceConfigทั้งนี้ คุณจะมีตัวเลือกให้เลือกมากขึ้นหรือน้อยลง ขึ้นอยู่กับอุปกรณ์ เวอร์ชัน Android และเคอร์เนล

เหตุการณ์เคอร์เนลที่มี ftrace
แหล่งที่มา ftrace Perfetto ช่วยให้คุณสามารถบันทึกเหตุการณ์เคอร์เนลภายในได้ซึ่งเป็นทองคำบริสุทธิ์เมื่อคุณต้องการเข้าใจว่าทำไมเธรดจึงไม่กำหนดเวลาหรือมีอะไรขัดขวาง CPU ในช่วงเวลาใดก็ตาม
เพื่อเปิดใช้งาน ftrace จากการตั้งค่า ฟิลด์จะต้องได้รับการกำหนด ftrace_config ภายใน DataSourceConfig...โดยเลือกเหตุการณ์เฉพาะที่เราต้องการติดตาม ตัวอย่างทั่วไปที่เกี่ยวข้องกับการจัดตารางกระบวนการ ได้แก่:
sched/sched_switchsched/sched_wakeupsched/sched_wakeup_newsched/sched_process_execsched/sched_process_exitsched/sched_process_forksched/sched_process_freesched/sched_process_hangsched/sched_process_wait
สามารถเปิดใช้งานเหตุการณ์ระบบไฟล์และคำอธิบายย้อนกลับได้เพื่อให้การติดตามเพียงครั้งเดียวสามารถจับทั้งข้อมูลเคอร์เนลและเหตุการณ์ระดับสูงกว่าได้ รายการเหตุการณ์จริงจะขึ้นอยู่กับอุปกรณ์และเคอร์เนลเสมอ ดังนั้นขอแนะนำให้ศึกษาโปรโตคอลการกำหนดค่าที่เกี่ยวข้อง
สถิติกระบวนการและระบบ
แหล่งข้อมูลที่มีประโยชน์อีกแหล่งหนึ่งคือสถิติกระบวนการและระบบนั้นเองช่วยให้สามารถรับตัวนับการใช้ทรัพยากรเป็นระยะๆ ได้ทั้งแบบทั่วโลกและแบบต่อกระบวนการ เหมาะสำหรับการเชื่อมโยง CPU หรือหน่วยความจำกับเหตุการณ์ jank ที่เฉพาะเจาะจงและด้วย แอปพื้นหลัง.
ในการใช้คุณต้องกำหนดค่าฟิลด์ process_stats_config y sys_stats_config ภายใน DataSourceConfigข้อมูลที่ได้รับประกอบด้วยข้อมูลเวลา CPU การใช้หน่วยความจำ และเมตริกอื่นๆ ที่อาจแตกต่างกันไปขึ้นอยู่กับอุปกรณ์และเวอร์ชันของระบบปฏิบัติการ
โปรไฟล์หน่วยความจำดั้งเดิมพร้อม heapprofd
heapprofd มันคือส่วนสำคัญเมื่อคุณจำเป็นต้องเข้าใจการใช้หน่วยความจำดั้งเดิม ของแอปพลิเคชันหรือบริการระบบของคุณ โดยทำงานโดยการสุ่มตัวอย่างและสร้างโปรไฟล์ที่ระบุว่าส่วนใดของโค้ดที่กำลังสำรองหน่วยความจำอยู่
เพื่อให้แสงสว่าง heapprofd ในร่องรอยของเพอร์เฟตโต คุณจะต้องกรอกข้อมูลในส่วนนี้ heapprofd_config de DataSourceConfig. ผลลัพธ์คือ ProfilePackets พร้อมข้อมูลคอลสแต็ก รวมถึงเฟรมเวิร์ก Java หากมี เป็นวิธีที่มีประสิทธิภาพในการค้นหาการรั่วไหลของข้อมูลแบบเนทีฟหรือรูปแบบการจัดสรรที่ไม่มีประสิทธิภาพ
เอกสารสาธารณะใน perfetto.dev เจาะลึกถึงวิธีการกำหนดค่าโปรไฟล์เหล่านี้ กรองตามกระบวนการเฉพาะ ปรับความถี่ในการสุ่มตัวอย่าง ฯลฯ ช่วยให้คุณปรับแต่งต้นทุนของเครื่องมือให้ตรงกับระดับรายละเอียดที่คุณต้องการได้
แหล่งข้อมูลเพิ่มเติมอื่น ๆ
นอกจากนี้ ยังมีแหล่งข้อมูลอื่นๆ เพิ่มเติมขึ้นอยู่กับอุปกรณ์และเวอร์ชัน Androidบางส่วนมุ่งเน้นไปที่พลังงาน บางส่วนมุ่งเน้นไปที่เครือข่าย หรือเมตริกกรอบงานที่เฉพาะเจาะจงมากขึ้น หากต้องการดูรายละเอียด คุณจำเป็นต้องตรวจสอบรูปแบบการกำหนดค่าต่างๆ สำหรับแหล่งข้อมูล Perfetto ที่เผยแพร่บน AOSP
ไม่ว่ากรณีใดรูปแบบก็จะเกิดขึ้นซ้ำๆ เสมอคุณเลือกแหล่งที่มา คุณกำหนดค่าบล็อกของมัน DataSourceConfig ในต้นแบบของ TraceConfig และคุณเปิดการติดตามด้วย perfettoจากนั้นคุณวิเคราะห์ไฟล์ผลลัพธ์ด้วยเครื่องมือสร้างภาพ
dumpsys: ปลั๊กอินที่สมบูรณ์แบบสำหรับการวัดเวลาแฝงและประสิทธิภาพ
แม้ว่า Perfetto จะเป็นดาวเด่นของร่องรอยระดับต่ำเครื่องมือสำหรับทหารผ่านศึก dumpsys ยังคงมีความจำเป็นเมื่อคุณต้องการการวินิจฉัยระดับสูง ซึ่งจัดกลุ่มตามบริการระบบ: อินพุต กราฟิก เครือข่าย แบตเตอรี่ หน่วยความจำ ฯลฯ
dumpsys มันทำงานบนอุปกรณ์ Android และเรียกใช้งานจาก ADB ด้วยคำสั่งเช่น adb shell dumpsysหากคุณรันโดยไม่มีพารามิเตอร์ ระบบจะดัมพ์ข้อมูลจากบริการระบบทั้งหมด ซึ่งโดยปกติจะมากเกินไป ทางที่ดีควรระบุบริการเฉพาะที่คุณสนใจเพื่อมุ่งเน้นเฉพาะส่วนนั้น
รูปแบบทั่วไปของคำสั่ง dumpsys
วิธีการโทรทั่วไป dumpsys มันเป็น:
adb shell dumpsys | -c | -h]
การใช้งานทั่วไปบางประการ จะ:
adb shell dumpsys: พลิกกลับบริการทั้งหมด (มีรายละเอียดมาก)adb shell dumpsys input: สถานะระบบการป้อนข้อมูล (คีย์บอร์ด หน้าจอสัมผัส ฯลฯ)adb shell dumpsys -l: รายการบริการทั้งหมดที่มี
ในบรรดาตัวเลือกบรรทัดคำสั่งหลัก โดดเด่น:
-t timeout: เวลาสูงสุดเป็นวินาทีที่กำหนดให้กับdumpsysเพื่อดำเนินการให้เสร็จสมบูรณ์ (ค่าเริ่มต้น 10 วินาที)--help: ความช่วยเหลือเครื่องมือทั่วไป-l: รายการบริการระบบ--skip services: ระบุบริการหนึ่งรายการหรือมากกว่าที่คุณต้องการยกเว้นจากเอาต์พุตเมื่อคุณไม่ได้ระบุบริการใดโดยเฉพาะserviceระบุบริการเฉพาะที่คุณต้องการตรวจสอบ พร้อมอาร์กิวเมนต์เสริม หากคุณไม่แน่ใจ บริการส่วนใหญ่ยอมรับ-hเพื่อแสดงความช่วยเหลือของตนเอง เช่นadb shell dumpsys procstats -h.-c:ทำให้บริการบางอย่างส่งคืนข้อมูลในรูปแบบที่เหมาะสมกว่าสำหรับการใช้โดยสคริปต์หรือเครื่องมือ-h:ในบางบริการจะมีการพิมพ์ความช่วยเหลือเพิ่มเติมที่เฉพาะเจาะจง
การวินิจฉัยอินพุต: การสัมผัส การกดแป้นพิมพ์ และความหน่วงของเหตุการณ์
สำหรับปัญหาความล่าช้าที่เกี่ยวข้องกับการสัมผัสหรือการป้อนข้อมูลด้วยแป้นพิมพ์บริการที่สำคัญคือ input. กับ adb shell dumpsys input คุณจะได้รับการถ่ายโอนข้อมูลสถานะของอุปกรณ์อินพุตและการไหลของเหตุการณ์ตั้งแต่เมื่อสร้างขึ้นจนกระทั่งไปถึงหน้าต่าง
เอาท์พุตประกอบด้วยบล็อกลอจิกที่สำคัญสามบล็อก: สถานะของ Event Hub สถานะของ InputReader และสถานะของ InputDispatcherแต่ละอย่างช่วยให้คุณตรวจพบข้อบกพร่องในส่วนหนึ่งของการเดินทางของเหตุการณ์
Event Hub: อุปกรณ์ที่มีอยู่และการกำหนดค่า
“สถานะศูนย์กลางเหตุการณ์” แสดงรายการอุปกรณ์อินพุตทั้งหมดที่ระบบรู้จักพร้อมข้อมูลต่างๆ เช่น เส้นทางอุปกรณ์ คลาส ไฟล์ keylayout คีย์ชาร์ และการกำหนดค่า รวมถึงตัวระบุคีย์บอร์ดในตัว (BuiltInKeyboardId).
เมื่อตรวจสอบส่วนนี้ขอแนะนำให้ตรวจสอบ:
- อุปกรณ์ทางกายภาพที่คาดหวังทั้งหมดได้รับการแสดงรายการอย่างถูกต้อง
- แต่ละคีย์จะมีไฟล์เค้าโครงคีย์ แผนที่อักขระ และไฟล์กำหนดค่าที่กำหนดไว้เป็นของตัวเอง หากไฟล์เหล่านี้ขาดหายไปหรือมีข้อผิดพลาดทางไวยากรณ์ ไฟล์เหล่านี้จะไม่สามารถโหลดได้ และประสบการณ์การป้อนข้อมูลจะได้รับผลกระทบ
- ว่าสนาม
Classesมีบิตที่เหมาะสมซึ่งแมปกับค่าคงที่เช่นINPUT_DEVICE_CLASS_TOUCH_MTenEventHub.h. - นี้
BuiltInKeyboardIdทะเล-2เมื่อไม่มีแป้นพิมพ์ในตัว หรือตรงกับรหัสแป้นพิมพ์ภายใน หากพบว่าไม่เป็นเช่นนั้น-2และควรจะเป็นเช่นนั้น อาจขาดแผนที่อักขระพิเศษสำหรับแป้นฟังก์ชันบางอัน ซึ่งควรมีเพียงtype SPECIAL_FUNCTION.
InputReader: วิธีการตีความเหตุการณ์อินพุต
InputReader รับผิดชอบในการ "แปล" เหตุการณ์เคอร์เนลระดับต่ำ ไปยังสิ่งที่กรอบงานสามารถเข้าใจได้ เช่น พิกัดสัมผัส แรงกด ขนาดสัมผัส ฯลฯ ในการถ่ายโอนข้อมูล คุณจะเห็นการกำหนดค่าโดยละเอียดของแต่ละอุปกรณ์ (เช่น หน้าจอสัมผัสเฉพาะ) และการดำเนินการล่าสุดที่ดำเนินการ
ในกรณีของหน้าจอสัมผัส การตรวจสอบเป็นสิ่งสำคัญ:
- ช่วง X และ Y (ค่าต่ำสุด, ค่าสูงสุด, ความแม่นยำ, ความคลาดเคลื่อน)
- พารามิเตอร์การสอบเทียบ (ขนาด มาตราส่วน แรงดัน ทิศทาง ฯลฯ)
- ขนาดพื้นผิว (ความกว้างและความสูงเป็นพิกเซล)
- ปัจจัยการแปลและการปรับขนาดซึ่งกำหนดว่าพิกัดดิบจะถูกแมปไปยังพื้นที่หน้าจออย่างไร
พารามิเตอร์ทั่วโลกยังแสดงอยู่ที่ส่วนท้ายของหัวข้อนี้ด้วย เช่น ช่วงเวลาการแตะ ขีดจำกัดความเร็วของตัวชี้ หรือการตั้งค่าท่าทาง (เวลาการแตะสองครั้ง ระยะทางขั้นต่ำ ฯลฯ) ซึ่งส่งผลโดยตรงต่อความรู้สึกลื่นไหล
InputDispatcher: ส่งเหตุการณ์ไปยัง Windows และ ANR
InputDispatcher จัดการการส่งเหตุการณ์ขาเข้าไปยังหน้าต่างต่างๆสถานะจะแสดงว่าหน้าต่างใดอยู่ในโฟกัส หน้าต่างใดที่ไวต่อการสัมผัส สถานะของคิวอินพุต และหากมี ANR (แอปพลิเคชันไม่ตอบสนอง) อยู่ในระหว่างดำเนินการ
ในทางปฏิบัติ ส่วนนี้จะช่วยให้คุณตรวจสอบได้:
- ณ เวลานั้นมีการแตะก๊อกน้ำที่หน้าต่างบานไหน?
dumpsys. - หากมีเหตุการณ์ที่ค้างอยู่หรือคิวที่ถูกบล็อค อาจทำให้การรับรู้ถึงความล่าช้าเพิ่มขึ้น
- การเชื่อมต่อขาเข้าถูกกระจายไปยังหน้าต่างต่างๆ อย่างไร และมีหน้าต่างใดที่ล้นคิวอยู่หรือไม่
การตรวจสอบที่เรียบง่ายแต่เปิดเผยมาก เพียงแตะหน้าจอก็เปิดใช้งานได้ทันที adb shell dumpsys input และดูว่าเส้นของ TouchStates ระบุหน้าต่างที่คุณสัมผัสให้ถูกต้อง หากไม่เป็นเช่นนั้น แสดงว่าการจัดการโฟกัสหรือการแมปพื้นที่สัมผัสมีปัญหา
การวัดประสิทธิภาพ UI ด้วย gfxinfo และ framesstats
เมื่อความกังวลหลักอยู่ที่ความกระตุกในแอนิเมชั่นและการเลื่อน, บริการ gfxinfo เขาเป็นเพื่อนของคุณ ผ่าน dumpsys gfxinfo คุณสามารถรับข้อมูลเกี่ยวกับเฟรมที่เรนเดอร์สำหรับแอปเฉพาะได้
คำสั่งพื้นฐานสำหรับแอปเฉพาะ มันเป็น:
adb shell dumpsys gfxinfo package-name
หากคุณเพิ่มตัวเลือก framestatsการวินิจฉัยจะละเอียดยิ่งขึ้น:
adb shell dumpsys gfxinfo package-name framestats
นี่จะทำให้คุณได้รับสถิติความหน่วงแบบเฟรมต่อเฟรม ข้อมูลจากแอนิเมชันล่าสุดนี้มีประโยชน์อย่างมากในการระบุการเปลี่ยนฉากหรือหน้าจอเฉพาะที่เวลาในการเรนเดอร์พุ่งสูงขึ้น ข้อมูลนี้สามารถนำไปผสานรวมเข้ากับการทดสอบอัตโนมัติหรือมาโครเบนช์มาร์กเพื่อตรวจสอบการถดถอยระหว่างเวอร์ชันแอปต่างๆ ได้
การวินิจฉัยเครือข่ายด้วย dumpsys netstats
เพื่อทำความเข้าใจว่าความล่าช้าของ UI เกี่ยวข้องกับเครือข่ายที่ช้าหรือปริมาณการรับส่งข้อมูลที่เพิ่มขึ้นหรือไม่, บริการ netstats มีประโยชน์มาก รวบรวมสถิติการใช้งานเครือข่ายตั้งแต่เปิดอุปกรณ์
คำสั่งทั่วไปในรายละเอียดเพิ่มเติม มันเป็น:
adb shell dumpsys netstats detail
การออกเดินทางจะแบ่งออกเป็นหลายส่วน:
- อินเทอร์เฟซที่ใช้งานอยู่และอินเทอร์เฟซ UID ที่ใช้งานอยู่ ซึ่งมีชื่อเช่น
wlan0และตัวระบุเครือข่ายของมัน - สถิติ “Dev” และ “Xt” ซึ่งแสดงข้อมูลประวัติพร้อมช่วงเวลา (เช่น เพิ่มทีละหนึ่งชั่วโมง) และฟิลด์ เช่น ไบต์ที่ได้รับ (
rb), ได้รับพัสดุแล้ว (rp), ไบต์ที่ส่ง (tb) ฯลฯ - สถิติตาม UID ซึ่งคุณสามารถแบ่งการใช้งานเครือข่ายของแอปพลิเคชันเฉพาะได้ โดยแยกความแตกต่างระหว่างมือถือและ Wi-Fi
เพื่อค้นหา UID ของแอปของคุณใช้ประมาณนี้ครับ:
adb shell dumpsys package your-package-name | grep userId
เมื่อคุณรู้ค่าของ userId, คุณสามารถดูทางออกของ netstats เส้นที่มี uid=ese_valor และดูตัวอย่างว่ามีการใช้ไบต์และแพ็กเก็ตไปกี่ไบต์ในแต่ละช่วงเวลาสองชั่วโมง และอยู่ในเบื้องหน้าหรือไม่set=DEFAULT) หรือในพื้นหลัง (set=BACKGROUND).
การใช้งานแบตเตอรี่และพลังงานด้วย batterystats
ความล่าช้าและปัญหาต่างๆ ไม่เพียงได้รับการแก้ไขด้วยประสิทธิภาพที่เพิ่มขึ้นบางครั้งการดูว่าการเพิ่มประสิทธิภาพส่งผลต่อการใช้พลังงานอย่างไรก็คุ้มค่าเช่นกัน dumpsys batterystats รายงานดังกล่าวให้รายละเอียดที่ครอบคลุมเกี่ยวกับการใช้งานแบตเตอรี่ตาม UID และตามส่วนประกอบ
คำสั่งพื้นฐานสำหรับบริการนี้ มันเป็น:
adb shell dumpsys batterystats options
หากคุณต้องการมุ่งเน้นไปที่แอปเฉพาะตั้งแต่การอัปโหลดครั้งล่าสุดใช้:
adb shell dumpsys batterystats --charged package-name
การออกเดินทางตามปกติประกอบด้วย:
- ประวัติเหตุการณ์ที่เกี่ยวข้องกับแบตเตอรี่
- สถิติอุปกรณ์ทั่วโลก
- การประมาณการใช้พลังงานตาม UID และตามส่วนประกอบของระบบ
- ระยะเวลาการใช้งานเครือข่ายมือถือตามแอปและแพ็กเกจ
- สถิติทั่วโลกของ UID ของระบบและแอป
รูปแบบการเช็คอิน (CSV) สำหรับการวิเคราะห์อัตโนมัติ
หากคุณจำเป็นต้องประมวลผลข้อมูลแบตเตอรี่โดยใช้สคริปต์หรือเครื่องมือภายนอกคุณสามารถสร้างเอาต์พุตที่ "เป็นมิตรกับเครื่อง" ได้ด้วย:
adb shell dumpsys batterystats --checkin
รูปแบบนี้นำเสนอการสังเกตแต่ละรายการในบรรทัด CSVด้วยตัวระบุส่วนที่กำหนดวิธีการตีความฟิลด์อื่นๆ ตัวอย่างของส่วนต่างๆ ได้แก่:
vers: เวอร์ชั่นเช็คอิน พัสดุ และแพลตฟอร์มuid: UID – ความสัมพันธ์ของชื่อแพ็กเกจapk,pr,sr,vib,fgฯลฯ : การใช้กระบวนการ เซ็นเซอร์ เครื่องสั่น เวลาเบื้องหน้า การซิงโครไนซ์ งาน ฯลฯntygn: สถิติเครือข่าย (ไบต์และแพ็กเก็ตมือถือ/Wi-Fi, อัพไทม์ ฯลฯ)bt,dc,lvข้อมูลแบตเตอรี่ เช่น เวลา ระดับ และการคายประจุwfl,gwfl,gble: ข้อมูล Wi-Fi และ Bluetooth ที่เฉพาะเจาะจง รวมถึงเวลาและการบริโภคโดยประมาณเป็น mAh
ใน Android เวอร์ชันล่าสุด (6.0 ขึ้นไป)การใช้พลังงานของ Wi-Fi, วิทยุเคลื่อนที่ และบลูทูธ มีรายงานเป็นองค์ประกอบ pwi พร้อมป้ายกำกับเฉพาะ (wifi, blue, cell) ในขณะที่เวอร์ชันเก่าจะถูกจัดกลุ่มไว้ในส่วน m (เบ็ดเตล็ด)
การตรวจสอบหน่วยความจำในช่วงเวลาด้วย procstats
หากคุณสงสัยว่าปัญหาเกิดจากการรั่วไหลของหน่วยความจำหรือแอปขนาดใหญ่ที่ทำงานอยู่เบื้องหลัง, dumpsys procstats ช่วยให้คุณดูได้ว่าแอปพลิเคชันของคุณมีพฤติกรรมอย่างไรในแต่ละช่วงเวลา เช่น ใช้งานมานานแค่ไหน อยู่ในสถานะใด และใช้หน่วยความจำเท่าใด
การใช้งานทั่วไปคือการร้องขอสถิติจากไม่กี่ชั่วโมงที่ผ่านมาตัวอย่างเช่น:
adb shell dumpsys procstats --hours 3
ผลลัพธ์สรุปสำหรับแต่ละแอป เปอร์เซ็นต์ของเวลาที่กระบวนการทำงานอยู่ พร้อมค่า PSS, USS และ RSS ในรูปแบบค่าต่ำสุด ค่าเฉลี่ย และค่าสูงสุด พร้อมด้วยจำนวนตัวอย่างที่สุ่มมา นอกจากนี้ยังแสดงสรุปหน่วยความจำตามประเภทกระบวนการ (เคอร์เนล, เนทีฟ, ถาวร, ท็อป, บริการ, กระบวนการแคช ฯลฯ)
มุมมองรวมนี้ช่วยตรวจจับรูปแบบ เช่น แอปพลิเคชันที่ยังคงอยู่ในสถานะพื้นหลังเป็นเวลานานเกินไป หรือที่รักษาระดับ PSS เฉลี่ยหรือสูงสุดไว้สูงมาก ถือเป็นแอปพลิเคชันที่มีศักยภาพในการปรับให้เหมาะสม หรืออาจทำให้เกิดแรงกดดันด้านหน่วยความจำที่ทำให้ประสิทธิภาพของระบบลดลง
ภาพรวมหน่วยความจำโดยละเอียดพร้อม meminfo
เมื่อคุณต้องการภาพรวมที่ละเอียดมากของการใช้หน่วยความจำของกระบวนการเฉพาะเครื่องมือคือ dumpsys meminfoคุณสามารถดูได้ว่า RAM ถูกกระจายอย่างไรในฮีปพื้นฐาน, Dalvik/ART, แผนผังโค้ด, บัฟเฟอร์กราฟิก ฯลฯ
ไวยากรณ์พื้นฐานคือ:
adb shell dumpsys meminfo package_name|pid
ตัวเลือก -d ข้อมูลเพิ่มเติมสำหรับ Dalvik/ARTแสดงรายละเอียดภายใน เช่น พื้นที่สำหรับวัตถุขนาดใหญ่ (.LOS), การโอเวอร์โหลด GC, แคช JIT, พื้นที่ไซโกต ฯลฯ ด้วย -h คุณสามารถดูธงทั้งหมดที่มีอยู่ได้
คอลัมน์หลักที่ต้องสังเกตโดยทั่วไปคือ Pss Total y Private Dirtyตัวเลขเหล่านี้สะท้อนถึงการใช้งาน RAM ที่ปรับตามการใช้งานร่วมกัน และจำนวนหน่วยความจำส่วนตัวที่ถูกแก้ไข ซึ่งจะถูกปลดปล่อยเมื่อกระบวนการสิ้นสุดลงเท่านั้น บางครั้งก็น่าสนใจเช่นกัน Private Clean y Heap Allocหากตรวจพบการบริโภคที่ผิดปกติ ให้ตรวจสอบวิธี เพิ่ม RAM เพื่อบรรเทาผลกระทบเหล่านั้น
หมวดหมู่ที่เกี่ยวข้องบางส่วนในตาราง:
Native HeapyDalvik Heap: การใช้งานหน่วยความจำฮีปดั้งเดิมและ VMHeap Allocแสดงให้เห็นว่าผู้จัดสรรเชื่อว่าสิ่งใดถูกสงวนไว้ ซึ่งอาจสูงกว่า PSS เนื่องมาจากผลของไซโกตและหน่วยความจำที่ใช้ร่วมกัน.so mmap,.dex mmap,.oat mmapy.art mmap:RAM ที่ใช้โดยโค้ดเนทีฟและไบต์โค้ด รวมถึงรูปภาพ ART และพื้นที่ที่ใช้ร่วมกัน.Heap,.LOS,.GC,.JITCache,.Zygote,.NonMoving,.IndirectRef(กับ-d): ทำลายการใช้งานหน่วยความจำภายในที่จัดการโดย ART ลงไปอีกUnknown:หน้าที่ไม่สามารถจัดประเภทเป็นหมวดหมู่ก่อนหน้าได้ มักจะเป็นการกำหนดดั้งเดิมที่ดูผ่าน ASLR
กลุ่มบรรทัด TOTAL จะจัดกลุ่ม PSS ทั้งหมดของกระบวนการซึ่งสามารถเปรียบเทียบได้กับ PSS ของกระบวนการอื่นและ RAM ที่มีอยู่ Private Dirty + Private Clean พวกมันระบุหน่วยความจำที่จะถูกปลดปล่อยเมื่อกระบวนการสิ้นสุดลง
นอกจากนี้ ตัวนับวัตถุระดับสูงยังแสดงอยู่ที่ตอนท้ายของรายงานด้วย เป็นจำนวน ViewRootImpl, AppContexts o Activitiesสิ่งนี้ช่วยตรวจจับการรั่วไหลทั่วไปของบริบทหรือกิจกรรมที่จัดขึ้นโดยการอ้างอิงแบบคงที่หรือโดยมุมมอง/สิ่งที่วาดได้ซึ่งยังคงชี้ไปยังบริบทหรือกิจกรรมเหล่านั้น
มันคุ้มค่าที่จะจดจำ อะไร View หรือ Drawable พวกเขายังรักษาการอ้างอิงถึง Activity ซึ่งเป็นแหล่งกำเนิด ดังนั้น การจัดเก็บอย่างไม่ถูกต้องอาจนำไปสู่การรั่วไหลของกิจกรรมทั้งหมดและทรัพยากรที่เกี่ยวข้องได้
การรวมการติดตามโดยละเอียดของ Perfetto เข้ากับการวินิจฉัย dumpsys (อินพุต กราฟิก หน่วยความจำ เครือข่าย และแบตเตอรี่) มอบมุมมองแบบ 360 องศาเกี่ยวกับพฤติกรรมของแอป Android ตั้งแต่กำหนดเวลาเธรด ไปจนถึงจำนวนมิลลิวินาทีที่ใช้ในการเรนเดอร์เฟรม หรือปริมาณหน่วยความจำและพลังงานส่วนเกินที่แอปใช้ไป การใช้เครื่องมือเหล่านี้อย่างสม่ำเสมอในการพัฒนาและทดสอบสร้างความแตกต่างระหว่างแอปที่ "ทำงานได้มากหรือน้อย" กับแอปที่ให้ความรู้สึกลื่นไหล เสถียร และมีประสิทธิภาพอย่างแท้จริง แม้บนอุปกรณ์ขนาดเล็ก เพิ่มประสิทธิภาพ Android.
