ANR'lerde hata ayıklama

Unity oyununuzdaki ANR'leri çözmek için sistematik bir süreç izlemeniz gerekir:

1. şekil. Unity oyunlarındaki ANR'leri çözme adımları.

Raporlama hizmetlerini entegre etme

Android vitals, Firebase Crashlytics ve Backtrace (sertifikalı bir Unity iş ortağı) gibi raporlama hizmetleri, oyununuz için büyük ölçekte hata günlüğü kaydı ve analizi sağlar. Geliştirme döngüsünün başlarında raporlama hizmetleri SDK'larını oyununuza entegre edin. Hangi raporlama hizmetinin oyun ihtiyaçlarınıza ve bütçenize en uygun olduğunu analiz edin.

Farklı raporlama hizmetleri, ANR'leri farklı şekillerde yakalar. ANR'leri düzeltme kararınızı desteklemek için geçerli veriler elde etme olasılığını artırmak üzere ikinci bir raporlama hizmeti ekleyin.

Raporlama SDK'larının entegrasyonu, oyun performansını veya APK boyutunu etkilemez.

Sembolleri analiz etme

Raporlama hizmetinizden gelen raporları analiz edin ve yığın izlerinin insan tarafından okunabilir biçimde olup olmadığını kontrol edin. Daha fazla bilgi için Unity oyunlarında Android kilitlenmelerini ve ANR'leri sembolleştirme başlıklı makaleyi inceleyin.

Şekil 2. Crashlytics'te derleme kimliği gösteriliyor ve libil2cpp.so sembolleri eksik.

Sembol derleme kimliği nasıl kontrol edilir?

Raporlama sistemi eksik derleme kimliğini gösteriyorsa ancak derleme sembolleri derleme makinesi depolama alanında hâlâ mevcutsa sembollerin derleme kimliğini kontrol edip raporlama hizmetine yükleyebilirsiniz. Aksi takdirde, sembol dosyalarını yüklemek için yeni bir derleme gerekir.

Windows veya macOS'te:

  1. Komut dosyası oluşturma arka ucunuza göre semboller klasörüne gidin (Çözüm bölümüne bakın):
    1. Aşağıdaki komutu kullanın (Windows'da readelf yardımcı programını çalıştırmak için Cygwin'i kullanın)
    2. Grep kullanımı, metin çıkışını filtrelemek için isteğe bağlıdır.
    3. Derleme kimliğini bulun.
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Oyun kodunu inceleme

Yığın izlemede libil2cpp.so kitaplığındaki bir işlev gösterildiğinde hata, C++'ya dönüştürülen C# kodunda oluşmuştur. libil2cpp.so kitaplığında yalnızca oyun kodunuz değil, eklentiler ve paketler de bulunur.

C++ dosya adı, Unity projesinde tanımlanan derleme adını takip eder. Aksi takdirde, dosya adı varsayılan Assembly-C# adını alır. Örneğin, Şekil 3'te, Assembly Definition dosyasında tanımlanan ad olan Game.cpp dosyasındaki hata (mavi renkle vurgulanmış) gösterilmektedir. Logger, C# komut dosyasındaki sınıf adıdır (kırmızı renkle vurgulanmıştır). Ardından işlev adı (yeşil renkle vurgulanmıştır) gelir. Son olarak, IL2CPP dönüştürücünün oluşturduğu tam ad (turuncu renkle vurgulanmıştır) gelir.

3.şekil Backtrace'ten proje çağrı yığınını test edin.

