使用 ACRA 和 Cloudant 自動生成 Android 崩潰報告

已發表: 2022-03-11

製作一個基本的 Android 應用程序很容易。 另一方面,製作一個可靠、可擴展且健壯的 Android 應用程序可能非常具有挑戰性。

從大量不同的製造商那裡抽出成千上萬的可用設備,假設單個代碼可以在手機上可靠地工作充其量是幼稚的。

分段是擁有開放平台的最大權衡,我們以代碼維護的貨幣付出代價,這在應用程序通過生產階段後很長時間仍然存在。

為什麼 Android 錯誤報告很重要

那麼,當 Android 應用程序崩潰或無響應時會發生什麼? 好吧,彈出“強制關閉”對話框,讓用戶知道出了點問題。 如果應用是通過 Google Play 下載的,系統會通過發送詳細的 Android 崩潰報告(包括時間、手機型號、Android 版本、堆棧跟踪等)提示用戶報告崩潰,您(開發者)可以在其中查看開發者控制台,允許您解決罪魁禍首錯誤。

這一切聽起來都很好——但 Android 的默認錯誤報告存在一個主要問題:用戶往往不使用它,這讓開發人員對他們的應用程序的狀態一無所知。

這一切聽起來都很好——但是使用 Android 的默認錯誤報告存在一個主要問題:當他們的應用程序崩潰時,用戶往往採取行動; 事實上,大多數人選擇不發送 Android 錯誤報告。 那麼,作為一名盡職盡責的開發人員,您如何能夠可靠地了解您的應用程序的崩潰和故障呢?

當用戶不發送崩潰報告時,可靠的 Android 崩潰日誌尤其重要。

介紹 ACRA

ACRA 代表“Android 的自動崩潰報告”。 這是一個免費的庫,可以讓您用幾行代碼解決“手動錯誤報告”問題。 一旦你實現了這個庫並且一切都被正確初始化,你就可以自動提取與穀歌默認相同的 Android 錯誤日誌(加上一堆添加的自定義選項),而無需用戶採取行動。

除此之外,ACRA 允許您選擇通知用戶 Android 崩潰的方式,默認為靜默後台報告,以及包括自定義對話框在內的替代方案。

直到最近,ACRA 還得到了 Google 電子表格的支持,這意味著您可以在一個文件中接收所有報告,該文件免費託管在您的 Google Drive 帳戶上。 不幸的是,谷歌要求我們以後不要使用這個選項,所以我們有幾個替代方案來發送崩潰報告數據,其中一些我們將在本教程中介紹:

  • 標準電子郵件(仍需要用戶交互)。
  • 自定義電子郵件/HTTP 客戶端(需要大量設置)。
  • 自定義後端(提供從免費到商業解決方案的選項)。

在本文中,我們將分析其中一種解決方案:在 Cloudant 後端託管您的 ACRA 報告並使用 acralyzer 可視化數據。

設置 Cloudant 後端

我們需要做的第一件事是註冊一個 Cloudant 帳戶。 當然,有一個問題:Cloudant 的服務並非完全免費,但根據他們的定價頁面,您不太可能超過每月 5 美元的限制(除非您擁有龐大的用戶群並且代碼中有大量錯誤)。

註冊後,我們需要了解事情的運作方式。 在高層次上,我們的後端將由兩個組件組成:

  1. 一個存儲數據庫,或者更準確地說,一個 Apache CouchDB。 CouchDB 以 JSON 格式存儲其數據,這意味著從 Android 設備發送的所有報告必須與格式匹配才能作為條目插入。 數據庫插入是一個簡單的 HTTP POST 或 PUT 請求。
  2. 一個網絡應用程序(用於分析),或者更準確地說,一個 CouchApp。 這是一個簡單的 JavaScript 應用程序,可讓您運行查詢並顯示存儲在 CouchDB 實例中的數據。

為了讓我們的後端正常工作,我們需要設置這兩個組件。 理論上,我們可以從源代碼構建數據庫和應用程序,然後使用工具將它們部署到我們的後端——但 ACRA 的優秀人員已經為我們做到了。 所以最簡單的方法是複制一個遠程數據庫和一個遠程應用程序。

讓我們繼續複製一個空的 ACRA CouchDB:

  • 在您的 Cloudant 儀表板中選擇“複製”部分。
  • 作為源數據庫,選擇“遠程數據庫”,並將 http://get.acralyzer.com/distrib-acra-storage 作為 URL。
  • 作為目標數據庫,選擇“新數據庫”並將其命名為“acra-{myapp}”(不帶引號)。 請注意,{myapp} 參數對於您的應用程序應該是唯一的,並且數據庫名稱必須以“acra-”開頭。
  • 單擊“複製”。

