這很重要
Visual Studio App Center 於 2025 年 3 月 31 日淘汰,但分析和診斷功能除外,這些功能將持續支援到 2026 年 6 月 30 日。 瞭解更多資訊。
App Center 崩潰會在每次應用程式當機時自動產生當機記錄檔。 記錄會先寫入裝置的記憶體,當使用者再次啟動應用程式時,當機報告會傳送至 App Center。 收集崩潰報告適用於 Beta 版和正式版本應用程式,亦即提交至 Google Play 的應用程式。 當機記錄包含協助您修正當機的重要資訊。
如果您尚未在應用程式中設定 SDK,請遵循 開始使用 一節。
產生測試當機
App Center 當機提供 API 來產生測試當機,以便輕鬆測試 SDK。 此 API 只能在偵錯組建中使用,而且不會在發行組建中執行任何動作。
Crashes.generateTestCrash();
Crashes.generateTestCrash()
取得先前當機的詳細資訊
App Center Crashes 有兩個 API,可以在應用程式當機時提供更多資訊。
應用程式在上一個會話中是否收到記憶體不足的警告?
在啟動 SDK 之後,您可以隨時檢查應用程式是否在上一個工作階段中收到記憶體警告:
Crashes.hasReceivedMemoryWarningInLastSession();
Crashes.hasReceivedMemoryWarningInLastSession()
此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。
備註
這個方法只能在 Crashes
已啟動後使用,開始之前它總是會傳回 false
。
備註
在某些情況下,記憶體不足的裝置無法傳送事件。
應用程式在上一個工作階段中是否當機?
在啟動 SDK 之後,您可以隨時檢查應用程式是否在上一次啟動中當機:
Crashes.hasCrashedInLastSession();
Crashes.hasCrashedInLastSession()
此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。
如果您想要在發生當機后調整應用程式的行為或 UI,這會派上用場。 有些開發人員選擇顯示額外的 UI 來向使用者道歉,或者希望在發生當機後找到方法與他們聯繫。
備註
這個方法只能在 Crashes
已啟動後使用,開始之前它總是會傳回 false
。
上次當機的詳細數據
如果您的應用程式先前當機,您可以取得上次當機的詳細數據。
Crashes.getLastSessionCrashReport();
Crashes.getLastSessionCrashReport()
此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。
此 API 有許多使用案例,最常見的使用案例是呼叫此 API 並實作其自定義 CrashesListener 的人員。
備註
這個方法只能在 Crashes
已啟動後使用,開始之前它總是會傳回 null
。
自訂 App Center 當機的使用方式
App Center 當機提供回呼,讓開發人員在將損毀記錄傳送至 App Center 之前和時執行其他動作。
若要處理回呼,您可以在 CrashesListener
介面中實作所有方法,也可以覆寫 AbstractCrashesListener
類別,只選擇您有興趣的方法。
使用您自己的 CrashesListener
建立您自己的 CrashesListener,並按如下方式指定:
CrashesListener customListener = new CrashesListener() {
// Implement all callbacks here.
};
Crashes.setListener(customListener);
val customListener = object : CrashesListener {
// Implement all callbacks here.
}
Crashes.setListener(customListener)
如果您只想自訂某些回調函數,請改用 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)
備註
在呼叫 之前,先設定監聽器,因為 App Center 會在啟動後立即開始處理當機。
是否應該處理當機?
如果您想要決定是否需要處理特定的當機,請實作此回呼。 例如,您可能會想要忽略系統層級的崩潰,而且您也不希望將其傳送至 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
}
要求使用者同意傳送當機記錄檔
如果用戶隱私權對於您很重要,您可能會想要先取得使用者確認,再將當機報告傳送至 App Center。 SDK 會公開回呼,告知 App Center 損毀在傳送任何損毀報告之前等候用戶確認。
如果您選擇這樣做,您必須負責取得使用者的確認,例如透過具有下列其中一個選項的對話框提示: 永遠傳送、 傳送和 不要傳送。 根據輸入,您將告訴 App Center 崩潰需執行的動作,然後會據以處理崩潰。
備註
SDK 不會顯示此對話框,應用程式必須提供自己的 UI 以要求使用者同意。
下列回呼顯示如何告訴 SDK 等到使用者確認之後,再傳送錯誤回報:
@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
}
如果您傳回 true
,您的應用程式必須使用您自己的代碼取得使用者的許可,並使用下列 API 將結果傳送給 SDK。
// 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)
例如,您可以參考 我們的自定義對話範例。
取得當機記錄檔傳送狀態的相關資訊
有時,您想要知道應用程式當機狀態。 常見的使用案例是,您可能會想要顯示UI,告知使用者您的應用程式正在提交當機報告,或者,如果app在啟動後快速當機,您想要調整應用程式的行為,以確保可以提交當機記錄。 App Center 當機有三個不同的回呼,您可以在應用程式中用來通知發生什麼情況:
SDK 傳送當機記錄檔之前,將會調用下列回呼函式
@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.
}
如果我們在端點上有網路問題或中斷,而且您重新啟動應用程式, onBeforeSending
則會在進程重新啟動后再次觸發。
在 SDK 成功傳送當機記錄檔後,將會執行下列回呼函數
@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 無法傳送當機記錄檔,將會叫用下列回呼
@Override
public void onSendingFailed(ErrorReport report, Exception e) {
// Your code goes here.
}
override fun onSendingFailed(report: ErrorReport?, e: Exception?) {
// Your code goes here.
}
onSendingFailed
接收表示發生無法復原的錯誤,例如發生 4xx 碼。 例如, 401 表示 appSecret
錯誤。
若是網路問題,則不會觸發此回呼。 在此情況下,SDK 會持續重試(並在網路連線關閉時暫停重試)。
將附件新增至當機報表
您可以將二進位和文字附件新增至當機報表。 SDK 會連同當機一起傳送它們,讓您可以在 App Center 入口網站中看到它們。 在傳送先前應用程式啟動時生成的預存當機報告之前,會立即調用以下的回呼函數。 當系統崩潰時,不會被調用。 請確定附件檔案 未 命名 minidump.dmp
為該名稱保留給小型傾印檔案。 以下是如何將文字和影像附加至當機的範例:
@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)
}
備註
大小限制目前為 7 MB。 嘗試傳送較大的附件將會觸發錯誤。
在運行時間啟用或停用 App Center 當機
您可以在執行時間啟用和停用 App Center 崩潰功能。 如果您將其停用,SDK 將不會針對應用程式執行任何當機報告。
Crashes.setEnabled(false);
Crashes.setEnabled(false)
若要再次啟用 App Center 異常回報功能,請使用相同的 API,但傳遞 true
作為參數。
Crashes.setEnabled(true);
Crashes.setEnabled(true)
狀態會保存在裝置跨應用程式啟動時的記憶體中。
此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。
備註
只在啟動 Crashes
之後,才能使用這個方法。
檢查應用程式中心崩潰是否已啟用
您也可以檢查 App Center 損毀是否已啟用:
Crashes.isEnabled();
Crashes.isEnabled()
此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。
備註
這個方法只能在 Crashes
已啟動後使用,開始之前它總是會傳回 false
。
已處理的錯誤
App Center 也可讓您使用已處理的例外狀況來追蹤錯誤。 若要這樣做,請使用 trackError
方法:
try {
// your code goes here.
} catch (Exception exception) {
Crashes.trackError(exception);
}
try {
// your code goes here.
} catch (exception: Exception) {
Crashes.trackError(exception)
}
應用程式可以選擇性地將屬性附加至已處理的錯誤報告,以提供進一步的內容。 傳遞屬性作為鍵/值對的映射(僅限字串),如下列範例所示。
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)
}
您也可以選擇性地將二進位和文字附件新增至已處理的錯誤報告。 將附件作為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 當機問題
報告當機
若要在 App Center 中接收適當的當機報告,請先遵循上述指示,確定您已設定 App Center 損毀 SDK。
建置Breakpad程式庫
接下來,依照官方 Google Breakpad for Android 自述檔中列出的指示,包含並編譯Google Breakpad。
備註
App Center SDK 預設不會組合 Google Breakpad。
附加例外狀況處理程式
一旦您包含了 Google Breakpad,請在AppCenter.start
之後附加 NDK 崩潰處理程式。
// 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);
}
}
});
setupNativeCrashesListener
方法是您必須在 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);
}
用於疑難解答的位置 dumpCallback
:
/*
* 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;
}
這些方法正確設定之後,應用程式會在重新啟動時自動將小型轉儲傳送至 App Center。
若要進行疑難解答,您可以使用詳細日誌(AppCenter.setLogLevel(Log.VERBOSE)
前 AppCenter.start
)來檢查應用程式重新啟動後是否傳送迷你傾印。
備註
App Center 會使用保留名稱minidump.dmp
來處理迷你轉儲附件。 請務必為附件提供不同的名稱,除非它是小型傾印檔案,以便我們可以正確處理它。
備註
Breakpad 中有已知的錯誤,導致無法在 x86 模擬器上捕捉當機。
符號
如需有關損毀處理的詳細資訊,請參閱 診斷檔 。