App Center kilitleniyor (Android)

App Center kilitlenmeler, uygulamanız her çöktüğünde otomatik olarak bir kilitlenme günlüğü oluşturur. Günlük ilk olarak cihazın depolamasına yazılır ve Kullanıcı uygulamayı yeniden başlattığında, kilitlenme raporu App Center gönderilir. Kilitlenmeler, hem Beta hem de canlı uygulamalar için, yani Google Play gönderilen kişiler için geçerlidir. 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 kilitlenmeler, SDK 'nın kolayca sınanması için bir test kilitlenme oluşturmak üzere bir API sağlar. Bu API yalnızca hata ayıklama yapılarında kullanılabilir ve yayın yapılarında hiçbir şey yapmaz.

Crashes.generateTestCrash();
Crashes.generateTestCrash()

Önceki kilitlenme hakkında daha fazla bilgi alın

App Center çökmeler, uygulamanızın kilitlenmesinin ardından size daha fazla bilgi veren iki API 'ye sahiptir.

Uygulama önceki oturumda düşük bir bellek uyarısı alıyor mu?

SDK 'Yı başlattıktan sonra herhangi bir zamanda uygulamanın önceki oturumda bir bellek uyarısı aldığından emin olabilirsiniz:

Crashes.hasReceivedMemoryWarningInLastSession();
Crashes.hasReceivedMemoryWarningInLastSession()

Bu API zaman uyumsuz bir işlemdir, bu konuda daha fazla bilgi için App Center API'ler kılavuzumuza bakabilirsiniz.

Not

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

Not

Bazı durumlarda, düşük bellekli bir cihaz olay gönderemezler.

Uygulamanın önceki oturumda kilitlenmesi mi oldu?

SDK'yı başlattıktan sonra herhangi bir zamanda, uygulamanın önceki başlatmada kilitlenmesi olup olduğunu kontrol edebilirsiniz:

Crashes.hasCrashedInLastSession();
Crashes.hasCrashedInLastSession()

Bu API zaman uyumsuz bir işlemdir, bu konuda daha fazla bilgi için App Center API'ler kılavuzumuza bakabilirsiniz.

Bu, kilitlenme gerçekleştikten sonra uygulamanın davranışını veya kullanıcı arabirimini ayarlamak istemeniz durumunda kullanışlıdır. Bazı geliştiriciler kullanıcılarından özür diley için ek kullanıcı arabirimi göstermeyi veya bir kilitlenme gerçekleştikten sonra iletişimde olmak istiyor.

Not

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

Son kilitlenmeyle ilgili ayrıntılar

Uygulamanız daha önce kilitlenmeye devam ettiyse, son kilitlenmeyle ilgili ayrıntıları edinebilirsiniz.

Crashes.getLastSessionCrashReport();
Crashes.getLastSessionCrashReport()

Bu API zaman uyumsuz bir işlemdir, bu konuda daha fazla bilgi için App Center API'ler kılavuzumuza bakabilirsiniz.

Bu API için çok sayıda kullanım örneğinin olduğu durumlardan en yaygını bu API'yi çağıran ve özel CrashesListener'larını uygulayan kişilerdir.

Not

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

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

App Center Kilitlenmeleri, geliştiricilerin kilitlenme günlüklerini App Center'a göndermeden önce ve gönderirken ek eylemler gerçekleştirmesi için geri App Center.

Geri çağırmaları işlemek için arabirimde tüm yöntemleri gerçekleştirin veya sınıfı geçersiz CrashesListener AbstractCrashesListener kılın ve yalnızca ilgilendiğiniz yöntemleri seçin.

Kendi CrashesListener'ını kullanma

Kendi CrashesListener'ını oluşturun ve şu şekilde attayin:

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ştirmekle ilgileniyorsanız, bunun yerine 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

Çağrısından önce dinleyiciyi AppCenter.start() ayarlayın çünkü App Center başladıktan hemen sonra kilitlenmeleri işlemeye başlar.

Kilitlenme işlenmeli mi?

Belirli bir kilitlenmenin işlenmeli olup olmadığını karar vermek için bu geri çağırmayı gerçekleştirin. Örneğin, yoksaymak istediğiniz ve App Center'a göndermek istemeyilen bir sistem düzeyi kilitlenmesi 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 önemli ise, kullanıcıya kilitlenme raporu göndermeden önce kullanıcı onayı almak App Center. SDK, kilitlenme raporları göndermeden önce App Center kilitlenmelerin Kullanıcı onayını beklediğini bildiren bir geri çağırma işlemini kullanıma sunar.

Bunu yapmayı seçerseniz, örneğin, aşağıdaki seçeneklerden biriyle bir iletişim kutusu aracılığıyla kullanıcının onayını almak sizin sorumluluğunuzdadır: her zaman gönder, Gönder ve Gönder. Girişe bağlı olarak, App Center kilitlenmelerin ne yapacaklarınız olduğunu söylersiniz ve kilitlenme daha sonra ele alınacaktır.

Not

SDK bunun için bir iletişim kutusu göstermez, uygulamanın kullanıcı onayını sormak için kendi Kullanıcı arabirimini sağlaması gerekir.

Aşağıdaki geri arama, SDK 'nın çökmeleri göndermeden önce Kullanıcı onayını beklemesini nasıl söylediğine göstermektedir:

@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
}

Geri dönerseniz true , uygulamanız kullanıcının iznini almalıdır (kendi kodunuzu kullanarak) ve aşağıdaki API 'yi kullanarak SDK 'yı sonuçla iletiyle birlikte döndürür:

// 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 örneğimizebaşvurabilirsiniz.

