我有一个应用程序,主要是用C编写的本机代码: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框架写入日志的原生回溯:
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的崩溃报告不包含原生痕迹......是吗?
因此,我目前拥有自己的崩溃捕手和记者,在this previous question中描述,它将提供一个电子邮件撰写窗口,其中包含您的登录信息。这很有效,但有一个问题:用户不会阅读(或不相信)包描述中的解释,并且会被权限请求吓跑。
这些评论并不是让我感到烦恼,而是那些在没有安装的情况下逃跑的未知人数。 : - (
所以如何在不让游戏需要可怕的日志权限的情况下获得本机回溯?可能的解决方案包括:
backtrace()
可用。 编辑:此处的大部分内容似乎都是必需的:http://github.com/android/platform_system_core/tree/master/debuggerd - 在项目中包含足够的内容会对ABI更改/添加造成过度,臃肿,困难,不受支持和脆弱。似乎没有好好利用时间。答案 0 :(得分:6)
编辑:从Jelly Bean开始,您和Log Collector都无法读取debuggerd
的输出,因为READ_LOGS went away。 : - (
但是,Play Console的崩溃报告现在包含本机堆栈跟踪(至少截至2014年底),这使得这一切变得更加不必要。
<强>此前:
我将以git commit的形式给出我的答案:
https://github.com/chrisboyle/sgtpuzzles/commit/e9917f1ffe93f9d9963463db849e3768beafccee
这是对Log Collector的委托,正如我在上面所暗示的那样。我像以前一样抓住崩溃(参见my previous discussion of how to do that),像以前一样显示“oops,I crashed”屏幕,如果用户点击Report,那么我提示他们安装Log Collector(如果还没有)。
如果我已经关闭了用户安装它,一旦安装完成,我就会抓住PACKAGE_ADDED
Intent并使用适当的选项启动Log Collector(我警告说我会这样做) 。这样就不会让用户猜测他们应该点击Open,这会在没有我的目标,主题和过滤器的情况下启动它。
过滤器值得拥有,因为它们将电子邮件中发送的内容限制为可能相关的行。这样可以节省用户的带宽和收件箱容量,这意味着用户可以更轻松地检查日志中没有任何敏感内容,因此更有可能同意发送它。
答案 1 :(得分:0)
还有另一种方法可以在没有任何特殊权限的情况下访问所有日志,但需要在手机上启用远程调试。看一下开源rootless Logcat app。