แก้ไขข้อบกพร่อง ANR

การแก้ปัญหา ANR ในเกม Unity เป็นกระบวนการที่เป็นระบบ ดังนี้

รูปที่ 1 ขั้นตอนการแก้ปัญหา ANR ในเกม Unity

ผสานรวมบริการรายงาน

บริการรายงาน เช่น Android Vitals, Firebase Crashlytics และ Backtrace (พาร์ทเนอร์ Unity ที่ผ่านการรับรอง) ให้การบันทึกและวิเคราะห์ข้อผิดพลาดสำหรับเกมของคุณในวงกว้าง ผสานรวม SDK บริการการรายงานลงในเกมของคุณตั้งแต่เนิ่นๆ ในรอบการพัฒนา วิเคราะห์ว่าบริการการรายงานใดเหมาะกับความต้องการและงบประมาณของเกมของคุณมากที่สุด

บริการรายงานต่างๆ มีวิธีบันทึก ANR แตกต่างกัน รวมบริการรายงานที่ 2 เพื่อเพิ่มโอกาสในการได้รับข้อมูลที่ถูกต้องเพื่อสนับสนุนการตัดสินใจในการแก้ไข ANR

การผสานรวม SDK การรายงานจะไม่ส่งผลต่อประสิทธิภาพของเกมหรือขนาด APK

วิเคราะห์สัญลักษณ์

วิเคราะห์รายงานจากบริการรายงานและตรวจสอบว่าสแต็กเทรซอยู่ในรูปแบบที่มนุษย์อ่านได้หรือไม่ ดูข้อมูลเพิ่มเติมที่สัญลักษณ์แทนข้อขัดข้องของ Android และ ANR สำหรับเกม Unity

รูปที่ 2 Crashlytics แสดงรหัสบิลด์และไม่มีสัญลักษณ์ libil2cpp.so

วิธีตรวจสอบรหัสการสร้างสัญลักษณ์

หากระบบรายงานแสดงรหัสบิลด์ที่ขาดหายไป แต่สัญลักษณ์บิลด์ยังคงอยู่ในพื้นที่เก็บข้อมูลเครื่องของบิลด์ คุณสามารถตรวจสอบรหัสบิลด์ของสัญลักษณ์แล้วอัปโหลดไปยังบริการการรายงานได้ ไม่เช่นนั้น คุณจะต้องสร้างบิลด์ใหม่เพื่ออัปโหลดไฟล์สัญลักษณ์

ใน Windows หรือ macOS ให้ทำดังนี้

  1. ไปที่โฟลเดอร์สัญลักษณ์ตามแบ็กเอนด์สคริปต์ (ดูวิธีแก้ปัญหา)
    1. ใช้คำสั่งต่อไปนี้ (ใน Windows ให้ใช้ Cygwin เพื่อเรียกใช้ยูทิลิตี readelf)
    2. คุณใช้ Grep เพื่อกรองเอาต์พุตข้อความหรือไม่ก็ได้
    3. มองหารหัสบิลด์
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

ตรวจสอบโค้ดเกม

เมื่อสแต็กเทรซแสดงฟังก์ชันในไลบรารี libil2cpp.so แสดงว่าข้อผิดพลาดเกิดขึ้นในโค้ด C# ซึ่งแปลงเป็น C++ แล้ว ไลบรารี libil2cpp.so ไม่ได้มีแค่โค้ดเกมของคุณ แต่ยังมีพลักอินและแพ็กเกจด้วย

ชื่อไฟล์ C++ จะเป็นไปตามชื่อแอสเซมบลีที่กําหนดไว้ในโปรเจ็กต์ Unity มิเช่นนั้น ชื่อไฟล์จะมีชื่อ Assembly-C# เริ่มต้น ตัวอย่างเช่น รูปที่ 3 แสดงข้อผิดพลาดในไฟล์ Game.cpp (ไฮไลต์สีน้ำเงิน) ซึ่งเป็นชื่อที่กําหนดไว้ในไฟล์คําจํากัดความของ Assembly Logger คือชื่อคลาส (ไฮไลต์ด้วยสีแดง) ในสคริปต์ C# ตามด้วยชื่อฟังก์ชัน (ไฮไลต์ด้วยสีเขียว) สุดท้ายคือชื่อเต็มซึ่งเครื่องมือแปลง IL2CPP สร้างขึ้น (ไฮไลต์ด้วยสีส้ม)

