Unity oyununuzda ANR'leri çözmek sistematik bir süreçtir:
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.
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:
- Komut dosyası arka ucunuza bağlı olarak simgeler klasörüne gidin (Çözüm bölümüne bakın:)
- Aşağıdaki komutu kullanın (Windows'da,
readelf
yardımcı programını çalıştırmak için Cygwin kullanın) - Metin çıkışını filtrelemek için Grep kullanımı isteğe bağlıdır
- Derleme kimliğini arayın
- Aşağıdaki komutu kullanın (Windows'da,
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).
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.