這說明瞭如何設置 Cloudant 後端來管理 Android 崩潰報告。

因此,我們成功地複制了用於報告存儲的數據庫。 接下來,我們需要復制 acralyzer CouchApp 以便我們可以可視化數據:

  • 在您的 Cloudant 儀表板中選擇“複製”部分。
  • 作為源數據庫,選擇“遠程數據庫”,並將 http://get.acralyzer.com/distrib-acralyzer 作為 URL。
  • 作為目標數據庫,選擇“新建數據庫”並將其命名為“acralyzer”。
  • 單擊“複製”。

此步驟包括複製 acra 應用程序以可視化 Android 崩潰日誌數據。

注意:複製 acralyzer 應用程序是可選的。 如果您只對存儲 Android 崩潰報告而不是可視化數據感興趣,則不需要它(我們將在本 Android 教程的下一部分中仔細研究 acralyzer)。 如果您對自己的 JavaScript 技能有足夠的信心,您甚至可以編寫自己的分析應用程序! 但這超出了這篇博文的範圍。

初始設置過程的最後一步是添加安全權限。 Cloudant 在 CouchDB 上提供了自己的安全層,可以更好地控制個人權限,因此為了將報告寫入我們的數據庫,我們需要創建一個具有寫入權限的用戶帳戶:

  • 在 Cloudant 儀表板中選擇“數據庫”部分。
  • 單擊 acra-{myapp} 數據庫的權限部分(鎖定圖標)。
  • 單擊“生成 API 密鑰”。
  • 記下生成的用戶名和密碼(稍後我們將使用它們)。
  • 為生成的用戶名添加寫權限。

添加安全權限,以便以後可以訪問您的 Android 崩潰日誌和報告。

使用 acralyzer 可視化 Android 崩潰報告

複製後,可以通過https://{myapp}.cloudant.com/acralyzer/_design/acralyzer/index.html#/dashboard輕鬆訪問 acralyzer 儀表板。 我承認:它不是最漂亮的分析工具,但它服務於它的目的。

從頂部菜單中,您可以選擇要可視化的數據庫(可以為單個項目中的不同應用程序託管多個數據庫;這將影響您的使用配額)並在主儀表板中預覽數據。 例如,您可以:

  • 按時間單位(小時、天、月等)繪製報告數量。
  • 按 Android 特定指標(Android 版本、SDK 版本、應用版本、設備等)查看報告的分佈情況。
  • 列出所有崩潰報告(帶有詳細的堆棧跟踪)或查看所有錯誤(這裡,“錯誤”是一組來自不同用戶的相同報告)。
  • 預覽單個錯誤的詳細信息並將其狀態設置為已解決(如果已修復)。
  • 清除舊的或過時的條目。

可視化 Android 崩潰日誌數據對於更有策略地改進您的應用程序非常有幫助。

請注意,可用於可視化的 Android 崩潰指標將取決於我們選擇從應用發送的報告。 ACRA 提供了多種報告字段,其中一些可能非常大,或者與錯誤修復不完全相關。 對於大多數項目,所需的報告字段就足夠了。 這些包括:

  • APP_VERSION_CODE
  • APP_VERSION_NAME
  • ANDROID_VERSION
  • 包裹名字
  • REPORT_ID
  • 建造
  • 堆棧跟踪

在你的 Android 項目中實現 ACRA

正如本教程前面提到的,實施 ACRA 非常簡單,只需要幾個快速步驟。

添加依賴

首先,我們需要通過以下方式之一將庫作為依賴項包含在內:

  • 作為 /libs 文件夾中的 .jar 文件。
  • 作為 Maven 依賴項:

     <dependency> <groupId>ch.acra</groupId> <artifactId>acra</artifactId> <version>XYZ</version> </dependency>
  • 作為 gradle 依賴項:

     compile 'ch.acra:acra:XYZ'

添加應用程序類

接下來,我們需要在我們的項目中添加一個 Android Application 類(或者更新一個現有的類,因為只能有一個實例)並在 AndroidManifest.xml 中聲明它:

 <application android:name=".MyApp" android:theme="@style/AppTheme"> ...

