ANDROID: Как получить root-доступ в приложении для Android?

Я разрабатываю свое первое приложение для Android , и мне любопытно, есть ли «стандартные» способы выполнения привилегированных команд shell . Я только смог найти один способ сделать это, выполнив su , а затем добавив мои команды в stdin процесса su .

 DataOutputStream pOut = new DataOutputStream(p.getOutputStream()); DataInputStream pIn = new DataInputStream(p.getInputStream()); String rv = ""; // su must exit before its output can be read pOut.writeBytes(cmd + "\nexit\n"); pOut.flush(); p.waitFor(); while (pIn.available() > 0) rv += pIn.readLine() + "\n"; 

Я читал об объявлении привилегированных ( superuser ) вызовов в JNI : возможно ли это? Если да, то как это сделать? Кроме этого, существуют ли другие способы вызова привилегированных инструкций из Java ?

Насколько мне известно, вы можете запускать только команды командной строки, используя привилегии root. Вы можете использовать этот общий class, который я сделал, который обертывает корневой доступ в вашем коде: http://muzikant-android.blogspot.com/2011/02/how-to-get-root-access-and-execute.html

Все, что вам нужно сделать, это расширить этот class и переопределить метод getCommandsToExecute чтобы вернуть команды, которые вы хотите выполнить с правами root.

 public abstract class ExecuteAsRootBase { public static boolean canRunRootCommands() { boolean retval = false; Process suProcess; try { suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); DataInputStream osRes = new DataInputStream(suProcess.getInputStream()); if (null != os && null != osRes) { // Getting the id of the current user to check if this is root os.writeBytes("id\n"); os.flush(); String currUid = osRes.readLine(); boolean exitSu = false; if (null == currUid) { retval = false; exitSu = false; Log.d("ROOT", "Can't get root access or denied by user"); } else if (true == currUid.contains("uid=0")) { retval = true; exitSu = true; Log.d("ROOT", "Root access granted"); } else { retval = false; exitSu = true; Log.d("ROOT", "Root access rejected: " + currUid); } if (exitSu) { os.writeBytes("exit\n"); os.flush(); } } } catch (Exception e) { // Can't get root ! // Probably broken pipe exception on trying to write to output stream (os) after su failed, meaning that the device is not rooted retval = false; Log.d("ROOT", "Root access rejected [" + e.getClass().getName() + "] : " + e.getMessage()); } return retval; } public final boolean execute() { boolean retval = false; try { ArrayList commands = getCommandsToExecute(); if (null != commands && commands.size() > 0) { Process suProcess = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(suProcess.getOutputStream()); // Execute commands that require root access for (String currCommand : commands) { os.writeBytes(currCommand + "\n"); os.flush(); } os.writeBytes("exit\n"); os.flush(); try { int suProcessRetval = suProcess.waitFor(); if (255 != suProcessRetval) { // Root access granted retval = true; } else { // Root access denied retval = false; } } catch (Exception ex) { Log.e("ROOT", "Error executing root action", ex); } } } catch (IOException ex) { Log.w("ROOT", "Can't get root access", ex); } catch (SecurityException ex) { Log.w("ROOT", "Can't get root access", ex); } catch (Exception ex) { Log.w("ROOT", "Error executing internal operation", ex); } return retval; } protected abstract ArrayList getCommandsToExecute(); } 

Возможное решение, которое я знаю, – это подписать ваше приложение как систему, которая, насколько мне известно, не совсем то же самое, что и root: Как подписать Android-приложение с сигнатурой системы? , Но я полагаю, это не то, что вы хотели.

Еще одна вещь, которую я сделал, – создать собственное приложение, которое делает то, что необходимо, и запускать его как внешний процесс. Но необходимо предоставить этому родному приложению привилегии, которые вам нужны, и бит suid, если раздел не является nosuid. Но это не то, что вам нужно, я полагаю.

Код C, вызываемый через JNI, должен подвергаться тем же ограничениям, что и жить в одном и том же процессе.

Если у вас есть su бинарный доступ, вы можете запускать команды из java с помощью чего-то вроде: Runtime.getRuntime (). Exec («su -c reboot»).

Я не помню другого пути.

  • метод, вызванный после исключения release () исключение, неспособное возобновить работу с камерой android
  • Как работает BreakIterator в Android?
  • Полноэкранный просмотр без растягивания видео
  • Запретить отображение клавиатуры при запуске
  • Как установить выбранный элемент Spinner по значению, а не положением?
  • API распознавания лиц
  • Android: CountDownTimer пропускает последний onTick ()!
  • Как получить часть после десятичной точки в Java?
  • В чем смысл «этого» в Java?
  • Как один интерфейс может использоваться для различных фоновых задач андроида?
  • Как изменить fragmentы с помощью Android-навигатора
  • Interesting Posts

    Глобальному символу требуется явное имя пакета

    Переполнение целых чисел без знака C / C ++

    Если массив символов является объектом в Java, почему печать не отображает его hash-код?

    Два связанных вопроса об фильтрах заголовков столбцов jqGrid и расширенном диалоговом окне фильтрации

    Application_Error не срабатывает, когда customerrors = “On”

    Ошибка: конфликт с зависимостью «com.google.code.findbugs: jsr305»

    Почему целочисленное деление в C # возвращает целое число, а не float?

    $ {1: + “$ @”} в / bin / sh

    Использование активности камеры в Android

    Как сделать xib совместимым с устройствами iphone 5 и iphone 4

    Возможно ли иметь несколько виртуальных мониторов для гостевой системы VMware в оконном режиме?

    Как я могу достоверно сказать, если stream boost вышел из своего метода запуска?

    У Haskell есть рекурсивная оптимизация?

    Как автоматически скрыть текст заполнителя при фокусировке с помощью css или jquery?

    Обновление Windows 8.1 с 32-разрядной версией до версии Windows 64 с 64-разрядной версией

    Давайте будем гением компьютера.