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 edin

Android vitals, Firebase Crashlytics ve Backtrace (sertifikalı bir Unity iş ortağı) gibi raporlama hizmetleri, oyununuz için geniş ölçekte hata kaydı ve analiz hizmeti sunar. 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 hizmetinin hangisi olduğunu analiz edin.

Farklı raporlama hizmetleri, ANR'leri farklı yakalama yöntemlerine sahiptir. ANR'leri düzeltme kararınızı destekleyecek geçerli veriler edinme olasılığını artırmak için ikinci bir raporlama hizmeti ekleyin.

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

Simgeleri analiz etme

Raporlama hizmetinizden gelen raporları analiz edin ve yığın izlemelerinin kullanıcılar tarafından okunabilecek biçimde olup olmadığını kontrol edin. Daha fazla bilgi için Unity oyunları için simgesel Android kilitlenmeleri ve ANR bölümünü inceleyin.

Şekil 2. Derleme kimliğini ve eksik libil2cpp.so simgelerini gösteren Crashlytics.

Simge derleme kimliğini kontrol etme

Raporlama sisteminde derleme kimliği eksikse ancak derleme sembolleri derleme makinesi depolama alanında hâlâ mevcutsa simgelerin derleme kimliğini kontrol edip ardından raporlama hizmetine yükleyebilirsiniz. Aksi takdirde, sembol dosyalarını yüklemek için yeni bir derleme gerekir.

Windows veya macOS'te:

  1. Komut dosyası arka ucunuza bağlı olarak simgeler 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 kullanın)
    2. Metin çıkışı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 inceleyin

Yığın izleme, libil2cpp.so kitaplığında bir işlev gösterdiğinde hata C++'ya dönüştürülmüş C# kodunda meydana gelmiştir. libil2cpp.so kitaplığı yalnızca oyun kodunuzu değil, eklentileri ve paketleri de içerir.

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

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

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

  • Şüpheli kod olup olmadığını görmek için C# projesini inceleyin. C# işlenmemiş istisnaları genellikle ANR'ye veya uygulama kilitlenmesine neden olmaz. Yine de kodun farklı durumlarda düzgün bir şekilde çalıştığından emin olun. Kodun üçüncü taraf bir motor modülü kullanıp kullanmadığını kontrol edin ve hatanın yeni bir sürümde neden olup olmadığını analiz edin. Ayrıca, son zamanlarda Unity'yi güncelleyip güncellemediğinizi veya hatanın yalnızca belirli cihazlarda mı oluştuğunu inceleyin.
  • Oyunu Android Studio projesi olarak dışa aktarın. Oyununuzun dönüştürülmüş C# kaynak koduna tam erişimle ANR'ye neden olan işlevi bulabilirsiniz. C++ kodu, C# kodunuzdan çok farklı görünür ve kod dönüşümünde nadiren bir sorun olur. Bir şey bulursanız Unity destek kaydı oluşturun.
  • Oyun kaynak kodunu inceleyin ve OnApplicationFocus() ve OnApplicationPause() geri çağırmalarında çalışan tüm mantığın uygun şekilde temizlendiğinden emin olun.
    • Unity motorunun, yürütülmesini duraklatmak için zaman aşımı vardır. Bu geri çağırma işlemlerine uygulanan aşırı iş yükü, ANR'ye neden olabilir.
    • Veri analizinizi geliş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 da ANR'ye neden olabilecek engelleri tespit etmek için iyi bir yöntem olabilir.
  • Ana iş parçacığında uzun G/Ç işlemlerini tanımlamanın en iyi yolu katı mod kullanmaktır.
  • Android vitals verilerini veya başka bir raporlama hizmeti geçmişini analiz edin ve hatanın en çok meydana geldiği oyunun sürüm 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 şey bulursanız her değişikliği veya olası düzeltmeyi tek tek 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 oyunun kârlılığını etkilemiyorsa bunları büyük olasılıkla güvenli bir şekilde göz ardı edebilirsiniz. Belirli bir kullanıcı grubu artık oyununuzu oynayamayacağı için verileri dikkatli bir şekilde inceleyin. Daha fazla bilgi edinmek için Dağıtım kontrol paneli başlıklı makaleye göz atın.
  • Soruna neden olabilecek herhangi bir kod çağırmadığınızdan emin olmak için oyun kaynak kodunu inceleyin. Örneğin, finish doğru kullanılmadığı takdirde yıkıcı olabilir. Android geliştirme hakkında daha fazla bilgi edinmek için Android geliştirici kılavuzlarına bakın.
  • Verileri inceledikten ve oyun derlemesini Android Studio'ya aktardıktan sonra C ve C++ kodlarıyla uğraşırsınız. Böylece Unity'nin standart çözümlerinin dışındaki Android Memory Profiler, Android CPU Profiler ve perfetto gibi araçlardan tam olarak yararlanabilirsiniz.

Unity motor kodu

Unity motor tarafında bir ANR olup olmadığını öğrenmek için yığın izlemelerde libUnity.so veya libMain.so olup olmadığını kontrol edin. Bu tür kullanıcıları bulursanız aşağıdaki adımları uygulayın:

  • Öncelikle topluluk kanallarında (Unity Forumları, Unity Tartışmaları, Stackoverflow) arama yapın.
  • Hiçbir şey bulamazsanız sorunu çözmek için hata bildiriminde bulunun. Motor mühendislerinin hatayı daha iyi anlayıp çözebilmesi için sembolik bir yığın izleme sağlayın.
  • En son Unity LTS sürümünün sorunlarınızla ilgili iyileştirmeler sağlayıp sağlamadığını kontrol edin. Öyleyse bu sürümü kullanmak için oyununuzu yükseltin. (Bu çözüm yalnızca bazı geliştiriciler için mümkün olabilir.)
  • Kodunuz varsayılan yerine özel bir Activity kullanıyorsa etkinliğin herhangi bir soruna neden olmadığından emin olmak için Java kodunu inceleyin.

Üçüncü taraf SDK

  • Tüm üçüncü taraf kitaplıkların güncel olduğundan ve Android'in en son sürümü için kilitlenme veya ANR raporu bulunmadığından emin olun.
  • Hataların daha sonraki bir sürümde çözülene kadar çözülüp çözülmediğini veya Unity ya da bir topluluk üyesi tarafından geçici bir çözüm sunulup sunulmadığını görmek için Unity Forumları'na gidin.
  • Google Play ANR raporunu inceleyip 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ünde olmasa da ANR'lerin önemli bir yüzdesini temsil etmez. Sistem kitaplığı ANR'lerinin çözülmesi zordur. Bu nedenle, kitaplık geliştiricisiyle iletişim kurmanın veya sorunu daraltmak için günlükler eklemenin yanı sıra sistem kitaplığı ANR'lerinin çözülmesi zordur.

Çıkış nedenleri

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

Crashlytics ayrıca ApplicationExitInfo kullanır ancak kendi uygulamanız size daha ayrıntılı kontrol sağlar ve daha alakalı bilgiler eklemenize olanak tanır.