ความหน่วงและปัญหาต่างๆ กับ Perfetto บน Android: คู่มือฉบับสมบูรณ์

  • Perfetto ช่วยให้คุณสามารถบันทึกรายละเอียดร่องรอยของเคอร์เนล กระบวนการ และหน่วยความจำ ซึ่งเป็นกุญแจสำคัญในการวิเคราะห์ความหน่วงและปัญหาใน Android
  • โหมดน้ำหนักเบาทำให้การติดตามอย่างรวดเร็วง่ายขึ้นด้วย atrace และ ftrace ในขณะที่โหมดปกติใช้การกำหนดค่า proto ขั้นสูง
  • dumpsys ช่วยเสริม Perfetto ด้วยการวินิจฉัยอินพุต กราฟ เครือข่าย แบตเตอรี่ และหน่วยความจำเฉพาะบริการ
  • การรวม Perfetto และ dumpsys เข้าด้วยกันช่วยให้มองเห็นภาพรวมได้ครบถ้วนเพื่อเพิ่มประสิทธิภาพความลื่นไหล การใช้งาน และความเสถียรของแอป Android

การวิเคราะห์ความหน่วงและความล่าช้าด้วย Perfetto บน Android

เมื่อแอป 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 ที่เก็บข้อมูลยูเอฟเอส.

เครื่องมือติดตามประสิทธิภาพใน Android

ไวยากรณ์พื้นฐานของ Perfetto และโหมดการทำงาน

Perfetto สามารถใช้งานได้สองโหมดหลัก: โหมดแสงและโหมดปกติทั้งสองถูกเรียกจาก ADB แต่มีความแตกต่างอย่างมากในวิธีการกำหนดค่าสิ่งที่จะพล็อตและวิธีการบันทึก

ความคิดโดยทั่วไปก็เหมือนกันเสมอ: ดำเนินการคำสั่ง adb shell perfetto โดยระบุระยะเวลา ขนาดบัฟเฟอร์ แหล่งข้อมูล และไฟล์ติดตามผลลัพธ์ โดยทั่วไปไฟล์ผลลัพธ์จะถูกสร้างขึ้นตามรูปแบบโปรโตคอล trace.proto จาก AOSP ซึ่งคุณสามารถเปิดได้ในเครื่องมือวิเคราะห์ของ Perfetto

ตัวเลือกทั่วไปเมื่อเรียกใช้ Perfetto

ไม่ว่าจะโหมดไหน (เบาหรือปกติ)มีแฟล็กทั่วไปจำนวนหนึ่งที่ควบคุมวิธีการดำเนินการจับภาพ สิ่งที่ทำกับไฟล์ที่สร้างขึ้น และวิธีการรวมเข้ากับการแจ้งเตือนหรือระบบอัปโหลดระยะไกล:

  • --background o -d: ทำให้ perfetto ออกจากอินเทอร์เฟซบรรทัดคำสั่งและดำเนินการบันทึกต่อในพื้นหลัง
  • --background-wait o -Dคล้ายกับวิธีก่อนหน้านี้ แต่จะต้องรอนานถึง 30 วินาทีเพื่อให้แหล่งข้อมูลทั้งหมดยืนยันว่าได้เริ่มต้นใช้งานแล้ว รหัสออกจะเป็น 0 หากทุกอย่างทำงานอย่างถูกต้อง และจะเป็นค่าอื่นที่ไม่ใช่ 0 หากมีข้อผิดพลาดหรือหมดเวลา
  • --alert-id, --config-id, --config-uid y --subscription-id: ตัวระบุที่เชื่อมโยงการติดตามกับการแจ้งเตือนหรือการกำหนดค่าทริกเกอร์ กำหนดไว้ในระบบ ซึ่งมีประโยชน์ในสถานการณ์การตรวจสอบอัตโนมัติ
  • --out OUT_FILE o -o OUT_FILE: เส้นทางเต็มที่จะบันทึกไฟล์ติดตามหรือ - หากคุณต้องการให้ฉันไป stdoutไดเร็กทอรีโดยทั่วไปใช้เป็น /data/misc/perfetto-traces.
  • --upload: เมื่อการจับภาพเสร็จสิ้น ให้ส่งไฟล์ติดตามไปยังแพ็กเก็ตที่ระบุโดยข้อความ IncidentReportConfig ในการกำหนดค่าต้นแบบ
  • --no-guardrails y --reset-guardrails: พวกเขาควบคุมกลไกการรักษาความปลอดภัยและข้อจำกัดของทรัพยากร เมื่อเปิดใช้งานการอัพโหลดอัตโนมัติ (--upload) ออกแบบมาเพื่อการทดสอบเท่านั้น ไม่ได้ออกแบบมาเพื่อการผลิตโดยเฉพาะ
  • --rsave-for-bugreport: หากการจับภาพมี bugreport_score มากกว่า 0 จะบันทึกการติดตามลงในไฟล์และแสดงเส้นทางเมื่อเสร็จสิ้น เพื่อให้แนบไปกับรายงานข้อผิดพลาดได้ง่าย
  • --query y --query-rawพวกเขาสอบถามสถานะของบริการติดตาม บริการแรกให้ผลลัพธ์ที่อ่านได้ บริการที่สองส่งคืนเนื้อหาที่เข้ารหัสด้วยโปรโตโค้ด tracing_service_state.proto.
  • --help o -h: พิมพ์ความช่วยเหลือในตัวของเครื่องมือ

โหมดแสงของ Perfetto: รวดเร็วและคล้ายกับ Systrace

