Ответ 1
Что касается Linux, пользователь system
является обычным пользователем (UID 1000). Услуги Android, однако, предоставляют специальные разрешения, и вы можете получить доступ ко всему, что угодно. Большинство служб имеют такой код:
private static final void enforceSystemOrRoot(String message) {
final int uid = Binder.getCallingUid();
if (uid != Process.SYSTEM_UID && uid != 0) {
throw new SecurityException(message);
}
}
То, что делает, запрещает доступ к любому, кто не является root или system
. Пользователь shell
(UID 2000) (что вы получаете при выполнении adb shell
) - это другой пользователь с большим количеством полномочий (член многих групп). Ср
system
:
$ su 1000
$ id
uid=1000(system) gid=1000(system)
groups=1003(graphics),1004(input),1007(log),1009(mount),
1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),
3002(net_bt),3003(inet),3006(net_bw_stats)
shell
:
$ adb shell
[email protected]:/ $ id
uid=2000(shell) gid=2000(shell)
groups=1003(graphics),1004(input),1007(log),1009(mount),
1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),
3002(net_bt),3003(inet),3006(net_bw_stats)
Android использует отдельного пользователя для каждого приложения, а системные службы также имеют своих выделенных пользователей (media
, radio
, wifi
и т.д.). Очень немногие вещи выполняются как root (в основном, родные демоны).