Aracılığıyla paylaş


App Center Kilitleniyor (Android)

Ö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 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ı yeniden başlattığında kilitlenme raporu App Center'a gönderilir. Kilitlenmeleri toplamak hem beta hem de canlı uygulamalar için (örneğin Google Play'e gönderilenler) işe yarar. Kilitlenme günlükleri, kilitlenmeyi düzeltmenize 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şturma

App Center Kilitlenmeleri, SDK'nın kolay testine yönelik bir test kilitlenmesi oluşturmak için size bir API sağlar. 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 Kilitlenmeleri, uygulamanızın kilitlenmesi durumunda size daha fazla bilgi veren iki API'ye sahiptir.

Uygulama önceki oturumda yetersiz bellek uyarısı mı almış?

SDK'yı başlattıktan sonra, uygulamanın önceki oturumda bellek uyarısı aldığını kontrol edebilirsiniz:

Crashes.hasReceivedMemoryWarningInLastSession();
Crashes.hasReceivedMemoryWarningInLastSession()

Bu API zaman uyumsuzdur, App Center Zaman Uyumsuz API'ler kılavuzumuzda bu konuda daha fazla bilgi edinebilirsiniz.

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır, her zaman başlamadan önce döndürülecektir false .

Not

Bazı durumlarda, belleği düşük olan bir cihaz olay gönderemez.

Uygulama önceki oturumda kilitleniyor mu?

SDK'yı başlattıktan sonra uygulamanın önceki başlatmada kilitlenip kilitlenmediğini kontrol edebilirsiniz:

Crashes.hasCrashedInLastSession();
Crashes.hasCrashedInLastSession()

Bu API zaman uyumsuzdur, App Center Zaman Uyumsuz API'ler kılavuzumuzda bu konuda daha fazla bilgi edinebilirsiniz.

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 kilitlenme gerçekleştikten sonra iletişim kurmanın bir yolunu seçmeyi tercih etti.

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır, her zaman başlamadan önce döndürülecektir false .

Son kilitlenmeyle ilgili ayrıntılar

Uygulamanız daha önce kilitlendiyse son kilitlenmeyle ilgili ayrıntıları alabilirsiniz.

Crashes.getLastSessionCrashReport();
Crashes.getLastSessionCrashReport()

Bu API zaman uyumsuzdur, App Center Zaman Uyumsuz API'ler kılavuzumuzda bu konuda daha fazla bilgi edinebilirsiniz.

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.

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır, her zaman başlamadan önce döndürülecektir null .

App Center Kilitlenmeleri kullanımınızı özelleştirme

App Center Kilitlenmeleri, geliştiricilerin App Center'a kilitlenme günlükleri göndermeden önce ve gönderirken ek eylemler gerçekleştirmesi için geri çağırmalar 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)

Not

App Center başlatmadan hemen sonra kilitlenmeleri işlemeye başladığından aramadanAppCenter.start()önce dinleyiciyi ayarlayın.

Kilitlenme işlenmeli mi?

Belirli bir kilitlenmenin işlenmesi gerekip gerekmediğine karar vermek istiyorsanız bu geri aramayı uygulayın. Örneğin, yoksaymak istediğiniz ve App Center'a göndermek istemediğiniz bir sistem düzeyinde kilitlenme 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 Kilitlenmeleri'ne kilitlenme raporlarını göndermeden önce kullanıcı onayını beklemesini bildiren bir geri arama sunar.

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 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:

@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 sdk'ya aşağıdaki API'yi kullanarak sonucu 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üğünün gönderme durumu hakkında bilgi alma

Bazen uygulamanızın kilitlenme durumunu bilmek istersiniz. Sık karşılaşılan bir kullanım örneği, kullanıcılara uygulamanızın kilitlenme raporu gönderdiğini bildiren kullanıcı arabirimini göstermek veya uygulamanızın başlatma sonrasında hızla kilitlenmesi durumunda kilitlenme günlüklerinin gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir. App Center Kilitlenmeleri, neler olduğu hakkında bildirim almak için uygulamanızda kullanabileceğiniz üç farklı geri çağırmaya sahiptir:

