使用 ACRA 和 Cloudant 自动生成 Android 崩溃报告
已发表: 2022-03-11制作一个基本的 Android 应用程序很容易。 另一方面,制作一个可靠、可扩展且健壮的 Android 应用程序可能非常具有挑战性。
从大量不同的制造商那里抽出成千上万的可用设备,假设单个代码可以在手机上可靠地工作充其量是幼稚的。
分段是拥有开放平台的最大权衡,我们以代码维护的货币付出代价,这在应用程序通过生产阶段后很长时间仍然存在。
为什么 Android 错误报告很重要
那么,当 Android 应用程序崩溃或无响应时会发生什么? 好吧,弹出“强制关闭”对话框,让用户知道出了点问题。 如果应用是通过 Google Play 下载的,系统会通过发送详细的 Android 崩溃报告(包括时间、手机型号、Android 版本、堆栈跟踪等)提示用户报告崩溃,您(开发者)可以在其中查看开发者控制台,允许您解决罪魁祸首错误。
这一切听起来都很好——但是使用 Android 的默认错误报告存在一个主要问题:当他们的应用程序崩溃时,用户往往不采取行动; 事实上,大多数人选择不发送 Android 错误报告。 那么,作为一名尽职尽责的开发人员,您如何能够可靠地了解您的应用程序的崩溃和故障呢?
介绍 ACRA
ACRA 代表“Android 的自动崩溃报告”。 这是一个免费的库,可以让您用几行代码解决“手动错误报告”问题。 一旦你实现了这个库并且一切都被正确初始化,你就可以自动提取与谷歌默认相同的 Android 错误日志(加上一堆添加的自定义选项),而无需用户采取行动。
除此之外,ACRA 允许您选择通知用户 Android 崩溃的方式,默认为静默后台报告,以及包括自定义对话框在内的替代方案。
直到最近,ACRA 还得到了 Google 电子表格的支持,这意味着您可以在一个文件中接收所有报告,该文件免费托管在您的 Google Drive 帐户上。 不幸的是,谷歌要求我们以后不要使用这个选项,所以我们有几个替代方案来发送崩溃报告数据,其中一些我们将在本教程中介绍:
- 标准电子邮件(仍需要用户交互)。
- 自定义电子邮件/HTTP 客户端(需要大量设置)。
- 自定义后端(提供从免费到商业解决方案的选项)。
在本文中,我们将分析其中一种解决方案:在 Cloudant 后端托管您的 ACRA 报告并使用 acralyzer 可视化数据。
设置 Cloudant 后端
我们需要做的第一件事是注册一个 Cloudant 帐户。 当然,有一个问题:Cloudant 的服务并非完全免费,但根据他们的定价页面,您不太可能超过每月 5 美元的限制(除非您拥有庞大的用户群并且代码中有大量错误)。
注册后,我们需要了解事情的运作方式。 在高层次上,我们的后端将由两个组件组成:
- 一个存储数据库,或者更准确地说,一个 Apache CouchDB。 CouchDB 以 JSON 格式存储其数据,这意味着从 Android 设备发送的所有报告必须与格式匹配才能作为条目插入。 数据库插入是一个简单的 HTTP POST 或 PUT 请求。
- 一个网络应用程序(用于分析),或者更准确地说,一个 CouchApp。 这是一个简单的 JavaScript 应用程序,可让您运行查询并显示存储在 CouchDB 实例中的数据。
为了让我们的后端正常工作,我们需要设置这两个组件。 理论上,我们可以从源代码构建数据库和应用程序,然后使用工具将它们部署到我们的后端——但 ACRA 的优秀人员已经为我们做到了。 所以最简单的方法是复制一个远程数据库和一个远程应用程序。
让我们继续复制一个空的 ACRA CouchDB:
- 在您的 Cloudant 仪表板中选择“复制”部分。
- 作为源数据库,选择“远程数据库”,并将 http://get.acralyzer.com/distrib-acra-storage 作为 URL。
- 作为目标数据库,选择“新数据库”并将其命名为“acra-{myapp}”(不带引号)。 请注意,{myapp} 参数对于您的应用程序应该是唯一的,并且数据库名称必须以“acra-”开头。
- 单击“复制”。
因此,我们成功地复制了用于报告存储的数据库。 接下来,我们需要复制 acralyzer CouchApp 以便我们可以可视化数据:
- 在您的 Cloudant 仪表板中选择“复制”部分。
- 作为源数据库,选择“远程数据库”,并将 http://get.acralyzer.com/distrib-acralyzer 作为 URL。
- 作为目标数据库,选择“新建数据库”并将其命名为“acralyzer”。
- 单击“复制”。
注意:复制 acralyzer 应用程序是可选的。 如果您只对存储 Android 崩溃报告而不是可视化数据感兴趣,则不需要它(我们将在本 Android 教程的下一部分中仔细研究 acralyzer)。 如果您对自己的 JavaScript 技能有足够的信心,您甚至可以编写自己的分析应用程序! 但这超出了这篇博文的范围。
初始设置过程的最后一步是添加安全权限。 Cloudant 在 CouchDB 上提供了自己的安全层,可以更好地控制个人权限,因此为了将报告写入我们的数据库,我们需要创建一个具有写入权限的用户帐户:
- 在 Cloudant 仪表板中选择“数据库”部分。
- 单击 acra-{myapp} 数据库的权限部分(锁定图标)。
- 单击“生成 API 密钥”。
- 记下生成的用户名和密码(稍后我们将使用它们)。
- 为生成的用户名添加写权限。
使用 acralyzer 可视化 Android 崩溃报告
复制后,可以通过https://{myapp}.cloudant.com/acralyzer/_design/acralyzer/index.html#/dashboard
轻松访问 acralyzer 仪表板。 我承认:它不是最漂亮的分析工具,但它服务于它的目的。
从顶部菜单中,您可以选择要可视化的数据库(可以在单个项目中为不同的应用程序托管多个数据库;这将影响您的使用配额)并在主仪表板中预览数据。 例如,您可以:
- 按时间单位(小时、天、月等)绘制报告数量。
- 按 Android 特定指标(Android 版本、SDK 版本、应用版本、设备等)查看报告的分布情况。
- 列出所有崩溃报告(带有详细的堆栈跟踪)或查看所有错误(这里,“错误”是一组来自不同用户的相同报告)。
- 预览单个错误的详细信息并将其状态设置为已解决(如果已修复)。
- 清除旧的或过时的条目。

