Android不授予转储权限

时间:2011-07-12 00:02:57

标签: android permissions dump

为了监控电池使用情况等,我有执行一些dumpsys调用的代码,读取并解析输出以提取我感兴趣的数据。

dumpsys电池 dumpsys状态栏 dumpsys power 都给我输出错误消息,如“权限拒绝:无法转储来自pid的电池服务......“ 此外,当应用程序启动时,日志中有一个标记为“PackageManager”的项目,表明没有授予android.permissionDUMP包权....(protectionLevel = 3 ...)“

然而, dumpsys cpuinfo dumpsys netstat 工作并给我正确的输出,这似乎是不一致的。

我能够从adb shell生成 dumpsys battery 等,但是当我尝试以编程方式调用它时,它无效。

我尝试在HTC Nexus One手机和模拟器上运行此功能,并为每个手机获得相同的结果。奇怪的是,这个代码一天前在我的Nexus One上运行(在我从2.2升级到2.3之前),现在它没有。这是因为升级吗?

我尝试运行的代码示例如下:

        String command = "dumpsys battery";
    try {
        String s = null;
        Process process = Runtime.getRuntime().exec(command);


          BufferedReader stdInput = new BufferedReader(new 
                     InputStreamReader(process.getInputStream()));

                BufferedReader stdError = new BufferedReader(new 
                     InputStreamReader(process.getErrorStream()));

                // read the output from the command
                System.out.println("Here is the standard output of the command:\n");
                while ((s = stdInput.readLine()) != null) {
                    System.out.println(s);
                }

                // read any errors from the attempted command
                System.out.println("Here is the standard error of the command (if any):\n");
                while ((s = stdError.readLine()) != null) {
                    System.out.println(s);
                }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

如何让 dumpsys 以编程方式为我提供正确的输出以及如何获得转储权限

* Nexus One没有root权限,我希望无需根据项目的目的将其设置为

感谢您的帮助

3 个答案:

答案 0 :(得分:6)

常规应用程序无法获得DUMP权限。它保留给系统应用程序。

答案 1 :(得分:1)

android.permission.Dump受系统,签名和开发权限保护级别的保护。 the source的1993行显示了这一点。如果您的APK使用框架证书签名,在priv-app目录中,或者可调试(见下文),您可以使用pm服务授予权限,但是否则代码专门阻止您要求的内容(第2624行) source)。

可以通过build.gradle在buildType上设置debuggable属性来创建可调试的APK。 Android DSL示例:

android {
    ...
    buildTypes {
        debug {
            debuggable true
            ...
        }
        quality_assurance {
            debuggable true
        }
    ...
}

答案 2 :(得分:0)

如果您的手机已经植根,那么'dumpsys活动'将适用于Android2.3:

private static void dumpIT0(String sCmd) {
    try {
        String s = null;
        String command = "su -c " + sCmd;
        Process process = Runtime.getRuntime().exec(command);

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(
                process.getInputStream()));

        BufferedReader stdError = new BufferedReader(new InputStreamReader(
                process.getErrorStream()));

        // read the output from the command
        System.out.println("Here is the standard output of the command:\n");
        while ((s = stdInput.readLine()) != null) {
            System.out.println(s);
        }

        // read any errors from the attempted command
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((s = stdError.readLine()) != null) {
            System.out.println(s);
        }
    } catch (IOException e) {
        Log.e(TAG, "IOException: " + e);
    }
}
sCmd = "dumpsys activity";