Android dumpsys权限拒绝

6
我有一个应用程序,在其中创建一个进程并调用dumpsys telephony.registry命令来获取有关移动网络状态的信息。
String[] cmds={"dumpsys telephony.registry"};
Process p = Runtime.getRuntime().exec(cmds [0]+"\n");

然后,我解析命令的结果。对于“ls”或其他命令,它运行良好。对于dupmsys,我得到“Permission Denial: can't dump telephony.registry from pid-953, uid=10090”的错误。对于“dumpsys power”或其他dumpsys命令,我得到相同的错误结果。
我已经像建议here那样在Android清单中设置了DUMP权限android.permission.DUMP。
我认为我做得很对,因为Android在这里here提供了这个功能。
我还按照here所述的步骤强制eclipse允许我在清单中授予我的应用程序DUMP权限。
当我执行dumpsys命令时,我总是得到相同的结果。
“Permission Denial: can't dump telephony.registry from pid-953, uid=10090”。

我是否做错了什么?为什么安卓操作系统仍然拒绝我访问转储服务?

PS:我已经设置了最小API为8,并在运行(ICS)API 15的设备上测试应用程序。

5个回答

8

为什么安卓操作系统仍然拒绝我访问转储服务?

因为在安卓2.3及以上版本中,该权限被标记为android:protectionLevel="signature|system|development"(或者使用旧语法的signatureOrSystem),因此普通的安卓SDK应用程序无法持有该权限。


我认为 Android 清单中的权限是为了给开发者提供这个选项。我有办法做到吗?或者无论如何 Android 都不允许我 dumpsys? - malcolm the4
@malcolmthe4:“我有办法做到吗?” -- 给您的设备获取Root权限并将您的应用安装在系统分区中。 - CommonsWare
我曾尝试在dumpsys命令之前运行su。我知道这可以工作,但这只限于已root的设备... 难道没有其他方法吗?我阅读了这篇文章https://gist.github.com/vnu/3258553 如何使用平台密钥签署我的应用程序? - malcolm the4
@malcolmthe4:“我该如何使用平台密钥签署我的应用程序?” -- 编译自己的ROM模组并将该ROM模组安装在自己的设备上。您用于编译该ROM模组中固件的签名密钥将是您需要用来签署应用程序以符合“signature”级别权限的签名密钥。 - CommonsWare
好的!所以dumpsys只适用于su和自定义ROM。 我会尝试在没有dumpsys的情况下实现我想要的功能。 无论如何还是谢谢你!!! :) - malcolm the4

6

有另一种(hacky)方法可以在不root设备的情况下访问dumpsys,通过adb shell

这将需要允许USB调试,并找到adb服务的端口。

  1. 在您的设备上启用USB调试。此选项在设置 -> 开发人员选项中找到。

  2. 将设备连接到电脑上,并从PC的shell /命令行运行以下命令:adb tcpip 12345。然后,在应用程序中从您的设备shell发出adb connect localhost:12345命令。现在您可以断开USB连接了。
    或者,您可以逐个扫描设备上的端口,而无需使用USB连接,使用adb connect localhost:<portnum>并查找adb服务正在侦听的端口。

  3. 如果提示,请授权USB调试以进行弹出确认对话框。勾选“始终”复选框,以后不再需要此步骤。

  4. 现在,当您可以访问adb服务时,从应用程序代码使用adb shell dumpsys ...来获取所需的任何服务转储。

注意:您不需要DUMP权限即可使用该功能。


1
它汇报了核心Android服务的私有值,通常情况下你无法获得这些值。官方文档中说:“不适用于第三方应用程序”。

1

-2
在你的清单文件中添加权限“android.permission.DUMP”。我还没有尝试过,但是在adb shell上显示缺少该权限。

这个不起作用! - The_Long_Distance_Runner

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