การมอบประสบการณ์การใช้งานแอปที่ราบรื่น เสถียร และประหยัดแบตเตอรี่ต้องอาศัยการระบุและแก้ไขปัญหาคอขวดด้านประสิทธิภาพทั่วไปในด้านความเสถียร การแสดงผล 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 ย้ายไปทำงานในเบื้องหลัง
แบตเตอรี่และการทำงานในเบื้องหลัง
- Wake Lock ที่มากเกินไป: หลีกเลี่ยง
การถือ Wake Lock บางส่วนเป็นเวลานานและย้ายงานในเบื้องหลัง
ไปที่
WorkManagerหรือJobScheduler - Wake Lock แบบต่อเนื่องบางส่วน: ตรวจสอบว่า Wake Lock บางส่วนที่ได้รับทุกรายการได้รับการปล่อยอย่างถูกต้องในเส้นทางการดำเนินการ และข้อผิดพลาดทั้งหมด
- การปลุกระบบบ่อยเกินไป: ลดการปลุกระบบด้วยการตั้งปลุกที่แน่นอน และจัดกลุ่มหรือเลื่อนงานพื้นหลังที่กำหนดเวลาไว้
- การสแกนหา Wi-Fi ในเบื้องหลังบ่อยเกินไป: ลดความถี่ในการสแกนหา Wi-Fi ในเบื้องหลัง และใช้ API การเชื่อมต่อและตำแหน่งแบบพาสซีฟหรือแบบเป็นกลุ่ม
- การใช้เครือข่ายในเบื้องหลังมากเกินไป:
การโอนเครือข่ายมือถือในเบื้องหลังแบบเป็นกลุ่มและเลื่อนเวลาโดยใช้ข้อจำกัด
WorkManager - การใช้งานแบตเตอรี่มากเกินไป: วินิจฉัยการใช้แบตเตอรี่สูงในอุปกรณ์เคลื่อนที่และอุปกรณ์ Wear OS โดยการสร้างโปรไฟล์กิจกรรมของ CPU เซ็นเซอร์ และวิทยุ
สิทธิ์และการเพิ่มประสิทธิภาพบิลด์
- การปฏิเสธสิทธิ์: ขอสิทธิ์รันไทม์ ตามบริบทและอธิบายเหตุผลของสิทธิ์ให้ผู้ใช้ทราบอย่างชัดเจน
- การเพิ่มประสิทธิภาพโค้ด DEX: กำหนดค่ากฎการลดขนาด การปรับให้ยากต่อการอ่าน (Obfuscation) และการเพิ่มประสิทธิภาพ R8 เพื่อลดขนาด DEX และปรับปรุงประสิทธิภาพรันไทม์