android - 如何在没有事先可怕的 READ_LOGS 权限的情况下收集 native 堆栈跟踪?

标签 android permissions android-ndk stack-trace crash-dumps

我有一个主要是用 C 语言编写的 native 代码的应用程序:Simon Tatham's Puzzles .当我发现崩溃时(使用信号处理程序),Java 回溯只会告诉我问题的模糊区域:

W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles.resizeEvent(Native Method)
W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles$1.handleMessage(SGTPuzzles.java:126)
W System.err: at android.os.Handler.dispatchMessage(Handler.java:99)

为了有任何诊断希望,我需要的是 Android 框架写入日志的 native 回溯:

I DEBUG   :          #02  pc 0003e8ae  /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
I DEBUG   :          #03  pc 0003ed62  /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so
I DEBUG   :          #04  pc 00059060  /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so

据我所知,Android Market 的崩溃报告不包含 native 跟踪...是吗?

因此,我目前拥有自己的崩溃捕捉器和报告器,如 this previous question 中所述,它会让你进入一个电子邮件撰写窗口,其中包含你的登录信息。这很好用,但有一个问题:用户不阅读(或不相信)包描述中的解释,并被权限请求吓跑。

Permission request to read logs; comments about it from users

困扰我的不是这几条评论,而是不知道有多少人连安装都没安装就跑了。 :-(

那么如何在不让游戏需要可怕的日志权限的情况下获得崩溃时的 native 回溯?可能的解决方案包括:

  • 我错了,现在 Android 电子市场实际上会给我本地跟踪吗?
  • 当我遇到崩溃时建议人们立即安装并运行 Log Collector ?这是我目前的倾向。任何人都有一个很好的例子,说明文字写得很好?
  • 在使用信号处理程序捕获崩溃后(我可以做到),有什么方法可以读取我自己的 native 堆栈跟踪?在 Android/Bionic 上比在 glibc 平台上更难,没有可用的 backtrace()编辑: 这里的大部分内容似乎都是必需的:http://github.com/android/platform_system_core/tree/master/debuggerd - 在项目中包含足够多的内容会矫枉过正、臃肿、困难、不受支持、对 ABI 更改/添加很脆弱。似乎没有很好地利用时间。

最佳答案

编辑:从 Jelly Bean 开始,您和 Log Collector 都无法读取 debuggerd 的输出,因为 READ_LOGS went away . :-(

但是,Play Console 的崩溃报告现在包含原生堆栈跟踪(至少截至 2014 年底),这使得这一切变得不那么必要了。

以前:

我将以 git commit 的形式给出我的答案:

https://github.com/chrisboyle/sgtpuzzles/commit/e9917f1ffe93f9d9963463db849e3768beafccee

正如我在上面暗示的那样,这是对日志收集器的委托(delegate)。我像以前一样捕获崩溃(请参阅 my previous discussion of how to do that)像以前一样显示“哎呀,我崩溃了”屏幕,如果用户单击“报告”,我会提示他们安装 Log Collector(如果他们还没有安装的话)。

如果我已经让用户去安装它,一旦它完成安装,我就会捕捉到 PACKAGE_ADDED Intent 并使用适当的选项启动 Log Collector(我警告说我要做这个)。这样一来,用户就不会猜测他们应该单击“打开”,这将在没有我的目的地、主题和过滤器的情况下启动它。

过滤器值得拥有,因为它们将电子邮件中发送的内容限制在可能相关的行中。这节省了用户的带宽和我的收件箱容量,并且意味着用户可以更轻松地检查日志中没有任何敏感内容,因此更有可能同意发送它。

关于android - 如何在没有事先可怕的 READ_LOGS 权限的情况下收集 native 堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7456312/

相关文章:

Android 微调器和更改文本取决于项目选择

android - 如何使用 Intent 将表情符号和文本从 Activity 传递到下一个

windows - 如何区分 Windows 权限

java - 尝试加载显然存在的库时出现 UnsatisfiedLinkError

android - 让 OpenCV 支持 NDK 在 Android Studio 中工作

android - 里面有两个共享对象的 APK

android - 第一次使用 jquery mobile 加载页面后事件不起作用

当您不是文件所有者时,Java File.setLastModified() 在 Linux 上失败

javascript - Facebook Graph API - 如何请求额外的权限

Android 在 ViewPager 上保留 fragment