ANR'lerde hata ayıklama

Unity oyununuzda ANR'leri çözmek sistematik bir süreçtir:

Şekil 1. Unity oyunlarında 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 geniş ölçekte hata günlüğü ve analiz sağlar. Raporlama hizmetleri SDK'larını geliştirme döngüsünün başlarında oyununuza entegre edin. Oyun ihtiyaçlarınıza ve bütçenize en uygun raporlama hizmetini analiz edin.

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

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

Simgeleri analiz etme

Raporlama hizmetinizdeki raporları analiz edin ve yığın izlemelerinin kullanıcı tarafından okunabilir biçimde olup olmadığını kontrol edin. Daha fazla bilgi için Unity oyunlarında ANR'yi ve Android kilitlenmelerini simgeselleştirme bölümüne göz atın.

Şekil 2. Crashlytics, derleme kimliğini ve eksik libil2cpp.so sembollerini gösteriyor.

Simgeyi derleme kimliğini kontrol etme

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

Windows veya macOS'te:

  1. Skript arka ucuna göre semboller klasörüne gidin (Çözüm'e 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. Metin çıktısını filtrelemek için Grep kullanımı isteğe bağlıdır.
    3. Derleme kimliğini arayın
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95

Oyun kodunu inceleme

Yığın izleme, libil2cpp.so kitaplığındaki bir işlevi gösterdiğinde hata, C++'ya dönüştürülen C# kodunda meydana gelir. 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, 3. resimde Game.cpp dosyasında (mavi renkle vurgulanmıştır) bulunan hata gösterilmektedir. Bu dosya, derleme tanımı dosyasında tanımlanan addır. Logger, C# komut dosyasında sınıf adıdır (kırmızıyla vurgulanmıştır) ve ardından işlev adı gelir (yeşil renkle vurgulanmıştır). Son olarak, IL2CPP dönüştürücünün oluşturduğu tam addır (turuncu renkte vurgulanmıştır).

Şekil 3. Geri izlemeden proje çağrı yığınını test edin.

Aşağıdakileri yaparak oyun kodunuzu inceleyin:

  • C# projesini inceleyerek şüpheli kod olup olmadığını kontrol edin. C#'da işlenmemiş istisnalar genellikle ANR'ye veya uygulama kilitlenmelerine neden olmaz. Yine de kodun farklı durumlarda düzgün çalıştığından emin olun. Kodun üçüncü taraf motor modülü kullanıp kullanmadığını kontrol edin ve hatanın yakın zamanda yayınlanan bir sürümden kaynaklanıp kaynaklanmadığını analiz edin. Ayrıca, Unity'yi kısa süre önce güncelleyip güncellemediğinizi veya hatanın yalnızca belirli cihazlarda olup olmadığını inceleyin.
  • Oyunu Android Studio projesi olarak dışa aktarın. Oyununuzun dönüştürülmüş C# kaynak koduna tam erişiminiz varsa ANR'ye neden olan işlevi bulabilirsiniz. C++ kodu, C# kodunuzdan çok farklı görünür ve kod dönüştürmesinde nadiren bir sorun vardır. Böyle bir sorunla karşılaşırsanız Unity'ye destek kaydı oluşturun.
  • Oyunun kaynak kodunu inceleyin ve OnApplicationFocus() ile OnApplicationPause() geri çağırmalarında çalışan tüm mantıkların uygun şekilde temizlendiğinden emin olun.
    • Unity motorunun yürütmeyi duraklatmak için bir zaman aşımı vardır. Bu geri çağırmalarda aşırı iş yükü ANR'ye neden olabilir.
    • Veri analizinizi iyileştirmek için kodun bölümlerine günlükler veya içerik haritaları ekleyin.
  • Oyunun performansını incelemek için Unity Profiler'ı kullanın. Uygulamanızın profilini çıkarmak, ANR'ye neden olabilecek darboğazları belirlemenize yardımcı olacak mükemmel bir yöntem olabilir.
  • Ana iş parçacığındaki uzun G/Ç işlemlerini belirlemenin en iyi yolu katı modu kullanmaktır.
  • Android vitals'ı veya başka bir raporlama hizmeti geçmişini analiz edin ve hatanın en çok ortaya çıktığı oyunun sürümlerini kontrol edin. Sürüm kontrol geçmişinizde kaynak kodunuzu inceleyin ve sürümler arasındaki kod değişikliklerini karşılaştırın. Şüpheli bir şey bulursanız her değişikliği veya olası çözümü 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 eskiyse ve bu durum oyunun kârlılığını etkilemiyorsa bunları yoksayabilirsiniz. Belirli bir kullanıcı grubu artık oyununuzu oynayamayacağından verileri dikkatlice inceleyin. Daha fazla bilgi için Dağıtım kontrol paneli konusuna bakın.
  • Sorun oluşturabilecek kod çağırmadığınızdan emin olmak için oyunun kaynak kodunu inceleyin. Örneğin, finish doğru şekilde kullanılmazsa 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 sayede Unity'nin standart çözümlerinin ötesindeki araçlardan (ör. Android Bellek Profilleyici, Android CPU Profilleyici ve perfetto) tam olarak yararlanabilirsiniz.

Unity motor kodu

Unity motorunda ANR olup olmadığını öğrenmek için yığın izlemelerinde libUnity.so veya libMain.so olup olmadığına bakın. Bu cihazları bulursanız aşağıdaki adımları uygulayın:

  • Öncelikle topluluk kanallarını (Unity Forumları, Unity Tartışmaları, Stackoverflow) arayın.
  • Hiçbir şey bulamazsanız sorunu çözmek için hata kaydı gönderin. Motor mühendislerinin hatayı daha iyi anlayıp çözebilmeleri için simgesel bir yığın izleme (stack trace) sağlayın.
  • En son Unity LTS'de sorunlarınızın giderilip giderilmediğini kontrol edin. Bu durumda, oyununuzu bu 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 son sürümünde kilitlenme veya ANR raporları olmadığından emin olun.
  • Hataların daha sonraki bir sürümde çözülüp çözülmediğini veya Unity ya da bir topluluk üyesi tarafından geçici bir çözüm sağlanıp sağlanmadığını görmek için Unity Forumları'na gidin.
  • Google Play ANR raporunu inceleyin ve hatanın Google tarafından önceden tanımlanmadığından emin olun. Google, bazı ANR'lerin farkındadır ve bunları düzeltmek için aktif olarak çalışmaktadır.

Sistem kitaplığı

Sistem kitaplıkları genellikle geliştiricinin kontrolü dışındadır, ancak ANR’lerin önemli bir yüzdesini temsil etmez. Sistem kitaplığı ANR'lerinin çözülmesi, kitaplık geliştiricisiyle iletişime geçmenin veya sorunu daraltmak için günlük eklemenin ötesine geçer.

Çıkış nedenleri

ApplicationExitInfo, ANR nedenlerini anlamanızı sağlayan bir Android API'sidir. Oyununuzda Unity 6 veya sonraki bir sürüm kullanılıyorsa doğrudan ApplicationExitInfo'i arayabilirsiniz. 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 eklemenizi sağlar.