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

ผสานรวมบริการการรายงาน
บริการรายงาน เช่น Android Vitals, Firebase Crashlytics และ Backtrace (พาร์ทเนอร์ Unity ที่ผ่านการรับรอง) จะมีการบันทึกและวิเคราะห์ข้อผิดพลาดของเกมในวงกว้าง ผสานรวม SDK บริการการรายงานเข้ากับเกมตั้งแต่เนิ่นๆ ในวงจรการพัฒนา วิเคราะห์ว่าบริการรายงานใดเหมาะกับความต้องการและงบประมาณของเกมมากที่สุด
บริการรายงานต่างๆ มีวิธีบันทึก ANR แตกต่างกัน รวมบริการรายงานที่ 2 เพื่อเพิ่มโอกาสในการได้รับข้อมูลที่ถูกต้องเพื่อสนับสนุนการตัดสินใจในการแก้ไข ANR
การผสานรวม SDK การรายงานจะไม่ส่งผลต่อประสิทธิภาพของเกมหรือขนาด APK
วิเคราะห์สัญลักษณ์
วิเคราะห์รายงานจากบริการรายงานและตรวจสอบว่าสแต็กเทรซอยู่ในรูปแบบที่มนุษย์อ่านได้หรือไม่ ดูข้อมูลเพิ่มเติมที่สัญลักษณ์แทนข้อขัดข้องของ Android และ ANR สำหรับเกม Unity

libil2cpp.so
วิธีตรวจสอบรหัสการสร้างสัญลักษณ์
หากระบบการรายงานแสดงรหัสบิลด์ที่ขาดหายไป แต่สัญลักษณ์บิลด์ยังคงอยู่ในพื้นที่เก็บข้อมูลของเครื่องบิลด์ คุณสามารถตรวจสอบรหัสบิลด์ของสัญลักษณ์ แล้วอัปโหลดไปยังบริการการรายงานได้ ไม่เช่นนั้น คุณจะต้องสร้างบิลด์ใหม่เพื่ออัปโหลดไฟล์สัญลักษณ์
ใน Windows หรือ macOS ให้ทำดังนี้
- ไปที่โฟลเดอร์สัญลักษณ์ตามแบ็กเอนด์สคริปต์ (ดูวิธีแก้ปัญหา)
- ใช้คำสั่งต่อไปนี้ (ใน Windows ให้ใช้ Cygwin เพื่อเรียกใช้ยูทิลิตี
readelf
) - คุณใช้ Grep เพื่อกรองเอาต์พุตข้อความหรือไม่ก็ได้
- มองหารหัสบิลด์
- ใช้คำสั่งต่อไปนี้ (ใน Windows ให้ใช้ Cygwin เพื่อเรียกใช้ยูทิลิตี
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 สร้างขึ้น (ไฮไลต์ด้วยสีส้ม)

ตรวจสอบโค้ดเกมโดยทำดังนี้
- ตรวจสอบโปรเจ็กต์ 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 Discussions, 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
ด้วยเช่นกัน แต่การติดตั้งใช้งานของคุณเองจะช่วยให้คุณควบคุมได้ละเอียดยิ่งขึ้นและสามารถใส่ข้อมูลที่ตรงมากขึ้น