Android: Как заставить su работать на AVD с root-правами так же, как на реальном устройстве с root-правами?

Я пишу приложение для корневых устройств, которым необходимо войти в режим суперпользователя. Я знаю, как это сделать так, чтобы это работало на реальных рутированных устройствах, но когда я проверял это на AVD, который также рутирован, команда «su» ведет себя не так, как на реальном устройстве. Он не позволит пользователю без полномочий root использовать «su» для получения root ... AVD разрешает пользователю root использовать su только для пользователя без полномочий root.

Кто-нибудь знает, как заставить следующий фрагмент кода работать в эмуляторе Android?

        // ... etc. ...

        Process process = null;

        try {
            // This works on a rooted device and fails within
            // the rooted AVD ...
            process = new ProcessBuilder("/system/xbin/su").start();
        }
        catch (Throwable t) {
            t.printStackTrace();
            return;
        }

        DataOutputStream  writer = new DataOutputStream(process.getOutputStream());
        InputStreamReader stream = new InputStreamReader(process.getInputStream());
        BufferedReader    reader = new BufferedReader(stream);

        try {
            writer.writeBytes("exec /system/bin/mount -o remount,rw /system\n");
            // Just in case the "exec" fails, above ...
            writer.writeBytes("exit 1\n");
            writer.close();
        }
        catch (Throwable t) {
            t.printStackTrace();
            return;
        }
        finally {
            try {
                reader.close();
            }
            catch (Throwable t) {
                // do nothing
            }
            try {
                stream.close();
            }
            catch (Throwable t) {
                // do nothing
            }
        }

        // ... etc. ...

Это не удается, потому что приложение не работает от имени пользователя root, но в AVD команда /system/xbin/su работает только в том случае, если она вызывается пользователем root. Следующий диалог оболочки adb иллюстрирует этот момент (я подключаюсь к работающему AVD)...

% adb shell
root@generic:/ # ### we are now running as root
root@generic:/ # /system/xbin/su u0_a70
root@generic:/ $ ### this worked because "su" is invoked as root
root@generic:/ $ ### we are now running as user u0_a70
root@generic:/ $ /system/xbin/su root
su: uid 10070 not allowed to su
1|root@generic:/ $ ### this didn't work as a non-root user

Кто-нибудь знает, как заставить команду «su» работать в корневом AVD так же, как «su» работает в корневом устройстве?

Заранее спасибо.

PS: это для Android 4.4.x


person HippoMan    schedule 05.10.2014    source источник


Ответы (1)


Не используйте стандартный эмулятор Android, используйте GenyMotion и следуйте этому руководству XDA ссылка

надеюсь, что это поможет вам :)

person dario.budimir    schedule 05.10.2014
comment
Большое Вам спасибо. Я не слышал о Genymotion. Я установил его, и он отлично работает! Текущая версия имеет встроенный Superuser, и мне даже не нужно специальное su из ссылки. - person HippoMan; 05.10.2014
comment
PS: из коробки этот Genymotion AVD работает точно так же, как обычное корневое устройство ... по крайней мере, без доступа суперпользователя. - person HippoMan; 05.10.2014
comment
PPS: Просто из любопытства я попробовал su по той ссылке, которую вы предоставили, в стандартном AVD, который поставляется с Android. Он скомпилирован под другую архитектуру и не работает. При попытке запустить его там выдает такую ​​ошибку: /system/bin/su: not executable: magic 7F45. Но мне это не нужно, теперь, когда я использую Genymotion. - person HippoMan; 05.10.2014
comment
рада, что смогла помочь :) - person dario.budimir; 05.10.2014