请注意,可用于可视化的 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} 占位符替换为实际值,以及formUriBasicAuthLogin
和formUriBasicAuthPassword
的值。
从上面的代码片段可以看出,我们只使用了必填的报告字段。 随意添加可能与您的应用程序相关的任何其他字段。
您也可以选择使用 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 呢? 我给你两个理由。
所有这些其他选项都是封闭源代码的专有软件。 即使有一篮子 EULA,您也无法确定您的数据是如何收集和处理的。 另一方面,ACRA 和 acralyzer 是托管在 GitHub 上的开源项目,您可以轻松地分叉和定制您的需求。
数据移动性。 假设您对 Cloudant 不满意。 将数据复制和迁移到另一个后端是轻而易举的事。 您可以保证数据始终属于您。
与许多选择一样,这归结为个人偏好和熟悉程度。 查看此 Google+ 主题,了解有关使您的应用程序更可靠的各种替代方案的更多讨论。
综上所述
ACRA 是一个高度健壮且高度可定制的库,可与 Cloudant 和 acralyzer 一起使用,为您的应用程序实现免费的自动崩溃报告和基本分析,所有这些都只需最少的实施工作。
编写可靠的 Android 代码需要大量的经验和远见,但我们都不是真正无所不知的。 为意外的崩溃和错误做好准备,并准备尽快修复意外。 这就是出色的产品和出色的用户体验所需要的工作。