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

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

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

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

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

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

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

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

วิเคราะห์รายงานจากบริการรายงานและตรวจสอบว่า Stack Trace อยู่ในรูปแบบที่มนุษย์อ่านได้หรือไม่ ดูข้อมูลเพิ่มเติมได้ที่สร้างสัญลักษณ์ข้อขัดข้องและ ANR ของ Android สำหรับเกม 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++ จะเป็นไปตามชื่อ Assembly ที่กำหนดไว้ในโปรเจ็กต์ Unity มิเช่นนั้น ชื่อไฟล์จะเป็นชื่อ Assembly-C# เริ่มต้น เช่น รูปที่ 3 แสดงข้อผิดพลาดในไฟล์ Game.cpp (ไฮไลต์เป็นสีน้ำเงิน) ซึ่งเป็นชื่อที่กำหนดไว้ในไฟล์ Assembly Definition Logger คือ ชื่อคลาส (ไฮไลต์เป็นสีแดง) ในสคริปต์ C# ตามด้วย ชื่อฟังก์ชัน (ไฮไลต์เป็นสีเขียว) สุดท้ายคือชื่อเต็ม ที่ตัวแปลง IL2CPP สร้างขึ้น (ไฮไลต์เป็นสีส้ม)

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

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

  • ตรวจสอบโปรเจ็กต์ C# เพื่อหาโค้ดที่น่าสงสัย โดยปกติแล้ว ข้อยกเว้นที่ไม่ได้จัดการของ C# จะไม่ทำให้เกิด ANR หรือแอปพลิเคชันขัดข้อง อย่างไรก็ตาม โปรดตรวจสอบว่าโค้ด ทํางานได้อย่างถูกต้องในสถานการณ์ต่างๆ ตรวจสอบว่าโค้ด ใช้โมดูลเครื่องมือของบุคคลที่สามหรือไม่ และวิเคราะห์ว่าการเปิดตัวล่าสุด ทำให้เกิดข้อผิดพลาดหรือไม่ นอกจากนี้ ให้ตรวจสอบว่าคุณเพิ่งอัปเดต Unity หรือข้อผิดพลาดเกิดขึ้นในอุปกรณ์บางเครื่องเท่านั้น
  • ส่งออกเกมเป็นโปรเจ็กต์ Android Studio เมื่อมีสิทธิ์เข้าถึงซอร์สโค้ด C# ที่แปลงแล้วของเกมอย่างสมบูรณ์ คุณจะค้นหาฟังก์ชัน ที่ทำให้เกิด ANR ได้ โค้ด C++ ดูแตกต่างจากโค้ด C# มาก และโดยปกติการแปลงโค้ดมักไม่มีปัญหา หากพบปัญหา โปรดยื่น คำขอแจ้งปัญหาไปยัง Unity
  • ตรวจสอบซอร์สโค้ดของเกมและตรวจสอบว่ามีการล้างข้อมูลตรรกะที่ทำงานในแฮนเดิล 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, เครื่องมือสร้างโปรไฟล์ CPU Android และ perfetto

โค้ดเอนจิน Unity

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

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