检测设备上的应用程序崩溃

3

我已经搜索了很多地方,但似乎找不到我需要的答案。

我需要创建一个应用程序/服务,可以检测设备上运行的任何应用程序的崩溃(RuntimeExceptions或Errors),以便我可以看到它是否是我的应用程序引起的问题。但是,我一直遇到过时的方法、系统应用要求和未记录的权限。

目前的可能性:

当前解决方案

我创建了一个LogCat记录器,基本上执行一个logcat dump并过滤掉我要查找的日志(RuntimeException和Error),以便检测崩溃。基于MatLog:https://github.com/plusCubed/matlog 这有点复杂,因为我还需要应对READ_LOGS停用问题:https://commonsware.com/blog/2012/07/12/read-logs-regression.html,但我不需要实际的应用程序日志。
这种方法可以运行,但似乎有点笨重。有没有更好的方法来监视任何正在运行的任务并查看是否发生了崩溃?理想情况下,我可以随后转储LogCat以获取堆栈跟踪,而不是不断监视。
简而言之,什么是在设备上监视应用程序以检测崩溃的最佳方法?
谢谢
1个回答

2

声明:这不是最终答案,基于我的个人意见和经验,详见下文

阅读此部分

以便我可以确定它是否是我的应用程序之一

我猜你的目标是仅识别自己的应用程序崩溃,在这种情况下,我建议你在所有应用程序中实现Fabric,即使你不太喜欢它。 我知道这有点无聊,并且需要大量存储更新,但是现在我想到了几个原因:

  1. 使用Fabric,您不必再次发明轮子。简而言之,Crashlitics(Fabric)已经拥有一个问题跟踪器,一个可浏览的错误列表,其中包含有关使用应用程序的手机和错误日志记录的所有规格以及许多其他功能。

  2. 使用“另一个应用程序”解决方案,您会强制用户下载另一个应用程序。他们中的许多人可能不想这样做,因此您的日志被截断了很大一部分用户。如果您可以“强制”用户下载外部日志应用程序(也许是B到B,我不知道),则无论如何都会增加所需的磁盘空间,这是一个被广泛低估的问题。

  3. 实现Fabric只需3行代码,而实现自定义崩溃检测应用程序需要更多的工作。

  4. 您还将需要为您的调查创建Web /移动控制台。

为了获得更好的答案,我将添加两行有关如何添加Fabric的说明(它们在我上面发布的链接(重新链接)中都有很好的解释和报告):

Gradle.build文件中添加Fabric引用:

buildscript {
  repositories {
    maven { url 'https://maven.fabric.io/public' }
  }

  dependencies {
    // These docs use an open ended version so that our plugin
    // can be updated quickly in response to Android tooling updates

    // We recommend changing it to the latest version from our changelog:
    // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin
    classpath 'io.fabric.tools:gradle:1.+'
  }
}

apply plugin: 'com.android.application'
// Put Fabric plugin after Android plugin
apply plugin: 'io.fabric'

repositories {
  maven { url 'https://maven.fabric.io/public' }
}
dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  testCompile 'junit:junit:4.12'
  compile 'com.android.support:appcompat-v7:23.1.1'
  compile 'com.android.support:design:23.1.1'
  compile('com.crashlytics.sdk.android:crashlytics:2.9.4@aar') {
    transitive = true;
}

<Application...>标签下面添加以下这些包含API KEY的内容。
<meta-data
    android:name="io.fabric.ApiKey"
      android:value="<FABRIC_API_KEY>"
/>

如果您还没有,请添加Internet权限

并且也要添加Internet权限。
<uses-permission android:name="android.permission.INTERNET" />

最后,在您的主activity中添加初始化程序。
  Fabric.with(this, new Crashlytics());

只需构建项目即可。

请注意

如果您的目的也是要注册每个其他第三方应用程序,那么这是另一个问题,我暂时无法帮助您。我认为您可以阅读手机的logcat并注册ERROR(或以上)日志。另一种方法可能是创建启动器应用程序,因为它可以更完全地控制其他应用程序。

只是说一下

即使不是完美的答案,我还是想发布这篇文章,因为也许另一个观点可以帮助您选择最好的选择来满足您的需求,我希望这对您有所帮助,如果我找到了对第三方应用程序有用的东西,我会尽快在这里实现!

祝你好运!

编辑1

我找到了这个答案。它说您可以使用给定的代码读取Android应用程序的logcat。

此时,我建议您存储特定包名称(您的)应用程序的所有日志。这样,您将能够检测到您的应用程序日志并按照您的意愿处理它们 :)


感谢Pier的回答,如果由我决定,我会采取这种方法。不幸的是,在开发中经常出现这种情况,这个请求是从非技术人员那里传递给我的,所以无论它是否是正确的方法,我都必须找到一个可行的解决方案! - Joss Stuart
@JossStuart 你看过这个答案吗? - Pier Giorgio Misley
是的,这就是我目前设置的方式(详见我的问题),但感觉更像是“模拟”的而不是“数字”的,因为我只是在等待崩溃时候才会记录日志,而不是监控系统。 - Joss Stuart
@JossStuart 是的,这是主要问题...不幸的是,我认为如果没有 root 权限,你无法监视外部崩溃...请如果你发现更多信息,请更新我,因为我很感兴趣^^ - Pier Giorgio Misley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接