Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
Visual Studio App Center, 30 Haziran 2026'ya kadar desteklenmeye devam edecek Analiz ve Tanılama özellikleri dışında 31 Mart 2025'te kullanımdan kaldırılmıştır. Daha fazla bilgi edinin.
App Center Kilitlenmeleri, uygulamanız her kilitlenişinde otomatik olarak bir kilitlenme günlüğü oluşturur. Günlük, ilk olarak cihazın depolama alanına yazılır ve kullanıcı uygulamayı tekrar başlattığında, kilitlenme raporu App Center'a gönderilir. Kilitlenmeleri toplamak hem beta hem de Google Play'e gönderilmiş canlı uygulamalar için çalışır. Çökme günlükleri, çökme sorununu çözmenize yardımcı olacak değerli bilgiler içerir.
Uygulamanızda SDK'yı henüz ayarlamadıysanız Başlarken bölümünü izleyin.
Test kilitlenmesi oluştur
App Center Çökmeleri, SDK'nın kolayca test edilmesi için bir test çökmesi oluşturmanızı sağlayan bir API sunar. Bu API yalnızca hata ayıklama derlemelerinde kullanılabilir ve yayın derlemelerinde hiçbir şey yapmaz.
Crashes.generateTestCrash();
Crashes.generateTestCrash()
Önceki kilitlenme hakkında daha fazla bilgi edinin
App Center Çökmesi, uygulamanızın çökmesi durumunda size daha fazla bilgi sağlayan iki API'si bulundurur.
Uygulama önceki oturumda düşük bellek uyarısı mı aldı?
SDK'yı başlattıktan sonra herhangi bir zamanda uygulamanın önceki oturumda bir bellek uyarısı almış olup olmadığını kontrol edebilirsiniz:
Crashes.hasReceivedMemoryWarningInLastSession();
Crashes.hasReceivedMemoryWarningInLastSession()
Bu API zaman uyumsuzdur. Bu konuda daha fazla bilgiyi App Center Zaman Uyumsuz API'ler kılavuzumuzdan okuyabilirsiniz.
Uyarı
Bu yöntem, Crashes
başlatıldıktan sonra kullanılmalıdır, başlamadan önce her zaman false
döndürecektir.
Uyarı
Bazı durumlarda, belleği düşük olan bir cihaz olayları gönderemez.
Uygulama önceki oturumda kilitleniyor muydu?
SDK'yı başlattıktan sonra istediğiniz zaman uygulamanın önceki başlatmada kilitlenip kilitlenmediğini de kontrol edebilirsiniz:
Crashes.hasCrashedInLastSession();
Crashes.hasCrashedInLastSession()
Bu API zaman uyumsuzdur. Bu konuda daha fazla bilgiyi App Center Zaman Uyumsuz API'ler kılavuzumuzdan okuyabilirsiniz.
Bu, kilitlenme gerçekleştikten sonra uygulamanızın davranışını veya kullanıcı arabirimini ayarlamak istemeniz durumunda kullanışlıdır. Bazı geliştiriciler, kullanıcılarından özür dilemek için ek kullanıcı arabirimi göstermeyi veya bir kilitlenme oluştuktan sonra iletişim kurmanın yolunu seçmeyi tercih etti.
Uyarı
Bu yöntem, Crashes
başlatıldıktan sonra kullanılmalıdır, başlamadan önce her zaman false
döndürecektir.
Son çökme ile ilgili ayrıntılar
Uygulamanız daha önce kilitlendiyse son kilitlenmeyle ilgili ayrıntıları alabilirsiniz.
Crashes.getLastSessionCrashReport();
Crashes.getLastSessionCrashReport()
Bu API zaman uyumsuzdur. Bu konuda daha fazla bilgiyi App Center Zaman Uyumsuz API'ler kılavuzumuzdan okuyabilirsiniz.
Bu API için çok sayıda kullanım örneği vardır, en yaygın olanı bu API'yi çağıran ve özel CrashesListener'larını uygulayan kişilerdir.
Uyarı
Bu yöntem, Crashes
başlatıldıktan sonra kullanılmalıdır, başlamadan önce her zaman null
döndürecektir.
App Center Kilitlenmelerinin kullanımını özelleştirin
App Center Kilitlenmeleri, geliştiricilerin App Center'a kilitlenme günlükleri göndermeden önce ve gönderirken ek eylemler gerçekleştirebilmesi için geri çağrılar (callbacks) sağlar.
Geri çağırmaları işlemek için arabirimdeki CrashesListener
tüm yöntemleri uygulayın veya sınıfı geçersiz kılarak AbstractCrashesListener
yalnızca ilgilendiğiniz yöntemleri seçin.
Kendi CrashesListener'ınızı kullanma
Kendi CrashesListener'ınızı oluşturun ve şu şekilde atayın:
CrashesListener customListener = new CrashesListener() {
// Implement all callbacks here.
};
Crashes.setListener(customListener);
val customListener = object : CrashesListener {
// Implement all callbacks here.
}
Crashes.setListener(customListener)
Yalnızca bazı geri çağırmaları özelleştirmek istiyorsanız, bunun yerine şunu AbstractCrashesListener
kullanın:
AbstractCrashesListener customListener = new AbstractCrashesListener() {
// Implement any callback here as required.
};
Crashes.setListener(customListener);
val customListener = object : AbstractCrashesListener() {
// Implement any callback here as required.
}
Crashes.setListener(customListener)
Uyarı
App Center, başlatma işleminden hemen sonra kilitlenmeleri işlemeye başladığı için, dinleyiciyi önce ayarlayın ve AppCenter.start()
çağrısında bulunun.
Kilitlenme işlenmeli mi?
Belirli bir kilitlenmenin işlenmesi gerekip gerekmediğine karar vermek istiyorsanız bu geri çağırma işlevini uygulayın. Örneğin, yoksaymak isteyebileceğiniz ve App Center'a göndermek istemediğiniz bir sistem seviyesinde çökme olabilir.
@Override
public boolean shouldProcess(ErrorReport report) {
return true; // return true if the crash report should be processed, otherwise false.
}
override fun shouldProcess(report: ErrorReport?): Boolean {
return true
}
Kullanıcının hata raporu göndermek üzere onay isteyin
Kullanıcı gizliliği sizin için önemliyse, App Center'a kilitlenme raporu göndermeden önce kullanıcı onayı almak isteyebilirsiniz. SDK, App Center Çökmeler modülüne herhangi bir çökme raporu göndermeden önce kullanıcı onayını beklemesini belirten bir geri çağırım sağlar.
Bunu yapmayı seçerseniz, kullanıcının onayını almak sizin sorumluluğundadır; örneğin, aşağıdaki seçeneklerden birini içeren bir iletişim kutusu istemi aracılığıyla: Her Zaman Gönder, Gönder ve Gönderme. Girişe bağlı olarak App Center Crashes'e ne yapması gerektiğini belirteceksiniz ve bu durumda kilitlenme uygun şekilde işlenecektir.
Uyarı
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 çağırma işlevi, SDK'ya kilitlenmeleri göndermeden önce kullanıcı onayını beklemesi için nasıl talimat vereceğinizi gösterir.
@Override
public boolean 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;
}
override fun shouldAwaitUserConfirmation(): Boolean {
return true
}
döndürürseniz true
, uygulamanızın kullanıcının iznini alması (kendi kodunuzu kullanarak) ve aşağıdaki API'yi kullanarak sonucu SDK'ya iletmesi gerekir:
// Depending on the user's choice, call Crashes.notifyUserConfirmation() with the right value.
Crashes.notifyUserConfirmation(Crashes.DONT_SEND);
Crashes.notifyUserConfirmation(Crashes.SEND);
Crashes.notifyUserConfirmation(Crashes.ALWAYS_SEND);
Crashes.notifyUserConfirmation(Crashes.DONT_SEND)
Crashes.notifyUserConfirmation(Crashes.SEND)
Crashes.notifyUserConfirmation(Crashes.ALWAYS_SEND)
Örnek olarak özel iletişim kutusu örneğimize başvurabilirsiniz.
Kilitlenme günlüğü için gönderim durumu hakkında bilgi edinme
Bazen uygulamanızın çökme durumunu bilmek istersiniz. Yaygın kullanım örneklerinden biri, kullanıcılara uygulamanızın kilitlenme raporu gönderdiğini bildiren kullanıcı arabirimini göstermek veya başlatma işleminden sonra uygulamanızın hızla kilitlenmesi durumunda kilitlenme günlüklerinin gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir. App Center Çöküşleri, neler olup bittiğine dair bildirim almak için uygulamanızda kullanabileceğiniz üç farklı geri çağrısı vardır.
Aşağıdaki geri arama, SDK bir kilitlenme günlüğü göndermeden önce çağrılacaktır.
@Override
public void onBeforeSending(ErrorReport errorReport) {
// Your code, e.g. to present a custom UI.
}
override fun onBeforeSending(report: 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 onBeforeSending
yeniden başlatıldıktan sonra yeniden tetikleniyor.
SDK bir kilitlenme günlüğünü başarıyla gönderdikten sonra aşağıdaki geri arama tetiklenir
@Override
public void onSendingSucceeded(ErrorReport report) {
// Your code, e.g. to hide the custom UI.
}
override fun onSendingSucceeded(report: ErrorReport?) {
// Your code, e.g. to hide the custom UI.
}
SDK bir kilitlenme günlüğü göndermede başarısız olursa aşağıdaki geri çağrı işlevi çağrılır.
@Override
public void onSendingFailed(ErrorReport report, Exception e) {
// Your code goes here.
}
override fun onSendingFailed(report: ErrorReport?, e: Exception?) {
// Your code goes here.
}
Almak onSendingFailed
, 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 çağırma bir ağ sorunu olduğunda tetiklenmez. Bu durumda SDK yeniden denemeye devam eder (ve ayrıca ağ bağlantısı kapatılırken yeniden denemeleri duraklatır).
Kilitlenme raporuna ek dosyalar ekleme
Kilitlenme raporuna ikili ve metin ekleri ekleyebilirsiniz. SDK, bunları App Center portalında görebilmeniz için çökme ile birlikte gönderir. Önceki uygulama başlatmalarından kaynaklanan depolanan çökme raporu gönderilmeden hemen önce, aşağıdaki geri çağrı işlevi tetiklenecektir. Kilitlenme gerçekleştiğinde çağrılmayacak. Ek dosyanın adıminidump.dmp
olmadığından emin olun çünkü bu ad minidump dosyaları için ayrılmıştır. Kilitlenmeye metin ve resim ekleme örneği aşağıda verilmiştir:
@Override
public Iterable<ErrorAttachmentLog> getErrorAttachments(ErrorReport report) {
// Attach some text.
ErrorAttachmentLog textLog = ErrorAttachmentLog.attachmentWithText("This is a text attachment.", "text.txt");
// Attach binary data.
byte[] binaryData = getYourBinary();
ErrorAttachmentLog binaryLog = ErrorAttachmentLog.attachmentWithBinary(binaryData, "your_filename.jpeg", "image/jpeg");
// Return attachments as list.
return Arrays.asList(textLog, binaryLog);
}
override fun getErrorAttachments(report: ErrorReport?): MutableIterable<ErrorAttachmentLog> {
// Attach some text.
val textLog = ErrorAttachmentLog.attachmentWithText("This is a text attachment.", "text.txt")
// Attach binary data.
val binaryData = getYourBinary()
val binaryLog = ErrorAttachmentLog.attachmentWithBinary(binaryData, "your_filename.jpeg", "image/jpeg")
// Return attachments as list.
return listOf(textLog, binaryLog)
}
Uyarı
Boyut sınırı şu anda 7 MB'tır. Daha büyük bir ek göndermeye çalışmak bir hatayı tetikler.
Çalışma zamanında App Center Çökmelerini etkinleştirme veya devre dışı bırakma
Çalışma zamanında App Center Crashes özelliğini etkinleştirebilir ve devre dışı bırakabilirsiniz. Devre dışı bırakırsanız SDK, uygulama için kilitlenme bildirimi yapmaz.
Crashes.setEnabled(false);
Crashes.setEnabled(false)
App Center Kilitlenmelerini yeniden etkinleştirmek için, aynı API'yi kullanın, ancak true
parametresi olarak geçirin.
Crashes.setEnabled(true);
Crashes.setEnabled(true)
Durum, uygulama başlatmaları arasında cihazın depolama alanında kalıcı olur.
Bu API zaman uyumsuzdur. Bu konuda daha fazla bilgiyi App Center Zaman Uyumsuz API'ler kılavuzumuzdan okuyabilirsiniz.
Uyarı
Crashes
başlatıldıktan sonra bu yöntem yalnızca kullanılmalıdır.
App Center Çökme Raporlarının etkinleştirilip etkinleştirilmediğini kontrol edin
App Center'ın Çökmelerinin etkinleştirilip etkinleştirilmediğini de kontrol edebilirsiniz.
Crashes.isEnabled();
Crashes.isEnabled()
Bu API zaman uyumsuzdur. Bu konuda daha fazla bilgiyi App Center Zaman Uyumsuz API'ler kılavuzumuzdan okuyabilirsiniz.
Uyarı
Bu yöntem, Crashes
başlatıldıktan sonra kullanılmalıdır, başlamadan önce her zaman false
döndürecektir.
Ele Alınan Hatalar
App Center, işlenen özel durumları kullanarak hataları izlemenize de olanak tanır. Bunu yapmak için yöntemini trackError
kullanın:
try {
// your code goes here.
} catch (Exception exception) {
Crashes.trackError(exception);
}
try {
// your code goes here.
} catch (exception: Exception) {
Crashes.trackError(exception)
}
Bir uygulama isteğe bağlı olarak daha fazla bağlam sağlamak için işlenen bir hata raporuna özellikler ekleyebilir. Aşağıdaki örnekte gösterildiği gibi özellikleri anahtar/değer çiftlerinin (yalnızca dizeler) eşlemesi olarak geçirin.
try {
// your code goes here.
} catch (Exception exception) {
Map<String, String> properties = new HashMap<String, String>() {{
put("Category", "Music");
put("Wifi", "On");
}};
Crashes.trackError(exception, properties, null);
}
try {
// your code goes here.
} catch (exception: Exception) {
val properties = mapOf("Category" to "Music", "Wifi" to "On")
Crashes.trackError(exception, properties, null)
}
İsteğe bağlı olarak, işlenen bir hata raporuna ikili ve metin ekleri de ekleyebilirsiniz. Ekleri aşağıdaki örnekte gösterildiği gibi bir Iterable
olarak geçirin.
try {
// your code goes here.
} catch (Exception exception) {
// Attach some text.
ErrorAttachmentLog textLog = ErrorAttachmentLog.attachmentWithText("This is a text attachment.", "text.txt");
// Attach binary data.
byte[] binaryData = getYourBinary();
ErrorAttachmentLog binaryLog = ErrorAttachmentLog.attachmentWithBinary(binaryData, "your_filename.jpeg", "image/jpeg");
// Track an exception with attachments.
Crashes.trackError(exception, null, Arrays.asList(textLog, binaryLog));
}
try {
// your code goes here.
} catch (exception: Exception) {
// Attach some text.
val textLog = ErrorAttachmentLog.attachmentWithText("This is a text attachment.", "text.txt")
// Attach binary data.
val binaryData = getYourBinary()
val binaryLog = ErrorAttachmentLog.attachmentWithBinary(binaryData, "your_filename.jpeg", "image/jpeg")
// Track an exception with attachments.
Crashes.trackError(exception, null, listOf(textLog, binaryLog))
}
NDK kilitlenmelerini raporlama
Çökme raporlama
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.
Breakpad kütüphanesini oluşturma
Ardından, resmi Android için Google Breakpad README'de listelenen yönergeleri izleyerek Google Breakpad'i dahil edin ve derleyin.
Uyarı
App Center SDK'sı, Google Breakpad'i varsayılan olarak paketlemez.
Özel durum işleyicisini ekleme
Google Breakpad'i ekledikten sonra, AppCenter.start
'den sonra NDK Kilitlenme İşleyicisi'ni ekleyin.
// Attach NDK Crash Handler after SDK is initialized.
Crashes.getMinidumpDirectory().thenAccept(new AppCenterConsumer<String>() {
@Override
public void accept(String path) {
// Path is null when Crashes is disabled.
if (path != null) {
setupNativeCrashesListener(path);
}
}
});
yöntemi setupNativeCrashesListener
, C/C++'da uygulamanız gereken yerel bir yöntemdir:
#include "google-breakpad/src/client/linux/handler/exception_handler.h"
#include "google-breakpad/src/client/linux/handler/minidump_descriptor.h"
void Java_com_microsoft_your_package_YourActivity_setupNativeCrashesListener(
JNIEnv *env, jobject, jstring path) {
const char *dumpPath = (char *) env->GetStringUTFChars(path, NULL);
google_breakpad::MinidumpDescriptor descriptor(dumpPath);
new google_breakpad::ExceptionHandler(descriptor, NULL, dumpCallback, NULL, true, -1);
env->ReleaseStringUTFChars(path, dumpPath);
}
dumpCallback
Sorun giderme için nerede kullanılır:
/*
* Triggered automatically after an attempt to write a minidump file to the breakpad folder.
*/
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 yeniden başlatıldıktan sonra minidump'ı App Center'a otomatik olarak gönderir.
Sorun gidermek için, uygulama yeniden başlatıldıktan sonra minidumpların gönderilip gönderilmediğini denetlemek için ayrıntılı günlükleri (AppCenter.setLogLevel(Log.VERBOSE)
öncesinde AppCenter.start
) kullanabilirsiniz.
Uyarı
App Center, minidump ekleri için ayrılmış adı minidump.dmp
kullanır. Düzgün bir ş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.
Simgeselleştirme
Çökmelerin işlenmesiyle ilgili daha fazla bilgi için Tanı belgelerine bakın.