Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
Visual Studio App Center dihentikan pada 31 Maret 2025, kecuali untuk fitur Analitik dan Diagnostik, yang akan terus didukung hingga 30 Juni 2026. Pelajari lebih lanjut.
App Center Crash akan secara otomatis menghasilkan log crash setiap kali aplikasi Anda mengalami crash. Log pertama kali ditulis ke penyimpanan perangkat dan ketika pengguna memulai aplikasi lagi, laporan crash akan dikirim ke App Center. Mengumpulkan crash berfungsi untuk aplikasi beta dan yang sudah dirilis, yaitu yang diterbitkan di Google Play. Catatan kerusakan berisi informasi berharga bagi Anda untuk membantu memperbaiki masalah.
Ikuti bagian Memulai jika Anda belum menyiapkan SDK di aplikasi Anda.
Membuat crash pengujian
App Center Crashes memberi Anda API untuk menghasilkan crash uji yang mempermudah pengujian SDK. API ini hanya dapat digunakan dalam build debug dan tidak akan melakukan apa pun dalam build rilis.
Crashes.generateTestCrash();
Crashes.generateTestCrash()
Dapatkan informasi selengkapnya tentang crash sebelumnya
App Center Crashes memiliki dua API yang memberi Anda informasi lebih lanjut jika aplikasi Anda mengalami crash.
Apakah aplikasi menerima peringatan memori rendah di sesi sebelumnya?
Kapan saja setelah memulai SDK, Anda dapat memeriksa apakah aplikasi menerima peringatan memori di sesi sebelumnya:
Crashes.hasReceivedMemoryWarningInLastSession();
Crashes.hasReceivedMemoryWarningInLastSession()
API ini asinkron, Anda dapat membaca lebih lanjut tentang itu di panduan API Asinkron App Center kami.
Nota
Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali false sebelum dimulai.
Nota
Dalam beberapa kasus, perangkat dengan memori rendah tidak dapat mengirim peristiwa.
Apakah aplikasi mengalami crash di sesi sebelumnya?
Kapan saja setelah memulai SDK, Anda dapat memeriksa apakah aplikasi mengalami crash di peluncuran sebelumnya:
Crashes.hasCrashedInLastSession();
Crashes.hasCrashedInLastSession()
API ini asinkron, Anda dapat membaca lebih lanjut tentang itu di panduan API Asinkron App Center kami.
Ini berguna jika Anda ingin menyesuaikan perilaku atau UI aplikasi Anda setelah crash terjadi. Beberapa pengembang memilih untuk menunjukkan UI tambahan untuk meminta maaf kepada pengguna mereka, atau ingin cara menghubungi setelah crash terjadi.
Nota
Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali false sebelum dimulai.
Detail-detail tentang kerusakan terakhir
Jika aplikasi Anda mengalami crash sebelumnya, Anda bisa mendapatkan detail tentang crash terakhir.
Crashes.getLastSessionCrashReport();
Crashes.getLastSessionCrashReport()
API ini asinkron, Anda dapat membaca lebih lanjut tentang itu di panduan API Asinkron App Center kami.
Ada banyak kasus penggunaan untuk API ini, yang paling umum adalah orang-orang yang memanggil API ini dan menerapkan CrashesListener kustom mereka.
Nota
Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali null sebelum dimulai.
Sesuaikan penggunaan App Center Crashes Anda
App Center Crash menyediakan panggilan balik bagi pengembang untuk melakukan tindakan tambahan sebelum dan saat mengirim log crash ke App Center.
Untuk menangani panggilan balik, terapkan semua metode di antarmuka CrashesListener, atau lakukan override pada kelas AbstractCrashesListener dan pilih hanya yang Anda minati.
Gunakan CrashesListener Anda sendiri
Buat CrashesListener Anda sendiri dan tetapkan seperti ini:
CrashesListener customListener = new CrashesListener() {
// Implement all callbacks here.
};
Crashes.setListener(customListener);
val customListener = object : CrashesListener {
// Implement all callbacks here.
}
Crashes.setListener(customListener)
Jika Anda hanya tertarik untuk menyesuaikan beberapa panggilan balik, gunakan sebagai gantinya AbstractCrashesListener :
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)
Nota
Atur pendengar sebelum memanggil AppCenter.start(), karena App Center mulai memproses kesalahan segera setelah aplikasi dimulai.
Apakah kerusakan harus diproses?
Terapkan panggilan balik ini jika Anda ingin memutuskan apakah crash tertentu perlu diproses atau tidak. Misalnya, mungkin ada crash tingkat sistem yang ingin Anda abaikan dan tidak ingin Anda kirim ke App Center.
@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
}
Minta persetujuan pengguna untuk mengirim log crash
Jika privasi pengguna penting bagi Anda, Anda mungkin ingin mendapatkan konfirmasi pengguna sebelum mengirim laporan crash ke App Center. SDK mengekspos panggilan balik yang memberi tahu App Center Crashes untuk menunggu konfirmasi dari pengguna sebelum mengirimkan laporan crash.
Jika Anda memilih untuk melakukannya, Anda bertanggung jawab untuk mendapatkan konfirmasi pengguna, misalnya melalui perintah dialog dengan salah satu opsi berikut: Selalu Kirim, Kirim, dan Jangan kirim. Berdasarkan input, Anda akan memberi tahu App Center Crashes apa yang harus dilakukan dan crash kemudian akan ditangani sesuai dengan itu.
Nota
SDK tidak menampilkan dialog untuk ini, aplikasi harus menyediakan UI sendiri untuk meminta persetujuan pengguna.
Panggilan balik berikut menunjukkan cara memberi tahu SDK untuk menunggu konfirmasi pengguna sebelum mengirim crash:
@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
}
Jika Anda mengembalikan true, aplikasi Anda harus mendapatkan (menggunakan kode Anda sendiri) izin pengguna dan mengirim pesan ke SDK dengan hasilnya menggunakan API berikut:
// 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)
Sebagai contoh, Anda dapat merujuk ke contoh dialog kustom kami.
Dapatkan informasi tentang status pengiriman log kerusakan.
Terkadang, Anda ingin mengetahui status crash aplikasi Anda. Kasus penggunaan umum adalah Anda mungkin ingin menampilkan UI yang memberi tahu pengguna bahwa aplikasi Anda mengirimkan laporan crash, atau, jika aplikasi Anda mengalami crash dengan cepat setelah peluncuran, Anda ingin menyesuaikan perilaku aplikasi untuk memastikan log crash dapat dikirimkan. App Center Crashes memiliki tiga panggilan balik berbeda yang dapat Anda gunakan di aplikasi Anda untuk diberi tahu tentang apa yang terjadi:
Panggilan balik berikut akan dipanggil sebelum SDK mengirim log crash
@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.
}
Jika kami mengalami masalah jaringan atau pemadaman di titik akhir, dan Anda memulai ulang aplikasi, onBeforeSending dipicu lagi setelah proses dimulai ulang.
Panggilan balik berikut akan dipanggil setelah SDK berhasil mengirim log crash
@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.
}
Panggilan balik berikut akan dipanggil jika SDK gagal mengirim log crash
@Override
public void onSendingFailed(ErrorReport report, Exception e) {
// Your code goes here.
}
override fun onSendingFailed(report: ErrorReport?, e: Exception?) {
// Your code goes here.
}
Penerimaan onSendingFailed berarti terjadi kesalahan yang tidak dapat dipulihkan seperti kode 4xx . Misalnya, 401 berarti appSecret salah.
Panggilan balik ini tidak dipicu jika merupakan masalah jaringan. Dalam hal ini, SDK terus mencoba kembali (dan juga menjeda percobaan kembali saat koneksi jaringan tidak berfungsi).
Tambahkan lampiran ke laporan crash
Anda dapat menambahkan lampiran biner dan teks ke laporan crash. SDK akan mengirimkannya bersama dengan kerusakan sehingga Anda dapat melihatnya di portal App Center. Fungsi pemanggilan kembali berikut akan dijalankan tepat sebelum mengirimkan laporan crash yang tersimpan dari peluncuran aplikasi sebelumnya. Ini tidak akan dipanggil ketika crash terjadi. Pastikan file lampiran tidak diberi nama minidump.dmp karena nama tersebut dicadangkan untuk file minidump. Berikut adalah contoh cara melampirkan teks dan gambar ke crash:
@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)
}
Nota
Batas ukuran saat ini adalah 7 MB. Mencoba mengirim lampiran yang lebih besar akan memicu kesalahan.
Mengaktifkan atau menonaktifkan App Center Crash selama waktu eksekusi
Anda dapat mengaktifkan dan menonaktifkan App Center Crash pada runtime. Jika Anda menonaktifkannya, SDK tidak akan melakukan pelaporan crash untuk aplikasi.
Crashes.setEnabled(false);
Crashes.setEnabled(false)
Untuk mengaktifkan kembali App Center Crashes, gunakan API yang sama tetapi masukkan true sebagai parameter.
Crashes.setEnabled(true);
Crashes.setEnabled(true)
Status ini bertahan di penyimpanan perangkat di seluruh peluncuran aplikasi.
API ini asinkron, Anda dapat membaca lebih lanjut tentang itu di panduan API Asinkron App Center kami.
Nota
Metode ini hanya boleh digunakan setelah Crashes dimulai.
Periksa apakah App Center Crashes diaktifkan
Anda juga dapat memeriksa apakah App Center Crash diaktifkan atau tidak:
Crashes.isEnabled();
Crashes.isEnabled()
API ini asinkron, Anda dapat membaca lebih lanjut tentang itu di panduan API Asinkron App Center kami.
Nota
Metode ini hanya boleh digunakan setelah Crashes dimulai, metode ini akan selalu kembali false sebelum dimulai.
Kesalahan yang Ditangani
App Center juga memungkinkan Anda melacak kesalahan dengan menggunakan pengecualian yang ditangani. Untuk melakukannya, gunakan trackError metode :
try {
// your code goes here.
} catch (Exception exception) {
Crashes.trackError(exception);
}
try {
// your code goes here.
} catch (exception: Exception) {
Crashes.trackError(exception)
}
Aplikasi dapat secara opsional melampirkan properti ke laporan kesalahan yang ditangani untuk memberikan konteks lebih lanjut. Teruskan properti sebagai peta pasangan kunci/nilai (hanya string) seperti yang ditunjukkan pada contoh di bawah ini.
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)
}
Anda juga dapat menambahkan lampiran biner dan teks secara opsional ke laporan kesalahan yang ditangani. Teruskan lampiran sebagai Iterable seperti yang ditunjukkan pada contoh di bawah ini.
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))
}
Melaporkan kerusakan NDK
Pelaporan kerusakan sistem
Untuk menerima laporan crash yang tepat di App Center, pertama-tama pastikan Anda menyiapkan App Center Crashes SDK dengan mengikuti instruksi yang tercantum di atas.
Membangun perpustakaan breakpad
Selanjutnya, sertakan dan kompilasi Google Breakpad dengan mengikuti petunjuk yang tercantum di Google Breakpad resmi untuk ReadME Android.
Nota
App Center SDK tidak menggabungkan Google Breakpad secara default.
Melampirkan penangani pengecualian
Setelah Google Breakpad disertakan, lampirkan NDK Crash Handler setelah 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);
}
}
});
Metode setupNativeCrashesListener ini adalah metode asli yang harus Anda terapkan di C/C++:
#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);
}
Tempat dumpCallback digunakan untuk pemecahan masalah:
/*
* 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;
}
Setelah metode ini disiapkan dengan benar, aplikasi mengirimkan minidump ke App Center secara otomatis setelah dimulai ulang.
Untuk memecahkan masalah, Anda dapat menggunakan log verbose (AppCenter.setLogLevel(Log.VERBOSE) sebelum AppCenter.start) untuk memeriksa apakah minidump dikirim setelah aplikasi dimulai ulang.
Nota
App Center menggunakan nama minidump.dmp yang dipesan untuk lampiran minidump. Pastikan untuk memberi lampiran Anda nama yang berbeda kecuali itu adalah file minidump sehingga kami dapat menanganinya dengan benar.
Nota
Ada bug yang diketahui di breakpad yang membuatnya tidak dapat menangkap kerusakan pada emulator x86.
Simbolikasi
Lihat dokumentasi diagnostik untuk informasi selengkapnya mengenai pemrosesan kerusakan.