补充一下:
(以下内容以 Android6 以后为例,前期版本可能没有多用户功能*、或者 /sdcard/干脆就是闪存上直接分出来一块)
对应用来说,Android 有两个存储空间:
一个是用户公共存储空间(/data/media/$user_id/,映射为 /storage/emulated/$user_id/和该应用所在用户的 /sdcard),下称公共空间;
一个是用户私有存储空间(/data/user/user_id/$package_name/)。
(以上,$user_id 为用户的用户 id,机主为 0,Work Profile 一般为 10,部分系统自带的双开应用功能也会使用其他的用户 id 保存数据,$package_name 为应用的包名。)
(!!!切记!用户 id 与 Linux/android 系统的 uid 不同!!!)
应用使用私有空间存储数据不需要任何权限,应用使用公共存储空间前需要向系统申请权限(读取需要 android.permission.READ_EXTERNAL_STORAGE,写入需要 android.permission.WRITE_EXTERNAL_STORAGE )。
写在公共存储空间中的任何数据都可以被其它申请了公共空间读权限的应用访问到!!!
使用 su 提权获得 root 权限的应用可以获得对 /(根目录)的读写权限,同时执行 mount -o remount,rw /system 可以重新挂载 /system 以获取读写权限,因此对于获得了 root 权限的应用,数据隔离机制不起作用。(虽然实验发现,即使获得了 root 权限,这些应用还是在规规矩矩地申请公共存储权限。)
在系统启动的情况下,用户可管理的数据,只有公共存储空间这么一部分。
因此,情况如下*3:
假设:A 申请了公共空间读写权限,B 没有申请,C 申请了公共读写和 root 权限。A、B、C 安装在同一个用户下。
访问者 A 的公有数据 A 的私有数据 B 的私有数据
A rw- rwx ---
B --- --- rwx
C rw- rwx rwx
(注:r 读,w 写,x 执行,公有空间以 noexec 参数挂载,所以无法执行任何程序)
假设:A、B 均申请了公共空间读写权限。无应用申请 root 权限。A、C 安装在同一个用户下。
访问者 A 的公有数据 A 的私有数据 B 的公有数据 B 的私有数据
A rw- rwx rw- ---
B rw- --- rw- rwx
假设:A 申请了公共空间读写权限,B 没有申请,C 申请了公共读写和 root 权限,D 申请了公共读写权限。A、B 安装在同一个用户(假设为机主)下,C、D 安装在 Work Profile 内。
访问者 A 公 A 私 B 私 C 公 C 私 D 公 D 私
A rw- rwx --- --- --- --- ---
B --- --- rwx --- --- --- ---
C rw-*4 rwx rwx rw- rwx rw- rwx
D --- --- --- rw- --- rw- rwx
注解:
* 需要注意的是,设置里面没有多用户功能,不意味着没有!!!如果你的系统能使用 Work Profile*2,那么你的系统就有多用户功能
*2 Shelter、Island 均为 Work Profile 的具体应用,在 Island 内=在 Work Profile 内
*3 访问权限根据“应用的能力”,即通过回答一系列“什么应用想干什么能成功?”来得出结论
*4 C 对机主用户的公共空间的读写通过对 /data/media/0 的访问进行
@
honeycomb 并不,storage 的 basic mode 使用 magisksu 或者 supersu 都可运行,虽然高级功能需要 magisk 模块 Riru 支持。
** 我尽力了,但排版还是不太好看