如何在没有可怕的READ_LOGS权限的前提下收集本机堆栈跟踪?

Chr*_*yle 9 permissions android crash-dumps stack-trace android-ndk

我有一个应用程序,主要是用C编写的本机代码:Simon Tatham的谜题.当我遇到崩溃(使用信号处理程序)时,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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

据我所知,Android Market的崩溃报告不包括原生痕迹......是吗?

因此,我目前有我自己的崩溃捕手和记者,在上一个问题中描述,它将提供你带入登录的电子邮件撰写窗口.这很有效,有一个问题:用户不会阅读(或不相信)包描述中的解释,并且会被权限请求吓跑.

读取日志的权限请求;  来自用户的评论

这些评论并不是让我感到烦恼,而是那些在没有安装的情况下逃跑的未知人数.:-(

那么如何在不使游戏需要一个可怕的日志权限的情况下获得崩溃的原生回溯呢?可能的方案包括:

  • 我错了,Android Market实际上会给我这些天的原生痕迹?
  • 当我发现崩溃时,人们会立即安装并运行Log Collector?这就是我目前所倾向的.任何人都有一个这样做的好例子,写得很好的解释性文字?
  • 用信号处理程序(我可以做)抓住崩溃,任何方式来读取我自己的本机堆栈跟踪?在Android/Bionic上比在glibc平台上更难,没有backtrace().编辑:这里的大多数东西似乎都是必需的:http://github.com/android/platform_system_core/tree/master/debuggerd - 在项目中包含足够的东西会对ABI造成过度,臃肿,困难,不支持和脆弱修改/添加.似乎没有好好利用时间.

Chr*_*yle 6

编辑:从Jelly Bean开始,你和Log Collector都无法读取debuggerd输出,因为READ_LOGS消失了.:-(

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

先前:

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

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

正如我在上面暗示的那样,这是对Log Collector的委托.我像以前一样抓住了崩溃(参见我之前关于如何做的讨论),像以前一样显示"oops,I crashed"屏幕,如果用户单击Report,那么我提示他们安装Log Collector(如果他们还没有) .

如果我已经将用户安装下来安装它,一旦安装完毕,我就会抓住PACKAGE_ADDEDIntent并使用适当的选项启动Log Collector(我警告说我会这样做).这样就不会让用户猜测他们应该点击Open,这会在没有我的目标,主题和过滤器的情况下启动它.

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