2012-04-18 4 views
2

У меня есть приложение, которое состоит из нативной части и выше слоя .Предоставьте привилегию root для приложения

Поэтому ему необходимо предоставить привилегию root для запуска некоторых собственных функций .

В качестве статьи, которую я опубликовал ранее, я добавил фрагмент кода, взятый из Bluez Utils (hidd.c).

if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 
    close(sk); 
    return -1; 
    } 

Код был создан как .so NDK.

К сожалению, он продолжает возвращать -1, а errno равно 13, что означает Разрешение отклонено.

Некоторые опытные разработчики (спасибо вам) упомянули об ошибке , потому что это приложение не имеет достаточного разрешения.

Это "НЕ ДОЛЖЕН" быть что-то вроде

процесса Process = Runtime.getRuntime() Exec ("су").

Я думаю, это означает, что у вас есть системное разрешение, но ваше приложение не делает. (Дайте мне знать, если я ошибаюсь)

Есть ли способ предоставить приложение для получения привилегий root?

Любой ответ/подсказка/подсказка будут высоко оценены.

Regards-

Sam

+0

угадать нет .. вы можете сделать это только на корневых устройствах. –

+0

Привет, да, мой телефон полностью укоренен. – Sam

+0

Вы пробовали мое решение? –

ответ

1

Я думаю, что смогу вам помочь в этом.

Здесь мы Gooo ...

void gainRoot() 
{ 
    Process chperm; 
    try { 
     chperm=Runtime.getRuntime().exec("su"); 
      DataOutputStream os = 
       new DataOutputStream(chperm.getOutputStream()); 
      os.writeBytes("chmod 777 /dev/video0\n"); 
      os.flush(); 

      os.writeBytes("exit\n"); 
      os.flush(); 

      chperm.waitFor(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Это функция я обычно использую, чтобы изменить разрешение корневых файлов.

Когда вы выполните su, новый процесс будет создан с привилегиями root. Таким образом, используя этот процесс, вы можете выполнять любые корневые операции. Существует определенный синтаксис, который необходимо соблюдать. Это показано в приведенном выше примере.

так что вы можете сделать, чтобы связать часть кода как отдельный исполняемый файл и поместить его внутри системы/bin или в том месте, где обычно исполняются исполняемые файлы. Предположим, что имя исполняемого файла bind123 то вместо

  os.writeBytes("chmod 777 /dev/video0\n"); 
      os.flush(); 

заменить его

  os.writeBytes("bind123\n"); 
      os.flush(); 

в приведенном выше коде.

Это должно сработать. Вероятно, после этого мы можем попробовать интегрировать его с приложением без какой-либо зависимости от исполняемого файла.Надеюсь, я не смущаю тебя. Если вам нужна какая-то ясность, дайте мне знать ... ВСЕ лучшее ...

+0

Я расскажу об этом позже. Кажется, я понимаю вашу концепцию, но да, как вы уже упоминали, как ее интегрировать с моим приложением, чтобы получить разрешение root, для меня пока неизвестно. неважно, я сначала попробую ваш подход. – Sam

+0

Хорошо. Насколько я знаю. Приложения всегда по умолчанию запускаются в пользовательском режиме. Даже в обычном Linux это так. Когда вы выполняете su, новый процесс создается с помощью UID 0. Это означает, что это процесс ядра, который имеет корневые предрешения. Используя этот процесс, выполняются привилегированные задачи. То же самое мы пытаемся найти здесь в Android-приложении. Если вы хотите, чтобы все ваше приложение имело права root, я не думаю, что есть доступная поддержка. –

+0

Привет happy2Help, в моем случае bind() - системный вызов, который я надеялся, что смогу использовать его для взаимодействия с моим Bluetooth. Однако, когда мой код выполняет bind(), ошибка указывает на отказ в доступе. В документе объясняется эта ошибка как «У процесса нет соответствующих привилегий для привязки local_address к сокету, на который указывает socket_descriptor (например, если socket_descriptor - это сокет с семейством адресов AF_INET и структура sockaddr_in (указана to local_address) указали порт, который был ограничен для использования). – Sam

0

Вам не нужно корень, чтобы связать порт> = 1024. Вам нужно только разрешение INTERNET в вашем файле ApplicationManifest.xml.

+0

Эта часть кода реализована для Bluetooth. Не для интернет-целей. – Sam

Смежные вопросы