SDK bir kilitlenme günlüğü göndermeden önce aşağıdaki geri arama çağrılı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 başarılı bir şekilde bir kilitlenme günlüğü gönderdikten sonra aşağıdaki geri arama çağrılır

@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önderemezse aşağıdaki geri arama ç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.
}

Alma 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 arama bir ağ sorunuysa tetiklenmemiştir. Bu durumda SDK yeniden denemeye devam eder (ve ağ bağlantısı kapalıyken yeniden denemeleri duraklatır).

Kilitlenme raporuna ek ekleme

Kilitlenme raporuna ikili ve metin ekleri ekleyebilirsiniz. SDK bunları kilitlenmeyle birlikte gönderir, böylece bunları App Center portalında görebilirsiniz. Önceki uygulama başlatmalarından depolanan kilitlenme gönderilmeden hemen önce aşağıdaki geri arama çağrılır. Kilitlenme gerçekleştiğinde çağrılmayacak. Minidump dosyaları için ayrılmış bir ad olduğundan ek dosyasının adlandırılmadığındanminidump.dmp emin olun. 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)
}

Not

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 Kilitlenmelerini etkinleştirme veya devre dışı bırakma

Ç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 yapmaz.

Crashes.setEnabled(false);
Crashes.setEnabled(false)

App Center Kilitlenmelerini yeniden etkinleştirmek için aynı API'yi kullanın ancak parametre olarak geçirin true .

Crashes.setEnabled(true);
Crashes.setEnabled(true)

Durum, uygulama başlatmaları arasında cihazın depolama alanında kalıcı hale geldi.

Bu API zaman uyumsuzdur, App Center Zaman Uyumsuz API'ler kılavuzumuzda bu konuda daha fazla bilgi edinebilirsiniz.

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır.

App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini denetleyin

App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini de de de kontrol edebilirsiniz:

Crashes.isEnabled();
Crashes.isEnabled()

Bu API zaman uyumsuzdur. App Center Zaman Uyumsuz API'ler kılavuzumuzda bu konuda daha fazla bilgi edinebilirsiniz.

Not

Bu yöntem yalnızca başlatıldıktan sonra Crashes kullanılmalıdır; her zaman başlamadan önce döndürülecektir false .

İşlenen Hatalar

App Center, 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);
}
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. Özellikleri, aşağıdaki örnekte gösterildiği gibi 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)
}

İsterseniz işlenen hata raporuna ikili ve metin ekleri de ekleyebilirsiniz. Aşağıdaki örnekte gösterildiği gibi ekleri geçirin Iterable .

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

Raporlama kilitlenmeleri

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.

Kesme çubuğu kitaplığını oluşturma

Ardından, Resmi Android için Google Breakpad README'de listelenen yönergeleri izleyerek Google Breakpad'i dahil edin ve derleyin.

Not

App Center SDK'sı, Google Breakpad'i varsayılan olarak paketlemez.

Özel durum işleyicisini ekleme

Google Breakpad'i ekledikten sonra NDK Kilitlenme İşleyicisi'ni şundan sonra AppCenter.startekleyin:

// 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'u App Center'a otomatik olarak gönderir. Sorun gidermek için ayrıntılı günlükleri (AppCenter.setLogLevel(Log.VERBOSE) önce AppCenter.start) kullanarak uygulama yeniden başlatıldıktan sonra minidumps 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 işleyebilmemiz için minidump dosyası olmadığı sürece ekinize farklı bir ad verdiğinizden emin olun.

Not

Kesme çubuğunda x86 öykünücülerinde kilitlenmeleri yakalamayı imkansız kılan bilinen bir hata vardır.

Simgeselleştirme

Kilitlenmelerin işlenmesiyle ilgili daha fazla bilgi için Tanılama belgelerine bakın.