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