並在那裡設置 ACRA:

 @ReportsCrashes( formUri = "https://{myusername}.cloudant.com/acra-{myapp}/_design/acra-storage/_update/report", reportType = HttpSender.Type.JSON, httpMethod = HttpSender.Method.POST, formUriBasicAuthLogin = "GENERATED_USERNAME_WITH_WRITE_PERMISSIONS", formUriBasicAuthPassword = "GENERATED_PASSWORD", formKey = "", // This is required for backward compatibility but not used customReportContent = { ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, ReportField.ANDROID_VERSION, ReportField.PACKAGE_NAME, ReportField.REPORT_ID, ReportField.BUILD, ReportField.STACK_TRACE }, mode = ReportingInteractionMode.TOAST, resToastText = R.string.toast_crash ) public class MainApp extends Application { @Override public void onCreate() { super.onCreate(); // The following line triggers the initialization of ACRA ACRA.init(this); } }

而已! 當然,您需要將所有 {myapp} 佔位符替換為實際值,以及formUriBasicAuthLoginformUriBasicAuthPassword的值。

從上面的代碼片段可以看出,我們只使用了必填的報告字段。 隨意添加可能與您的應用程序相關的任何其他字段。

您也可以選擇使用 PUT 而不是 POST。 在這種情況下, REPORT_ID將作為參數附加到former的末尾。

最後,您還可以選擇如何通知用戶 Android 應用程序崩潰,默認為靜默後台報告。 在我們的例子中,我們選擇顯示一條 Toast 消息,讓用戶知道已經報告了崩潰並且應該很快就會提供錯誤修復。

需要幫忙? 這是一個示例項目

為了查看 ACRA 的實際效果,我在 GitHub 上設置了 acra_example 存儲庫。 它具有一個簡單的應用程序,可以在啟動時初始化 ACRA,並讓您通過按下按鈕使其崩潰(然後觸發空指針異常)。 崩潰數據被發送到可在此處可視化的示例 Cloudant 數據庫。

要查看數據,請使用以下憑據登錄:

  • 用戶名:medo
  • 密碼:acraexample

ACRA 的替代品

ACRA 不是自動 Android 錯誤報告的唯一選擇。 由於崩潰必然會發生,因此有一個龐大的企業對開發人員 (B2D) 市場試圖將其解決方案貨幣化。

例如,Crittercism 是一個非常成熟的崩潰報告平台。 它看起來很棒,提供了許多數據分析選項,並且非常易於集成。 唯一的缺點:價格,免費試用在活躍用戶數量、數據保留天數和支持方面相當有限)。 BugSense 是一個類似的服務。

然而,在我看來,Crashlytics 是一個優越的解決方案。 直到最近,Crashlytics 還提供免費增值模式(具有付費的高級層); 但現在(在被 Twitter 收購後),所有以前的高級功能都可以免費使用。 沒有使用成本、費用或限制。 這是許多知名和高級公司和開發人員的首選錯誤報告方式,因為它非常易於使用並提供強大的分析和可視化工具。 它甚至可以作為插件與最流行的 IDE 集成(例如 Eclipse、Android Studio),因此將 Crashlytics 添加到您的應用程序就像選擇一個項目並按下一個按鈕一樣簡單。 這些插件還使您能夠從 IDE 跟踪崩潰報告,而無需打開瀏覽器。

那麼,當有其他替代方案看起來更好並且為相同的實施工作提供更多功能時,為什麼還要使用 ACRA 呢? 我給你兩個理由。

  1. 所有這些其他選項都是封閉源代碼的專有軟件。 即使有一籃子 EULA,您也無法確定您的數據是如何收集和處理的。 另一方面,ACRA 和 acralyzer 是託管在 GitHub 上的開源項目,您可以輕鬆地分叉和定制您的需求。

  2. 數據移動性。 假設您對 Cloudant 不滿意。 將數據複製和遷移到另一個後端是輕而易舉的事。 您可以保證數據始終屬於您

與許多選擇一樣,這歸結為個人偏好和熟悉程度。 查看此 Google+ 主題,了解有關使您的應用程序更可靠的各種替代方案的更多討論。

綜上所述

ACRA 是一個高度健壯且高度可定制的庫,可與 Cloudant 和 acralyzer 一起使用,為您的應用程序實現免費的自動崩潰報告和基本分析,所有這些都只需最少的實施工作。

編寫可靠的 Android 代碼需要大量的經驗和遠見,但我們都不是真正無所不知的。 為意外的崩潰和錯誤做好準備,並準備盡快修復意外。 這就是出色的產品和出色的用戶體驗所需要的工作。

相關:讓您的應用盈利——利用移動分析