Aracılığıyla paylaş


App Center Kilitlenmeleri (Android)

Ö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ı 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.