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

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

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

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

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

บริการการรายงานต่างๆ มีวิธีบันทึก ANR ที่แตกต่างกัน มี เพื่อเพิ่มโอกาสในการรับข้อมูลที่ถูกต้อง สนับสนุนการตัดสินใจของคุณในการแก้ไข 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 (ไฮไลต์เป็นสีน้ำเงิน) คือชื่อที่กำหนดไว้ในไฟล์คำจำกัดความการประกอบ Logger คือ ชื่อคลาส (ไฮไลต์ด้วยสีแดง) ในสคริปต์ C# ตามด้วยพารามิเตอร์ ชื่อฟังก์ชัน (ไฮไลต์สีเขียว) สุดท้ายคือชื่อเต็ม ที่ตัวแปลง IL2CPP สร้างขึ้น (ไฮไลต์เป็นสีส้ม)

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

ตรวจสอบโค้ดเกมโดยทำตามขั้นตอนต่อไปนี้

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

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

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

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

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

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

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

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

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

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

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