รูปที่ 3 ทดสอบสแต็กการเรียกใช้โปรเจ็กต์จาก Backtrace

ตรวจสอบโค้ดเกมโดยทำดังนี้

  • ตรวจสอบโปรเจ็กต์ C# เพื่อหาโค้ดที่น่าสงสัย โดยปกติแล้ว ข้อยกเว้นของ C# ที่ไม่มีการจัดการ จะไม่ทำให้เกิด ANR หรือแอปพลิเคชันขัดข้อง อย่างไรก็ตาม โปรดตรวจสอบว่าโค้ดทำงานได้อย่างถูกต้องในสถานการณ์ต่างๆ ตรวจสอบว่าโค้ดใช้โมดูลเครื่องมือของบุคคลที่สามหรือไม่ และวิเคราะห์ว่ารุ่นล่าสุดได้ทำให้เกิดข้อผิดพลาดหรือไม่ นอกจากนี้ ให้ตรวจสอบว่าคุณเพิ่งอัปเดต Unity ไปเมื่อเร็วๆ นี้หรือ ข้อผิดพลาดเกิดขึ้นเฉพาะบนอุปกรณ์บางเครื่องหรือไม่
  • ส่งออกเกมเป็นโปรเจ็กต์ Android Studio เมื่อเข้าถึงซอร์สโค้ด C# ที่แปลงแล้วของเกมได้อย่างเต็มที่ คุณจะค้นหาฟังก์ชันที่ทำให้เกิด ANR ได้ โค้ด C++ ดูแตกต่างจากโค้ด C# มาก และการแปลงโค้ดไม่ค่อยมีปัญหา หากพบปัญหา โปรดยื่นคำขอรับการสนับสนุนกับ Unity
  • ตรวจสอบซอร์สโค้ดของเกมและดูว่าตรรกะที่ทำงานอยู่ใน Callback OnApplicationFocus() และ OnApplicationPause() ได้รับการล้างออกอย่างเหมาะสมแล้ว
    • เอ็นจิ้น Unity มีระยะหมดเวลาเพื่อหยุดการดำเนินการชั่วคราว ภาระงานมากเกินไปในคอลแบ็กเหล่านี้อาจทำให้เกิด ANR
    • เพิ่มบันทึกหรือเบรดครัมบ์ลงในส่วนต่างๆ ของโค้ดเพื่อปรับปรุงการวิเคราะห์ข้อมูล
  • ใช้ Unity Profiler เพื่อตรวจสอบประสิทธิภาพของเกม โปรไฟล์แอปยังเป็นวิธีที่ยอดเยี่ยมในการช่วยระบุจุดคอขวดที่อาจทำให้เกิด ANR ด้วย
  • วิธีที่ดีในการระบุการดำเนินการ I/O ที่ใช้เวลานานในเทรดหลักคือการใช้โหมดเข้มงวด
  • วิเคราะห์ Android Vitals และประวัติของบริการรายงานอื่นๆ และตรวจสอบเวอร์ชันที่เผยแพร่ของเกมที่เกิดข้อผิดพลาดมากที่สุด ตรวจสอบซอร์สโค้ดในประวัติการควบคุมเวอร์ชันและเปรียบเทียบการเปลี่ยนแปลงโค้ดระหว่างรุ่น หากพบสิ่งใดที่น่าสงสัย ให้ทดสอบการเปลี่ยนแปลงหรือวิธีแก้ไขแต่ละรายการแยกกัน
  • ดูประวัติการรายงาน ANR ของ Google Play สำหรับอุปกรณ์และเวอร์ชัน Android ที่ได้รับ ANR มากที่สุด หากอุปกรณ์หรือเวอร์ชันล้าสมัย คุณอาจไม่ต้องสนใจก็ได้หากการละเว้นไม่ส่งผลต่อความสามารถในการทำกำไรของเกม ศึกษาข้อมูลอย่างละเอียด เนื่องจากผู้ใช้บางกลุ่มจะเล่นเกมของคุณไม่ได้อีกต่อไป ดูข้อมูลเพิ่มเติมได้ที่แดชบอร์ดการเผยแพร่
  • ตรวจสอบซอร์สโค้ดของเกมเพื่อให้แน่ใจว่าคุณไม่ได้เรียกใช้โค้ดที่อาจทำให้เกิดปัญหา เช่น finish อาจก่อให้เกิดความเสียหายหากใช้ไม่ถูกต้อง ดูข้อมูลเพิ่มเติมเกี่ยวกับการพัฒนาแอป Android ได้ในคู่มือนักพัฒนาแอป Android
  • หลังจากตรวจสอบข้อมูลและส่งออกบิลด์ของเกมไปยัง Android Studio แล้ว คุณก็จัดการโค้ด C และ C++ ได้แล้ว คุณจึงใช้ประโยชน์จากเครื่องมือได้อย่างเต็มที่ นอกเหนือจากโซลูชันมาตรฐานของ Unity เช่น Android Memory Profiler, Android CPU Profiler และ perfetto

