Android не предоставляет разрешение дампа - PullRequest
3 голосов
/ 12 июля 2011

Для целей мониторинга использования батареи и т. Д. У меня есть код, который выполняет несколько вызовов dumpsys, считывает и анализирует выходные данные для извлечения данных, которые меня интересуют.

dumpsys battery , dumpsys statusbar и dumpsys power все выдают мне сообщение об ошибке для вывода типа «Отказ в разрешении: невозможно сбросить обслуживание батареи из pid ...» Кроме того, когда приложениезапущен, есть элемент в журнале с тегом "PackageManager", который заявляет, что не дает разрешения android.permissionDUMP для пакета .... (protectionLevel = 3 ...) "

Однако dumpsys cpuinfo и dumpsys netstat работают и дают мне правильный вывод, который кажется несовместимым.

Я могу сгенерировать dumpsys battery и т.п. из оболочки adb,но когда я пытаюсь вызвать его программно, он не работает.

Я попытался запустить его на телефоне HTC Nexus One, а также на эмуляторе и получить одинаковые результаты для каждого. TСтранно то, что этот код работал на моем 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 , чтобы датьмне правильный вывод программно и как мне получить разрешение dump , которое будет предоставлено?

* Nexus One не имеет рута, и я хотел бы, чтобы это работало без необходимости рутировать его дляЦели моего проекта

Спасибо за помощь

Ответы [ 3 ]

6 голосов
/ 12 июля 2011

Обычные приложения не могут получить разрешение DUMP.Зарезервировано для системных приложений.

1 голос
/ 17 сентября 2015

android.permission.Dump защищен уровнями защиты системы, подписи и разрешений на разработку. Строка 1993 года источник показывает вам это. Если ваш APK подписан с сертификатом платформы, находится в каталоге priv-app или может быть отлажен (см. Ниже), вы можете использовать службу pm для предоставления разрешения, но в противном случае код специально запрещает то, что вы запрашиваете (строка 2624 источник ).

Отладочные APK можно создать, установив атрибут debuggable для buildType через build.gradle. Пример Android DSL:

android {
    ...
    buildTypes {
        debug {
            debuggable true
            ...
        }
        quality_assurance {
            debuggable true
        }
    ...
}
0 голосов
/ 19 апреля 2012

Если ваш телефон был рутирован, «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";
...