โหมดแสงของ Perfetto ได้รับการออกแบบมาเพื่อการติดตามอย่างรวดเร็วคล้ายคลึงกันมากกับวิธีที่เคยใช้ในอดีต systraceช่วยให้คุณสามารถเลือกเฉพาะชุดย่อยพื้นฐานของแหล่งที่มา: โดยพื้นฐานแล้ว atrace y ftraceและมันมีประโยชน์ควบคู่ไปด้วย แอปเพื่อเพิ่มประสิทธิภาพการทำงาน.

รูปแบบไวยากรณ์ทั่วไปในโหมดน้ำหนักเบา มันเป็นประมาณนี้:

adb shell perfetto ... --out FILE

ในบรรดาตัวเลือกเฉพาะที่เกี่ยวข้องที่สุดของโหมดแสง เราพบว่า:

  • --time TIME o -t TIME: ระยะเวลาของการติดตามเป็นวินาที นาที หรือชั่วโมง ตัวอย่างเช่น --time 1m จับภาพเป็นเวลาหนึ่งนาที หากไม่ได้ระบุอะไรไว้ ค่าเริ่มต้นจะใช้ 10 วินาที
  • --buffer SIZE o -b SIZE: ขนาดของบัฟเฟอร์วงกลมในหน่วยความจำ ค่าเริ่มต้นมักจะเป็นประมาณนี้ --buffer 32mb.
  • --size SIZE o -s SIZE: ขีดจำกัดขนาดไฟล์สูงสุดบนดิสก์ หากไม่ได้กำหนดค่า Perfetto จะสามารถเขียนลงในบัฟเฟอร์หน่วยความจำได้เท่านั้น
  • --app o -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: การควบคุมสูงสุดและแหล่งข้อมูลเพิ่มเติม

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

รูปแบบไวยากรณ์ปกติสำหรับโหมดปกติ มันเป็น:

adb shell perfetto --config CONFIG_FILE --out FILE

แฟล็กเฉพาะที่เป็นคีย์ในโหมดนี้ เสียง:

  • --config CONFIG_FILE o -c CONFIG_FILE: เส้นทางไปยังไฟล์การกำหนดค่าที่ปฏิบัติตามรูปแบบของ trace_config.proto ใน AOSP ภายในต้นแบบนี้ มีองค์ประกอบต่างๆ เช่น TraceConfig y DataSourceConfig (กำหนดไว้ใน data_source_config.proto) เพื่อเลือกและกำหนดพารามิเตอร์แหล่งข้อมูล
  • --txt: ระบุว่าไฟล์การกำหนดค่าอยู่ในรูปแบบข้อความ pbtxt แทนไบนารี สะดวกมากสำหรับการสร้างต้นแบบในพื้นที่ แต่ไม่แนะนำให้ใช้เป็นรูปแบบการผลิตขั้นสุดท้าย

แหล่งข้อมูลที่เข้ากันได้กับ Perfetto

จุดแข็งที่แท้จริงของ Perfetto อยู่ที่ทรัพยากรต่างๆ ที่สามารถเปิดใช้งานได้แต่ละอันได้รับการกำหนดค่าจากต้นแบบผ่านบล็อกของ DataSourceConfigทั้งนี้ คุณจะมีตัวเลือกให้เลือกมากขึ้นหรือน้อยลง ขึ้นอยู่กับอุปกรณ์ เวอร์ชัน Android และเคอร์เนล

แหล่งข้อมูลประสิทธิภาพใน Android

เหตุการณ์เคอร์เนลที่มี ftrace

แหล่งที่มา ftrace Perfetto ช่วยให้คุณสามารถบันทึกเหตุการณ์เคอร์เนลภายในได้ซึ่งเป็นทองคำบริสุทธิ์เมื่อคุณต้องการเข้าใจว่าทำไมเธรดจึงไม่กำหนดเวลาหรือมีอะไรขัดขวาง CPU ในช่วงเวลาใดก็ตาม

เพื่อเปิดใช้งาน ftrace จากการตั้งค่า ฟิลด์จะต้องได้รับการกำหนด ftrace_config ภายใน DataSourceConfig...โดยเลือกเหตุการณ์เฉพาะที่เราต้องการติดตาม ตัวอย่างทั่วไปที่เกี่ยวข้องกับการจัดตารางกระบวนการ ได้แก่:

  • sched/sched_switch
  • sched/sched_wakeup
  • sched/sched_wakeup_new
  • sched/sched_process_exec
  • sched/sched_process_exit
  • sched/sched_process_fork
  • sched/sched_process_free
  • sched/sched_process_hang
  • sched/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_MT en EventHub.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ฯลฯ : การใช้กระบวนการ เซ็นเซอร์ เครื่องสั่น เวลาเบื้องหน้า การซิงโครไนซ์ งาน ฯลฯ
  • nt y gn: สถิติเครือข่าย (ไบต์และแพ็กเก็ตมือถือ/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 Heap y Dalvik Heap: การใช้งานหน่วยความจำฮีปดั้งเดิมและ VM Heap Alloc แสดงให้เห็นว่าผู้จัดสรรเชื่อว่าสิ่งใดถูกสงวนไว้ ซึ่งอาจสูงกว่า PSS เนื่องมาจากผลของไซโกตและหน่วยความจำที่ใช้ร่วมกัน
  • .so mmap, .dex mmap, .oat mmap y .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.

วิธีแก้ไขเพื่อปรับปรุงประสิทธิภาพ Android ที่ช้า
บทความที่เกี่ยวข้อง:
โซลูชันครบวงจรเพื่อปรับปรุงประสิทธิภาพของ Android ที่ช้า: คู่มือฉบับสมบูรณ์