在Java中的Dumpsys权限拒绝

5
我正在尝试获取dumpsys统计信息[例如dumpsys cpuinfo,dumpsys battery]。我在Java中执行这些操作并将其写入文件。但是我遇到了以下问题:
2012.06.20 07:32:19
Permission Denial: can't dump cpuinfo from from pid=862, uid=10040 without permission android.permission.DUMP
for all dumpsys commands.

我已经在android.manifest中添加了"android.permission.DUMP""android.permission.BATTERY_STATS"权限。但是,没有得到预期的结果,请帮忙解决这个关键问题。我使用的代码如下,其中cmd包含dumpsys cpuinfo或dumpsys battery [任何一个]。

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
System.setOut(new PrintStream(new FileOutputStream("/sdcard/Monitor/"+file+".txt",false)));
System.out.println("\n\n"+sdf.format(cal.getTime()));           
Log.w("cmd-fn", cmd);
process=Runtime.getRuntime().exec(cmd);
process.waitFor();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String buffer="";

while((buffer=bufferedReader.readLine())!=null)
      {
    //fileobj.write(buffer);
    System.out.println(buffer);
    //output.write(buffer);
}
    buffer="";
    BufferedReader buffered = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    while((buffer=buffered.readLine())!=null)
        {
        Log.w("exception",buffer);
        }

以下是我的清单条目。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.DUMP" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

1
以下是我的清单文件。请帮忙。<?xml version="1.0" encoding="utf-8"?> <manifest package="com.monitor" android:versionCode="1" android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.DUMP"/> <uses-permission android:name="android.permission.BATTERY_STATS"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> - vinod
尝试在 uses-sdk 后添加权限。 - Vipul
@Vipul,我的清单文件中没有uses-sdk。请问在哪里可以找到? - vinod
5个回答

11

DUMP权限被定义为 android:protectionLevel="signatureOrSystem",因此除非您的应用程序使用平台密钥签名或安装在系统分区中,否则无法获得该权限。


如何实现?请帮忙。 - vinod
@Nick 有没有其他方法,比如将 android:protectionLevel 更改为其他值(例如 normal),使其正常工作?否则,如何使用平台密钥签署您的应用程序? - vinod
如果您不打算构建自定义固件(ROM),那么唯一的方法就是对手机进行root。 - Nikolay Elenkov
将您的应用程序安装为系统应用程序的唯一方法是拥有自己的ROM,并在构建ROM时(或通过ROM OTA)将其安装在那里。 - Jeffrey Blattman
能否使用root权限来使用dump权限?如果可以,怎么做? - android developer
显示剩余2条评论

2

请改进你的回答。 - Anthony Pham

1

你可以通过adb提供DUMP权限

adb shell pm grant <your-package-name> android.permission.DUMP

0

您可以通过检查/proc/meminfo文件来访问一些内存信息,在/proc/目录下还有其他有趣的文件。希望这些文件在未来的版本中将可读。

获取meminfo的代码示例:

    public static String showMemInfo() {
    StringBuilder meminfo = new StringBuilder();
    try {
        ArrayList<String> commandLine = new ArrayList<String>();
        commandLine.add("cat");
        commandLine.add("/proc/meminfo");

        Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[commandLine.size()]));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = bufferedReader.readLine()) != null) {
            meminfo.append(line);
            meminfo.append("\n");
        }

    } catch (IOException e) {
        Log.e(LOG_TAG, "Could not read /proc/meminfo", e);
    }

    return meminfo.toString();
}

PS:我知道它不像dumpsys那样冗长;)


-1

有另外两种方法可以获取 CPU 信息

  1. 在adb shell中使用top命令,获取最多信息

    top -n 1
    
  2. 您还可以通过cat /proc/stat和/proc/pid/stat读取CPU信息

    cat /proc/stat
    

    如果您想要详细信息,请查看获取内存使用情况


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