แก้ไขปัญหาด้านประสิทธิภาพที่พบได้ทั่วไป

การมอบประสบการณ์การใช้งานแอปที่ราบรื่น เสถียร และประหยัดแบตเตอรี่ต้องอาศัยการระบุและแก้ไขปัญหาคอขวดด้านประสิทธิภาพทั่วไปในด้านความเสถียร การแสดงผล UI การใช้หน่วยความจำ งานในเบื้องหลัง เวลาในการตอบสนองเมื่อเริ่มต้น และการเพิ่มประสิทธิภาพบิลด์

คำแนะนำในส่วนนี้จะอธิบายลักษณะการทำงานของแพลตฟอร์ม Android ที่เกี่ยวข้องกับปัญหาแต่ละประเภท รวมถึงอธิบายวิธีวินิจฉัย สร้างโปรไฟล์ และแก้ไขปัญหาโดยใช้เครื่องมือต่างๆ เช่น Android Studio Profiler, Perfetto, Logcat และ ApplicationExitInfo

ความเสถียร

  • ANR: วินิจฉัยและแก้ไขข้อผิดพลาดแอปพลิเคชันไม่ตอบสนอง (ANR) ที่เกิดจากเธรด UI ที่ถูกบล็อก, I/O ของเธรดหลัก, การแย่งชิงล็อก หรือตัวรับสัญญาณออกอากาศที่ทำงานช้า
  • ข้อขัดข้อง: อ่านสแต็กเทรซ ตรวจสอบเอาต์พุต Logcat และป้องกันข้อยกเว้นที่ไม่ได้จัดการและสัญญาณเนทีฟ

การแสดงผลและการเริ่มต้น

  • การแสดงผลช้า: ระบุและแก้ไขเฟรม UI ที่ถูกทิ้ง หรือค้าง (>16ms และ >700ms) ซึ่งเกิดจากเลย์เอาต์ที่มีค่าใช้จ่ายสูง การส่งผ่าน การเชื่อมโยง หรือการหยุดชะงักของเทรดหลัก
  • เซสชันที่ช้า (เกมเท่านั้น): วัดการเว้นระยะเฟรมด้วย SurfaceFlinger และเพิ่มประสิทธิภาพอัตราเฟรมของเกม โดยใช้การเว้นระยะเฟรมของ Android (Swappy), Vulkan และ Android Dynamic Performance Framework (ADPF)
  • เวลาเริ่มต้นของแอป: ทำความเข้าใจการเปิดตัวแบบเย็น อุ่น และร้อน วัดเวลาที่ใช้ในการแสดงผลครั้งแรก (TTID) และ เวลาที่ใช้ในการแสดงผลทั้งหมด (TTFD) รวมถึงเพิ่มประสิทธิภาพการทำงานเมื่อเริ่มต้น

การจัดการหน่วยความจำ

  • Low Memory Killer (LMK): ทำความเข้าใจวิธีที่ ดีมอน Low Memory Killer ของ Android (lmkd) จัดลําดับความสําคัญของกระบวนการผ่าน oom_adj_score และโปรไฟล์หน่วยความจำที่ใช้ใน Android Studio, Unity และ Unreal Engine
  • การใช้งานหน่วยความจำ (RSS แบบไม่ระบุตัวตน + Swap): วัดและลดขนาดชุดหน่วยความจำที่ใช้งาน (RSS) แบบไม่ระบุตัวตนและ Swap ของแอปในสถานะเบื้องหน้า บริการ และเบื้องหลัง
  • การใช้งานหน่วยความจำบิตแมป: วินิจฉัยการจัดสรรบิตแมปที่มีขนาดใหญ่เกินไปหรือรั่วไหล และปล่อยบัฟเฟอร์กราฟิก เมื่อคอมโพเนนต์ UI ย้ายไปทำงานในเบื้องหลัง

แบตเตอรี่และการทำงานในเบื้องหลัง

สิทธิ์และการเพิ่มประสิทธิภาพบิลด์

  • การปฏิเสธสิทธิ์: ขอสิทธิ์รันไทม์ ตามบริบทและอธิบายเหตุผลของสิทธิ์ให้ผู้ใช้ทราบอย่างชัดเจน
  • การเพิ่มประสิทธิภาพโค้ด DEX: กำหนดค่ากฎการลดขนาด การปรับให้ยากต่อการอ่าน (Obfuscation) และการเพิ่มประสิทธิภาพ R8 เพื่อลดขนาด DEX และปรับปรุงประสิทธิภาพรันไทม์