Aşağıdaki adımları uygulayarak oyun kodunuzu inceleyin:

  • C# projesinde şüpheli kod olup olmadığını inceleyin. Genellikle, C# işlenmemiş istisnaları ANR'ye veya uygulama kilitlenmesine neden olmaz. Buna rağmen kodun farklı durumlarda düzgün çalıştığından emin olun. Kodun üçüncü taraf motor modülü kullanıp kullanmadığını kontrol edin ve son sürümde hatanın ortaya çıkıp çıkmadığını analiz edin. Ayrıca, Unity'yi yakın zamanda güncelleyip güncellemediğinizi veya hatanın yalnızca belirli cihazlarda oluşup oluşmadığını da inceleyin.
  • Oyunu Android Studio projesi olarak dışa aktarın. Oyununuzun dönüştürülmüş C# kaynak koduna tam erişim sayesinde ANR'ye neden olan işlevi bulabilirsiniz. C++ kodu, C# kodunuzdan çok farklı görünüyor. Kod dönüştürme işleminde nadiren sorun yaşanır. Bir şey bulursanız Unity'ye destek kaydı gönderin.
  • Oyunun kaynak kodunu inceleyin ve OnApplicationFocus() ile OnApplicationPause() geri çağırma işlevlerinde çalışan tüm mantığın uygun şekilde temizlendiğinden emin olun.
    • Unity motorunda yürütmeyi duraklatmak için bir zaman aşımı vardır. Bu geri çağırmalardaki aşırı iş yükü ANR'ye neden olabilir.
    • Veri analizinizi geliştirmek için kodun belirli bölümlerine günlükler veya izleme bilgileri ekleyin.
  • Oyunun performansını incelemek için Unity Profiler'ı kullanın. Uygulamanızın profilini oluşturmak, ANR'ye neden olabilecek sorunları belirlemenize yardımcı olacak harika bir yöntemdir.
  • Ana iş parçacığındaki uzun G/Ç işlemlerini belirlemenin harika bir yolu katı modu kullanmaktır.
  • Android Vitals'ı veya başka bir raporlama hizmeti geçmişini analiz edin ve hatanın en çok yaşandığı oyunun yayın sürümlerini kontrol edin. Sürüm kontrolü geçmişinizdeki kaynak kodunuzu inceleyin ve sürümler arasındaki kod değişikliklerini karşılaştırın. Şüpheli bir durumla karşılaşırsanız her değişikliği veya olası düzeltmeyi ayrı ayrı deneyin.
  • En fazla ANR alan cihazlar ve Android sürümleri için Google Play ANR raporlama geçmişini inceleyin. Cihazlar veya sürümler eski ise oyunun kârlılığını etkilemediği sürece bunları güvenle yoksayabilirsiniz. Belirli bir kullanıcı grubu artık oyununuzu oynayamayacağından verileri dikkatlice inceleyin. Daha fazla bilgi için Dağıtım kontrol paneli başlıklı makaleyi inceleyin.
  • Soruna neden olabilecek bir kodu çağırmadığınızdan emin olmak için oyunun kaynak kodunu inceleyin. Örneğin, finish kodu doğru kullanılmadığında yıkıcı olabilir. Android geliştirme hakkında daha fazla bilgi edinmek için Android geliştirici kılavuzlarına göz atın.
  • Verileri inceleyip oyun derlemesini Android Studio'ya aktardıktan sonra C ve C++ koduyla çalışırsınız. Bu nedenle, Unity'nin standart çözümlerinin ötesinde, Android Memory Profiler, Android CPU Profiler ve perfetto gibi araçlardan tam olarak yararlanabilirsiniz.

Unity motor kodu

Unity motoru tarafında ANR olup olmadığını öğrenmek için yığın izlerinde libUnity.so veya libMain.so olup olmadığını kontrol edin. Bulursanız aşağıdaki adımları uygulayın:

  • Öncelikle topluluk kanallarında (Unity Forums, Unity Discussions, Stackoverflow) arama yapın.
  • Herhangi bir şey bulamazsanız sorunu çözmek için hata bildiriminde bulunun. Motor mühendislerinin hatayı daha iyi anlayıp çözebilmesi için sembolleştirilmiş bir yığın izleme sağlayın.
  • En yeni Unity LTS sürümünde sorunlarınızla ilgili iyileştirmeler yapılıp yapılmadığını kontrol edin. Bu durumda, oyunu söz konusu sürümü kullanacak şekilde yükseltin. (Bu çözüm yalnızca bazı geliştiriciler için mümkün olabilir.)
  • Kodunuzda varsayılan yerine özel bir Activity kullanılıyorsa etkinliğin herhangi bir soruna neden olmadığından emin olmak için Java kodunu inceleyin.

Üçüncü taraf SDK'sı

  • Tüm üçüncü taraf kitaplıklarının güncel olduğundan ve Android'in en yeni sürümünde kilitlenme veya ANR raporu bulunmadığından emin olun.
  • Daha sonraki bir sürümde hataların çözülüp çözülmediğini veya Unity ya da bir topluluk üyesi tarafından geçici çözüm sunulup sunulmadığını görmek için Unity Forumları'na gidin.
  • Google Play ANR raporunu inceleyin ve hatanın Google tarafından daha önce tanımlanmadığından emin olun. Google, bazı ANR'lerin farkında ve bunları düzeltmek için aktif olarak çalışıyor.

Sistem kitaplığı

Sistem kitaplıkları genellikle geliştiricinin kontrolünden uzaktır ancak ANR'lerin önemli bir yüzdesini oluşturmaz. Kitaplık geliştiricisiyle iletişime geçmenin veya sorunu daraltmak için günlük eklemenin dışında, sistem kitaplığı ANR'lerini çözmek zordur.

Çıkış nedenleri

ApplicationExitInfo, ANR nedenlerini anlamaya yönelik bir Android API'sidir. Oyununuzda Unity 6 veya sonraki bir sürüm kullanılıyorsa ApplicationExitInfo'ı doğrudan arayabilirsiniz. Daha eski Unity sürümlerinde, Unity'den ApplicationExitInfo çağrılarını etkinleştirmek için kendi eklentinizi uygulamanız gerekir.

Crashlytics de ApplicationExitInfo kullanır. Ancak kendi uygulamanız, daha ayrıntılı kontrol sağlar ve daha alakalı bilgiler eklemenize olanak tanır.