โค้ดเครื่องมือของ Unity

หากต้องการดูว่า ANR เกิดขึ้นที่ด้านข้างของเครื่องมือ Unity หรือไม่ ให้ตรวจสอบ libUnity.so หรือ libMain.so ในสแต็กเทรซ หากพบ ให้ทำตามขั้นตอนต่อไปนี้

  • ขั้นแรก ให้ค้นหาช่องชุมชน (ฟอรัม Unity, การสนทนาของ Unity, Stackoverflow)
  • หากไม่พบรายการใดเลย ให้รายงานข้อบกพร่องเพื่อแก้ไขปัญหา ระบุสแต็กเทรซที่แปลงสัญลักษณ์เพื่อให้วิศวกรของเครื่องมือค้นหาเข้าใจและแก้ไขข้อผิดพลาดได้ดียิ่งขึ้น
  • ตรวจสอบว่า Unity LTS เวอร์ชันล่าสุดมีการปรับปรุงที่เกี่ยวข้องกับปัญหาของคุณหรือไม่ หากใช่ ให้อัปเกรดเกมเพื่อใช้เวอร์ชันดังกล่าว (โซลูชันนี้อาจทำได้สำหรับ นักพัฒนาซอฟต์แวร์บางรายเท่านั้น)
  • หากโค้ดของคุณใช้ Activity ที่กำหนดเองแทนค่าเริ่มต้น ให้ตรวจสอบโค้ด Java เพื่อให้แน่ใจว่ากิจกรรมไม่ก่อให้เกิดปัญหาใดๆ

SDK ของบุคคลที่สาม

  • ตรวจสอบว่าไลบรารีของบุคคลที่สามทั้งหมดเป็นเวอร์ชันล่าสุดและไม่มีรายงานข้อขัดข้องหรือ ANR สำหรับ Android เวอร์ชันล่าสุด
  • ไปที่ฟอรัม Unity เพื่อดูว่าข้อผิดพลาดได้รับการแก้ไขแล้วในเวอร์ชันที่ใหม่กว่าหรือ Unity หรือสมาชิกชุมชนมีวิธีแก้ปัญหาให้หรือไม่
  • ตรวจสอบรายงาน ANR ของ Google Play และตรวจสอบว่า Google ไม่ได้ระบุข้อผิดพลาดนั้นไว้ Google ทราบเกี่ยวกับ ANR บางรายการและกำลังดำเนินการแก้ไขอยู่

ไลบรารีของระบบ

โดยปกติแล้วไลบรารีของระบบจะอยู่นอกเหนือการควบคุมของนักพัฒนาแอป แต่ไม่ได้คิดเป็นสัดส่วนที่มากของ ANR นอกจากการติดต่อนักพัฒนาไลบรารีหรือเพิ่มบันทึกเพื่อจำกัดขอบเขตปัญหาแล้ว ANR ของไลบรารีระบบยังแก้ไขได้ยาก

เหตุผลที่ออก

ApplicationExitInfo เป็น Android API สำหรับทำความเข้าใจสาเหตุของ ANR หากเกมของคุณใช้ Unity 6 ขึ้นไป คุณจะเรียกใช้ ApplicationExitInfo ได้โดยตรง สำหรับ Unity เวอร์ชันเก่า คุณต้องใช้ปลั๊กอินของคุณเองเพื่อเปิดใช้การเรียก ApplicationExitInfo จาก Unity

Crashlytics ก็ใช้ ApplicationExitInfo ด้วยเช่นกัน แต่การติดตั้งใช้งานของคุณเองจะช่วยให้คุณควบคุมได้ละเอียดยิ่งขึ้นและสามารถใส่ข้อมูลที่ตรงมากขึ้น