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