Предоставьте root-права приложению

У меня есть приложение, которое состоит из нативной части и более высокого уровня.

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

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

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

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

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

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

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

Процесс процесса = Runtime.getRuntime().exec("su");

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

Есть ли способ предоставить приложению права root?

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

С Уважением-

Сэм


person Sam    schedule 18.04.2012    source источник
comment
думаю, нет .. вы можете сделать это только на рутированных устройствах.   -  person Its not blank    schedule 18.04.2012
comment
Привет Да, мой телефон полностью рутирован.   -  person Sam    schedule 18.04.2012
comment
Привет, happy2Help, твой подход кажется классным. Я попробую это позже и сообщу, если это сработает. Благодарю вас!   -  person Sam    schedule 19.04.2012


Ответы (2)


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

Вот и мы...

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. Таким образом, используя этот процесс, вы можете выполнять любые корневые операции. Существует определенный синтаксис, которому необходимо следовать. Что показано в приведенном выше примере.

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

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

заменить его на

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

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

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

person mk..    schedule 18.04.2012
comment
Я дам его вкратце позже. Кажется, я понимаю вашу концепцию, но да, как вы упомянули, как интегрировать ее с моим приложением, чтобы получить root-права, для меня все еще неизвестно. В любом случае, сначала я попробую ваш подход. - person Sam; 19.04.2012
comment
Ok. Насколько я знаю. Приложения всегда по умолчанию работают в пользовательском режиме. Даже в обычном линуксе так. Когда вы выполняете команду su, создается новый процесс с UID 0. Это означает, что это процесс ядра с привилегиями root. С помощью этого процесса выполняются привилегированные задачи. То же самое мы пытаемся сделать здесь, в приложении для Android. Если вы хотите, чтобы все ваше приложение имело права root, я не думаю, что такая поддержка доступна. - person mk..; 20.04.2012
comment
Привет, happy2Help, в моем случае bind() — это системный вызов, который я надеялся использовать для взаимодействия с Bluetooth. Однако, когда мой код выполняется для bind(), ошибка указывает на отказ в разрешении. В документе эта ошибка объясняется как «У процесса нет соответствующих привилегий для привязки local_address к сокету, на который указывает socket_descriptor (например, если socket_descriptor — это сокет с семейством адресов AF_INET, а структура sockaddr_in (указывает на по локальному_адресу) указан порт, использование которого ограничено). - person Sam; 23.04.2012
comment
Вы упомянули, что вы можете сделать часть кода связывания как отдельный исполняемый файл и поместить его в system/bin. Мне не достаточно ясно, как это реализовать. Не могли бы вы объяснить более конкретно? Некоторых меня действительно смущает то, что один и тот же код работает на некоторых телефонах, а на некоторых нет. вот почему я думаю, что эта проблема должна быть исправлена. Если у вас есть какие-либо подсказки, пожалуйста, расскажите больше. Спасибо за ваше время и присоединяйтесь к этому обсуждению. - person Sam; 23.04.2012
comment
Привет. Предположим, если вы хотите запустить программу helloworld и выполнить ее на Android, как бы вы это сделали? 1) Напишите программу на свой компьютер. 2) Используя кросс-компилятор (вы можете использовать NDK) Создайте исполняемый файл 3) Вставьте исполняемый файл (двоичный файл ARM) на платформу (телефон Android) внутри /system/bin или 4) Войдите в оболочку (оболочка adb), 5 ) Запустите исполняемый файл (./myExe). Это должно напечатать helloworld. Точно так же вместо helloworld вы выполняете операцию привязки и вызываете приложение из процесса Application. Сначала давайте удостоверимся, что это работает. Тогда мы можем работать над более общим решением. Надеюсь, это ясно.... - person mk..; 23.04.2012
comment
Спасибо, happy2Help. Вы действительно сердечны. Я получил твое объяснение. Теперь это ясно. - person Sam; 23.04.2012
comment
Да, я думаю, что мой вопрос был исправлен!! Спасибо, happy2Help!! Действительно отличная идея! - person Sam; 24.04.2012
comment
ура .. Просто для информации, если вы хотите сделать его более универсальным, вы можете включить исполняемый файл в файл apk. Да, вы можете это сделать, но я не уверен, что это за процедура. Я думаю, что внутри файла Android.mk вам нужно изменить, указав BUILD_EXECUTABLE что-то вроде этого. В этом случае ваше приложение может без проблем работать на всех телефонах.. В любом случае, спасибо.. - person mk..; 24.04.2012

Вам не нужен root для привязки к порту> = 1024. Вам нужно только разрешение INTERNET в вашем ApplicationManifest.xml.

person Mārtiņš Možeiko    schedule 18.04.2012
comment
Этот фрагмент кода реализован для Bluetooth. Не для интернет-целей. - person Sam; 18.04.2012