Предоставете root привилегия на приложението

Имам приложение, което се състои от основната част и по-висок слой.

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

Като статията, която публикувах преди, добавих част от кода, взет от Bluez Utils(hidd.c).

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

Кодът е създаден да бъде .so от NDK.

За съжаление, продължава да връща -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();
    }
}

Това е функция, която обикновено използвам за промяна на разрешенията на root файлове.

Когато направите su, ще бъде създаден нов процес с root права. Така че с помощта на този процес можете да извършвате всякакви операции на root. Има някакъв специфичен синтаксис, който трябва да се следва. Което е показано в горния пример.

така че едно нещо, което можете да направите, е да изградите частта за свързване на кода като отделен изпълним файл и да го поставите в system/bin или на това място, където обикновено се съхраняват изпълними файлове. Да предположим, че името на изпълнимия файл е bind123, тогава вместо

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

заменете го с

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

в горния код.

Това трябва да работи. Вероятно след като това заработи, можем да опитаме да го интегрираме с приложението без никаква зависимост от изпълнимия файл. Надявам се, че не ви обърквам. Ако изобщо има нужда от някаква яснота, уведомете ме www.... ВСИЧКО най-добро...

person mk..    schedule 18.04.2012
comment
Ще го дам накратко по-късно. Изглежда разбирам концепцията ви, но да, както споменахте, как да го интегрирам с моето приложение, за да получа root разрешение, все още не ми е известно. независимо от това, първо ще опитам вашия подход. - person Sam; 19.04.2012
comment
Добре. Доколкото знам. Приложенията винаги работят по подразбиране в потребителски режим. Дори в нормален Linux е така. Когато направите su, се създава нов процес с UID 0. Което означава, че това е процес на ядрото, който има коренни права. С помощта на този процес се изпълняват привилегировани задачи. Същото нещо, което се опитваме да направим тук в приложението за Android. Ако искате цялото ви приложение да има root разрешения, не мисля, че има налична такава поддръжка. - person mk..; 20.04.2012
comment
Здравейте happy2Help, в моя случай bind() е системното повикване, което се надявах да мога да използвам за взаимодействие с моя bluetooth. Въпреки това, когато кодът ми се изпълни за bind(), грешката показва, че разрешението е отказано. В документа той обяснява тази грешка като Процесът няма подходящите привилегии за обвързване на local_address със сокета, към който сочи socket_descriptor (например, ако socket_descriptor е сокет с фамилия адреси AF_INET и структурата sockaddr_in (сочеща към от local_address) посочи порт, който сме ограничили за използване). - person Sam; 23.04.2012
comment
Споменахте какво можете да направите, е да изградите свързващата част на кода като отделен изпълним файл и да го поставите в system/bin. Не съм достатъчно наясно как да го приложа. Бихте ли обяснили по-конкретно? Някои наистина ме объркват е, че един и същ код работи на някои телефони, но на някои не. затова смятам, че този проблем трябва да бъде решен. Ако имате представа, моля, кажете повече. Благодаря за отделеното време и се присъединете към тази дискусия. - person Sam; 23.04.2012
comment
здрасти Да предположим, че ако искате да изпълните програмата helloworld и да я изпълните на android, как бихте го направили? 1) Напишете програмата на вашия компютър. 2) Използване на крос компилатор (Можете да използвате NDK) Създайте изпълнимия файл 3) Поставете изпълнимия файл (ARM Binary) на платформата (телефон с Android) в /system/bin или 4) Влезте в обвивката (adb shell), 5 ) Стартирайте изпълнимия файл (./myExe) Това трябва да отпечата helloworld. По същия начин, вместо helloworld, правите операция за свързване и извиквате приложението от процеса на приложение. Първо нека се уверим, че това работи. След това можем да работим за по-общо решение.. Надяваме се, че е ясно.... - 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. Имате нужда само от ИНТЕРНЕТ разрешение във вашия ApplicationManifest.xml файл.

person Mārtiņš Možeiko    schedule 18.04.2012
comment
Тази част от кода е внедрена за Bluetooth. Не е за интернет цел. - person Sam; 18.04.2012