Корневой доступ в проводнике - PullRequest
2 голосов
/ 04 июля 2011

Я пишу обозреватель файлов, который будет способен изменять системные файлы с доступом с правами root, но я столкнулся с некоторыми проблемами.

Сейчас я предоставляю root-доступ моему приложению, новыполнение "su" не работает.Если я устанавливаю права доступа к папке в оболочке adb, приложение работает нормально, но я думаю, что просмотр root не зависит от chmods.

Может кто-нибудь сказать мне, есть ли правильный способ заставить мое приложение работать так, как будто онобыли с привилегиями root?

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Запуск процесса приложения для Android (его dalvik VM и нативных библиотек) в качестве пользователя root чрезвычайно труден для выполнения и нецелесообразен по ряду причин, включая не только безопасность, но и потерю памяти из-за необходимости загружать частные копии системных библиотек вместоиспользование общих доступных только для чтения копий, доступных при наследовании непривилегированного процесса от zygote, как при обычном запуске приложения.

То, что неофициальный взлом "su" на некоторых рутированных телефонах, позволяет запускать вспомогательный процесс, который выполняетсяот имени root, пока процесс вашего приложения остается непривилегированным.Он не меняет идентификатор пользователя вызывающего его приложения - на самом деле, на самом деле не существует никакого механизма для этого в unix-подобных операционных системах.

Когда у вас есть привилегированный вспомогательный процесс, вам нужно будет взаимодействовать с ним через некоторые средства межпроцессного взаимодействия, такие как его доменные сокеты stdin / stdout или unix, чтобы он выполнял файловые операции от вашего имени.Оболочка, присутствующая на телефоне, вероятно, могла бы даже использоваться в качестве вспомогательного приложения - большая часть того, что нужно сделать файловому менеджеру, может быть реализована с помощью команды 'cat'.Официально ничто из этого не является стабильным API, но в любом случае доступный для приложений взлом «su» в любом случае не находится на официальном android, поэтому весь проект с самого начала находится на «неподдерживаемой» территории.

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

Root-доступ создает новый процесс, поэтому ваше приложение не имеет корневых привилегий.
Единственная вещь, которую вы можете сделать с правами суперпользователя, это выполнить команды, поэтому вы должны знать команды android, многие из которых основаны на Linux, например cp, ls и более.

Используйте этот код для выполнения команд и получения вывода:

/**
 * Execute command and get entire output
 * @return Command output
 */
private String executeCommand(String cmd) throws IOException, InterruptedException {
    Process process = Runtime.getRuntime().exec("su");
    InputStream in = process.getInputStream();
    OutputStream out = process.getOutputStream();
    out.write(cmd.getBytes());
    out.flush();
    out.close();
    byte[] buffer = new byte[1024];
    int length = buffer.read(buffer);
    String result = new String(buffer, 0, length);
    process.waitFor();
    return result;
}

/**
 * Execute command and an array separates each line
 * @return Command output separated by lines in a String array
 */
private String[] executeCmdByLines(String cmd) throws IOException, InterruptedException {
    Process process = Runtime.getRuntime().exec("su");
    InputStream in = process.getInputStream();
    OutputStream out = process.getOutputStream();
    out.write(cmd.getBytes());
    out.flush();
    out.close();
    byte[] buffer = new byte[1024];
    int length = buffer.read(buffer);
    String output = new String(buffer, 0, length);
    String[] result = output.split("\n");
    process.waitFor();
    return result;
}

Использование для файлового менеджера:

Получить список файлов:

for (String value : executeCmdByLines("ls /data/data")) {
    //Do your stuff here
}

Прочитать текстовый файл:

String content = executeCommand("cat /data/someFile.txt");
//Do your stuff here with "content" string

Копировать файл (cp команда не работает на некоторых устройствах):

executeCommand("cp /source/of/file /destination/file");

Удалить файл (rm команда не работает на некоторых устройствах):

executeCommand("rm /path/to/file");
...