แก้ไขข้อบกพร่อง 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

ตรวจสอบรหัสเกม

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

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

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

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

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

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