Kilitlenme günlüğü için gönderme durumu hakkında bilgi alın

Her zaman, uygulama kilitlenmesinin durumunu bilmeniz gerekir. Yaygın kullanım durumu, kullanıcılara uygulamanızın kilitlenme raporu göndereceğini belirten kullanıcı arabirimini göstermek ya da uygulamanızın başlatma sonrasında hızlı bir şekilde kilitlenmesinin ardından, kilitlenme günlüklerinin gönderilebildiğini doğrulamak üzere uygulamanın davranışını ayarlamak istemeniz olabilir. App Center çökmelerin, uygulamanızda neler olduğuna ilişkin bildirim almak için kullanabileceğiniz üç farklı geri çağırmaları vardır:

SDK bir kilitlenme günlüğü göndermeden önce aşağıdaki geri arama ç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.
}

Ağ sorunları veya uç noktada bir kesinti olması durumunda ve uygulamayı yeniden başlattığınızda, onBeforeSending işlem yeniden başlatıldıktan sonra yeniden tetiklenir.

SDK başarılı bir şekilde kilitlenme günlüğü gönderdikten sonra aşağıdaki geri çağırma çağrılacak

@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önderemediği takdirde aşağıdaki geri arama çağrılacaktı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 hatası oluşan kurtarılamaz bir hata anlamına gelir. Örneğin, 401 yanlış anlamına gelir appSecret .

Bu geri arama, bir ağ sorunuyla karşılaşırsanız tetiklenmez. Bu durumda, SDK yeniden denemeye devam eder (ve ayrıca ağ bağlantısı kapatılırken yeniden denemeleri duraklatır).

Kilitlenme raporuna ekler ekleme

Kilitlenme raporuna ikili ve metin ekleri ekleri ebilirsiniz. SDK bunları kilitlenmeyle birlikte gönderir, böylece bunları portalda App Center. Önceki uygulama başlatmalarından depolanmış kilitlenme göndermeden hemen önce aşağıdaki geri çağırma çağrılır. Kilitlenme olduğunda çağrılmaz. Ek dosyasının adı minidump dosyaları için ayrılmış olduğundan emin minidump.dmp olun. Kilitlenmeye metin ve görüntü ekleme örneği:

@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ışırken bir hata tetiklenir.

Çalışma zamanında App Center etkinleştirme veya devre dışı bırakma

Çalışma zamanında Kilitleniyor'App Center etkinleştirebilirsiniz ve devre dışı ağlayabilirsiniz. Devre dışı bıraksanız, SDK uygulama için herhangi bir kilitlenme raporlaması yapmaz.

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

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

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

Durum, uygulama başlatan tüm cihaz depolamalarında kalıcıdır.

Bu API zaman uyumsuz bir işlemdir, bu konuda daha fazla bilgi için App Center API'ler kılavuzumuza bakabilirsiniz.

Not

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

Kilitlenmelerin App Center olup App Center denetleme

Kilitlenmelerin etkin olup App Center olmadığını da kontrol edin:

Crashes.isEnabled();
Crashes.isEnabled()

Bu API zaman uyumsuz bir işlemdir, bu konuda daha fazla bilgi için App Center API'ler kılavuzumuza bakabilirsiniz.

Not

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

Ele Hatalar

App Center, işli özel durumları kullanarak hataları izlemenizi de sağlar. Bunu yapmak için trackError yöntemini 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 üzere işlenmiş bir hata raporuna özellikler ekleyebilir. Özellikleri, aşağıdaki örnekte gösterildiği gibi anahtar/değer çiftleri (yalnızca dizeler) haritası 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)
}

Ayrıca, işlenmiş bir hata raporuna isteğe bağlı olarak ikili ve metin ekleri ekleyebilirsiniz. Ekleri Iterable Aşağıdaki örnekte gösterildiği gibi bir 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))
}

Raporlama NDK kilitleniyor

Raporlama kilitlenmeleri

App Center uygun kilitlenme raporları almak için, önce yukarıda listelenen yönergeleri izleyerek App Center kilitlenme SDK 'sının ayarlanmış olduğundan emin olun.

BreakPad kitaplığı oluşturma

Sonra, Android Benioku dosyası için resmi Google BreakPadbölümünde listelenen yönergeleri Izleyerek Google BreakPad 'i dahil edin ve derleyin.

Not

App Center SDK, Google BreakPad 'i varsayılan olarak paketetmez.

Özel durum işleyicisini iliştirme

Google Breakpanel dahil ettikten sonra NDK kilitlenme Işleyicisini şu şekilde ekleyin AppCenter.start :

// 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);
}

dumpCallbackSorun giderme için kullanıldığı yer:

/*
 * 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 kurulduktan sonra, uygulama, yeniden başlatma sırasında otomatik olarak App Center için mini döküm gönderir. Sorun gidermek için, AppCenter.setLogLevel(Log.VERBOSE) AppCenter.start uygulama yeniden başlatıldıktan sonra mini dökümlerinin gönderilip gönderilmeyeceğini denetlemek için ayrıntılı günlükleri (önce) kullanabilirsiniz.

Not

App Center, minidump.dmp mini döküm ekleri için ayrılmış adı kullanır. Doğru bir şekilde işleyebilmemiz için bir mini döküm dosyası olmadığı için eki farklı bir ad olarak belirttiğinizden emin olun.

Not

BreakPad 'te, x86 öykünücülerinde kilitlenmelerin yakalanmasına neden olan bilinen bir hata var.

Simgesellik

Kilitlenmelerin işlemesi hakkında daha fazla bilgi için Tanılama belgelerine bakın.