App Center Kilitleniyor (Unity)
Önemli
Visual Studio App Center 31 Mart 2025'te kullanımdan kaldırılıyor. Tamamen kullanımdan kaldırılana kadar Visual Studio App Center'ı kullanmaya devam edebilirsiniz ancak geçiş yapmayı düşünebileceğiniz birkaç önerilen alternatif vardır.
Destek zaman çizelgeleri ve alternatifleri hakkında daha fazla bilgi edinin.
App Center Kilitlenmeleri, uygulamanızın her kilitlenmesinde otomatik olarak bir kilitlenme günlüğü oluşturur ve cihaz depolama alanına bir günlük ekler. Kullanıcı uygulamayı yeniden başlattığında SDK kilitlenme raporunu App Center'a gönderir. Kilitlenmeleri toplamak hem beta hem de canlı uygulamalarda, yani Google Play'e gönderilen kilitlenmelerde çalışır. Kilitlenme günlükleri, kilitlenmeyi düzeltmenize yardımcı olacak değerli bilgiler içerir.
Uygulamanızda SDK'yı henüz ayarlamadıysanız Unity Başlarken bölümündeki yönergeleri izleyin.
iOS'ta kilitlenme günlükleri Sembolikleştirme gerektirir. Simgeselleştirmeyi etkinleştirmek için, uygulamanız için sembolleri nasıl sağlayabileceğinizi açıklayan App Center Tanılama belgelerine bakın.
Önemli
Unity için Crashes SDK'sı UWP'yi desteklemez. Bu sayfadaki yönergeler yalnızca Android ve iOS'yi kapsar.
Not
Hata ayıklayıcısını eklediyseniz SDK hiçbir kilitlenme günlüğünü iletmez. Uygulamayı kilitlediğinizde hata ayıklayıcının bağlı olmadığından emin olun.
Not
PlayerSettings'te etkinleştirdiyseniz Enable CrashReport API
SDK kilitlenme günlüklerini toplamaz.
App Center Kilitlenmeleri, SDK'nın kolay testine yönelik bir test kilitlenmesi oluşturmak için size bir API sağlar. Bu API hata ayıklama ve sürüm yapılandırmalarını denetler. Bu nedenle, yalnızca hata ayıklarken kullanabilirsiniz çünkü sürüm uygulamalarında çalışmaz.
Crashes.GenerateTestCrash();
Not
Bu yöntem yalnızca Geliştirme Derlemesi ayarı açık durumdayken çalışır.
App Center Kilitlenmeleri, uygulamanızın kilitlenmesi durumunda size daha fazla bilgi veren iki API'ye sahiptir.
SDK'yı başlattıktan sonra, uygulamanın önceki oturumda bellek uyarısı aldığını kontrol edebilirsiniz:
bool hadLowMemoryWarning = Crashes.HasReceivedMemoryWarningInLastSessionAsync().Result;
Not
Bu yöntem içinde Awake()
çalışmaz.
Not
Bazı durumlarda, belleği düşük olan bir cihaz olay gönderemez.
SDK'yı başlattıktan sonra uygulamanın önceki başlatmada kilitlenip kilitlenmediğini kontrol edebilirsiniz:
bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();
Kilitlenme gerçekleştikten sonra uygulamanızın davranışını veya kullanıcı arabirimini ayarlamak istiyorsanız arama HasCrashedInLastSessionAsync
yararlı olur. Bazı geliştiriciler, kullanıcılarından özür dilemek için ek kullanıcı arabirimi gösterir veya kilitlenme gerçekleştikten sonra iletişim kurmak ister.
Uygulamanız daha önce kilitlendiyse son kilitlenmeyle ilgili ayrıntıları alabilirsiniz.
ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();
Bu API için en yaygın kullanım örneği, kullanıcının özel Kilitlenme temsilcisini veya dinleyicisini uyguladığı durumlardır.
App Center Kilitlenmeleri, geliştiricilerin App Center'a kilitlenme günlükleri göndermeden önce ve gönderdiklerinde ek eylemler gerçekleştirmesi için geri aramalar sağlar.
Not
App Center başlamadan önce geri çağırmayı ayarlayın; örneğin yöntemde Awake
, App Center başlangıçtan hemen sonra kilitlenmeleri işlemeye başladığından.
Belirli bir kilitlenmenin işlenmesi gerekip gerekmediğine karar vermek istiyorsanız aşağıdaki geri aramayı ayarlayın. Örneğin, yoksaymak ve App Center'a göndermek istemediğiniz bir sistem düzeyinde kilitlenme olabilir.
Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
// Check the report in here and return true or false depending on the ErrorReport.
return true;
};
Kullanıcı gizliliği sizin için önemliyse, App Center'a kilitlenme raporu göndermeden önce kullanıcı onayı almak isteyebilirsiniz. SDK, App Center Kilitlenmeleri'ne kilitlenme raporlarını göndermeden önce kullanıcı onayını beklemesini bildiren bir geri arama sunar.
Kodunuz bu geri çağırmayı kullanıyorsa, kullanıcının onayını almak sizin sorumluluğunuzdadır. Seçeneklerden biri, aşağıdaki seçeneklerden birini içeren bir iletişim kutusu istemidir: Her Zaman Gönder, Gönder ve Gönderme. Girişe bağlı olarak App Center Kilitlenmesi'ne ne yapması gerektiğini söyleyeceksiniz ve kilitlenme buna göre işlenir.
Not
SDK bunun için bir iletişim kutusu görüntülemez, uygulamanın kullanıcı onayı istemek için kendi kullanıcı arabirimini sağlaması gerekir.
Aşağıdaki geri arama, SDK'ya kilitlenmeleri göndermeden önce kullanıcı onayını beklemesini nasıl söyleyeceğinizi gösterir:
Crashes.ShouldAwaitUserConfirmation = () =>
{
// Build your own UI to ask for user consent here. SDK doesn't provide one by default.
// Return true if you built a UI for user consent and are waiting for user input on that custom UI, otherwise false.
return true;
};
Geri arama döndürürse true
, kullanıcı iznini almanız ve aşağıdaki API'yi kullanarak sonucu SDK'ya iletin:
// Depending on the user's choice, call Crashes.NotifyUserConfirmation() with the right value.
Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
Crashes.NotifyUserConfirmation(UserConfirmation.Send);
Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);
Örnek olarak özel iletişim kutusu örneğimize başvurabilirsiniz.
Bazen uygulamanızın kilitlenme durumunu bilmek istersiniz. Yaygın bir kullanım örneği, kullanıcıya uygulamanın kilitlenme raporu gönderdiğini bildiren bir kullanıcı arabirimi görüntülemektir. Başka bir senaryo, kilitlenme günlüklerinin yeniden başlatma işleminden kısa süre sonra gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir. App Center Kilitlenmeleri, gerçekleşen durumlarla ilgili bildirim almak için yapabileceğiniz üç farklı geri arama sağlar:
Crashes.SendingErrorReport += (errorReport) =>
{
// Your code, e.g. to present a custom UI.
};
Uç noktada ağ sorunları veya kesinti olması ve uygulamayı yeniden başlatmanız durumunda işlem SendingErrorReport
yeniden başlatıldıktan sonra yeniden tetikleniyor.
Crashes.SentErrorReport += (errorReport) =>
{
// Your code, e.g. to hide the custom UI.
};
Crashes.FailedToSendErrorReport += (errorReport, exception) =>
{
// Your code goes here.
};
Alma FailedToSendErrorReport
, 4xx kodu gibi kurtarılamaz bir hata oluştuğu anlamına gelir. Örneğin, 401 yanlış olduğu anlamına gelir appSecret
.
Bu geri arama bir ağ sorunuysa tetiklenmemiştir. Bu durumda SDK yeniden denemeye devam eder (ve ağ bağlantısı kapalıyken yeniden denemeleri duraklatır).
ayrıca isteğe bağlı olarak kilitlenmeye veya işlenmeyen özel durum raporuna ikili ve metin ekleri ekleyebilirsiniz. SDK, bunları App Center portalında görebilmeniz için raporla birlikte gönderir. Aşağıdaki geri arama, depolanan raporu göndermeden hemen önce çağrılacaktır. Kilitlenmeler için bir sonraki uygulama başlatmada gerçekleşir. İşlenmeyen özel durumlar için ekleri göndermeyi kabul etmeniz gerekir. Minidump dosyaları için ayrılmış bir ad olduğundan ek dosyasının adlandırılmadığındanminidump.dmp
emin olun. Aşağıda rapora metin ve resim ekleme örneği verilmiştir:
Crashes.GetErrorAttachments = (ErrorReport report) =>
{
// Your code goes here.
return new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
};
Kilitlenmeler, özelliğine sahip raporlarda işlenmeyen IsCrash
özel durumlardan ayırt edilir. Özelliği kilitlenmeler için true, aksi takdirde false olur.
Not
Boyut sınırı şu anda 7 MB olan ekler içindir. Daha büyük bir ek göndermeye çalışmak bir hatayı tetikler.
Not
GetErrorAttachments
ana iş parçacığında çağrılır ve çalışmayı çerçeveler arasında bölmez. Oyun döngüsünün engellenmesini önlemek için bu geri çağırmada uzun süre çalışan görevler gerçekleştirmeyin.
Çalışma zamanında App Center Kilitlenmelerini etkinleştirebilir ve devre dışı bırakabilirsiniz. Devre dışı bırakırsanız SDK, uygulama için kilitlenme bildirimi gerçekleştirmez.
Crashes.SetEnabledAsync(false);
App Center Kilitlenmelerini yeniden etkinleştirmek için aynı API'yi kullanın ancak parametre olarak geçirin true
.
Crashes.SetEnabledAsync(true);
Diğer API çağrılarını (örneğin IsEnabledAsync
) tutarlı hale getirmek için bu çağrıyı beklemeniz gerekmez.
Durum, uygulama başlatmaları arasında cihazın depolama alanında kalıcı hale geldi.
App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini de de de kontrol edebilirsiniz:
bool isEnabled = await Crashes.IsEnabledAsync();
App Center ayrıca Unity'de işlenen özel durumları kullanarak hataları izlemenize de olanak tanır. Bunu yapmak için yöntemini kullanın TrackError
:
try {
// your code goes here.
} catch (Exception exception) {
Crashes.TrackError(exception);
}
Hatanız hakkında daha fazla bağlam için, bu hataya özellikler de ekleyebilirsiniz. Özellikleri dizelerin sözlüğü olarak geçirin. Bu adım isteğe bağlıdır.
try {
// your code goes here.
} catch (Exception exception) {
var properties = new Dictionary<string, string>
{
{ "Category", "Music" },
{ "Wifi", "On" }
};
Crashes.TrackError(exception, properties);
}
İsterseniz işlenen hata raporuna ikili ve metin ekleri de ekleyebilirsiniz. Aşağıdaki örnekte gösterildiği gibi ekleri bir nesne dizisi ErrorAttachmentLog
olarak geçirin.
try {
// your code goes here.
} catch (Exception exception) {
var attachments = new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
Crashes.TrackError(exception, attachments: attachments);
}
Varsayılan olarak, App Center SDK'sı uygulamanızda önemli bir kilitlenmeye neden olmayan işlenmeyen özel durumları bildirmez. Bu işlevi etkinleştirmek için aşağıdaki yöntemi çağırın:
Crashes.ReportUnhandledExceptions(true);
Bu API'yi çağırdıktan sonra, App Center daha önce bahsedilen işlenen özel durumlara benzer şekilde, işlenmeyen tüm özel durumları App Center portalında Sorunlar olarak günlüğe kaydeder. Bu işlevi devre dışı bırakmak için parametresiyle aynı API'yi false
geçirin.
Crashes.ReportUnhandledExceptions(false);
Not
App Center SDK'sı tarafından algılanan bazı işlenmeyen özel durumlar App Center kullanıcı arabiriminde hata olarak görünür. Bunun nedeni Unity'nin varsayılan olarak işlenmeyen özel durumları yakalaması, uygulamanın çıkmaması ve kilitlenme olarak kabul edilmemesidir.
App Center SDK'sı varsayılan olarak işlenmeyen özel durumlarda ekleri etkinleştirmez. Bu işlevi etkinleştirmek için yönteminin enableAttachmentsCallback
boole parametresini ReportUnhandledExceptions
olarak true
ayarlayın:
Crashes.ReportUnhandledExceptions(true, true);
Ardından , GetErrorAttachments geri çağırmasını uygulayarak isteğe bağlı olarak işlenmeyen bir özel durum raporuna ek ekleyebilirsiniz.
App Center'da düzgün kilitlenme raporları almak için, önce yukarıda listelenen yönergeleri izleyerek App Center Crashes SDK'sının ayarlandığından emin olun.
Ardından, Resmi Android BENIOKU için Google Breakpad'de listelenen yönergeleri izleyerek Google Breakpad'i dahil etmeli ve derlemelisiniz. Unity'de kullanmak için ikili dosyasını uygulamanızla birlikte ekleyin.
Not
App Center SDK'sı, Google Breakpad'i varsayılan olarak paketlemez.
Google Breakpad'i ekledikten sonra NDK Kilitlenme İşleyicisi'ni ekleyin:
/* Attach NDK Crash Handler. */
var minidumpDir = Crashes.GetMinidumpDirectoryAsync();
setupNativeCrashesListener(minidumpDir.Result);
...
[DllImport("YourLib")]
private static extern void setupNativeCrashesListener(string path);
yöntemi setupNativeCrashesListener
, C/C++'da uygulamanız gereken yerel bir yöntemdir:
#include <android/log.h>
#include "google-breakpad/src/client/linux/handler/exception_handler.h"
#include "google-breakpad/src/client/linux/handler/minidump_descriptor.h"
static google_breakpad::ExceptionHandler exception_handler(google_breakpad::MinidumpDescriptor(), NULL, dumpCallback, NULL, true, -1);
/**
* Registers breakpad as the exception handler for NDK code.
* @param path minidump directory path returned from Crashes.GetMinidumpDirectoryAsync()
*/
extern "C" void setupNativeCrashesListener(const char *path) {
google_breakpad::MinidumpDescriptor descriptor(path);
exception_handler.set_minidump_descriptor(descriptor);
}
dumpCallback
Sorun giderme için nerede kullanılır:
/*
* Triggered automatically after an attempt to write a minidump file to the breakpad folder.
*/
static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
void *context,
bool succeeded) {
/* Allow system to log the native stack trace. */
__android_log_print(ANDROID_LOG_INFO, "YourLogTag",
"Wrote breakpad minidump at %s succeeded=%d\n", descriptor.path(),
succeeded);
return false;
}
Bu yöntemler düzgün bir şekilde ayarlandıktan sonra uygulama, minidump'ı yeniden başlatıldıktan sonra otomatik olarak App Center'a gönderir. Sorun gidermek için ayrıntılı günlükleri kullanarak uygulama yeniden başlatıldıktan sonra minidumların gönderilip gönderilmediğini de kontrol edebilirsiniz.
Not
App Center minidump ekleri için ayrılmış adı minidump.dmp
kullanır. Düzgün şekilde işleyebilmemiz için, minidump dosyası olmadığı sürece ekinize farklı bir ad verdiğinizden emin olun.
Uyarı
Breakpad'de x86 öykünücülerinde kilitlenmeleri yakalamayı imkansız hale getiren bilinen bir hata vardır.
Kilitlenmelerin işlenmesiyle ilgili daha fazla bilgi için Tanılama belgelerine bakın.