在Jelly Bean设备上阅读ActivityManager日志?

6

这个I/O演讲所说,Jelly Bean已经删除了读取其他应用程序日志的功能,这是一个明智的安全改进。不过,我的应用程序需要读取ActivityManager日志才能正常工作(以查看当前正在启动的应用程序)。为此,我一直在使用

private static final String clearLogcat = "logcat -c";
private static final String logcatCommand = "logcat ActivityManager:I *:S";
//...

由于在Jelly Bean中我只能读取自己应用程序的日志,因此不再起作用。除了root之外,是否有其他解决方案可以找出另一个应用程序何时启动?我理解为什么我们不应该能够阅读其他应用程序的日志(有点 - 应该是其他开发人员负责确保不记录个人信息,而不是通过防止读取日志来防止我的责任),但我不明白为什么包括框架类ActivityManager在这个策略中...

谢谢,
Nick

2个回答

7
这个问题正在这里进行广泛的讨论。不幸的是,它是“预期行为”,因此不会被修复。目前仅有的解决方法(在JB及以上版本中从应用程序中读取日志)是通过adb手动向应用程序授予权限: adb shell pm grant <pkg> android.permission.READ_LOGS 这种授权的权限: - 在重启后仍然有效 - 在应用程序更新后仍然有效(即“adb install -r”) - 如果应用程序被卸载然后重新安装,则无法继续使用
很明显,这不是普通用户可以指望完成的事情。Android团队承诺提供一个GUI解决方案(用户可以从设备的“设置”菜单中授予此权限),但不幸的是,在实施“修复”之前,该功能已被删除。

也许你应该更详细地解释为什么首先必须阅读日志...几乎肯定有一种不需要这样做的解决方案... - Alex Lockwood
你说得对 - 我只是想为那些寻找关于已移除READ_LOGS权限的人提供更多信息(因为标题和我问问题的方式)。 - Nick
2
需要注意的是,pm grant 只能在模拟器或“开发”设备上运行,而不能在生产设备上运行。 - JRaymond

0
首先,ActivityManager 不是一个应用程序... 它是 Android 应用程序框架的一部分。
其次,如果 Android 团队刻意阻止这个功能,那么我怀疑是否存在安全漏洞。事实上,第三方应用程序不应该依赖 logcat 日志来正常工作。如果您提供一些关于需要读取这些日志的原因的详细信息,也许我们可以帮助指向更好的解决方案。

1
实际上,安装在系统分区或使用相同证书签名的“应用程序”才能获取常规第三方应用程序无法获得的权限。不过,这个问题更多地涉及非“应用程序”系统进程。想必日志隔离是在进程级别进行的;但有趣的是看看它是如何实现的——最新发布的内核驱动程序源代码中似乎没有变化(即android-omap-tuna-3.0-jb-pre1)。 - Chris Stratton
你显然比我更了解这个问题...而且你可能是正确的,因为日志分离是在系统级别完成的...现在我想起来了,这对我来说更有意义。我尽量不涉及内核/库/Android运行时等方面的内容...当我回答这个问题时,我想我并不知道自己陷入了什么:P - Alex Lockwood
“系统应用程序”指的是 Android 应用程序框架类中的 ActivityManager,而不是任何 com.google.* 应用。在“解决它”的过程中,我并不是指安全漏洞,而是寻找其他应用程序启动时的替代方法。具体来说,我需要做到这一点:在另一个应用程序启动的瞬间找出它何时开始。到目前为止,我使用上面发布的 logcat 命令捕获 07-07 11:49:53.156: I/ActivityManager(304): START {cmp=com.mg.android/com.mg.weatherpro.MainView u=0} from pid 30607 日志。 - Nick
这并不是你应该在第三方应用程序中做的事情。 - Chris Stratton
1
@Nick "如果这是用户想要的东西,即有助于他"...只有当其中一个日志被更改并且应用程序在他们眼前崩溃时,用户才会感到满意。阅读日志从未正式成为Android SDK的一部分...因此,从框架设计师的角度来看(他们的工作是编写安全、可维护的API,向后兼容旧版本,并且在新版本中非常强大,不会破坏现有的应用程序),Android团队防止第三方应用程序读取这些日志是完全可以接受的。希望这样更有意义... :) - Alex Lockwood
显示剩余5条评论

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