一说到沙箱,相信大家都有一个大概的认识:每个App会被分配一个uid,互相之间数据不能随意访问。
虽然做上层开发有这么个大概的认识基本也就够了,不过深入了解一下可能会给你的开发带来新的思路。今天我们就深挖一下所谓的沙箱机制。
大家都知道Android底层是Linux内核,而这一切也都源于Linux的权限机制。
Linux 权限机制
用户 uid gid gids
进程 uid gid gids,继承于所属用户,子进程继承父进程
文件系统,uid gid 以及相对应rwx权限
----------插入Begin------------
再次看这段的时候突然有一点不明白:既然用户属于多个group,那有什么必要单独指定一个gid呢?
其实gid是用户当前工作组,那为什么非要有个当前工作组呢?肯定是因为用户在某些操作的时候需要明确当前工作组,比如用户创建一个文件,文件的ownerGroup其实就取决于用户的当前工作组。
----------插入End--------------
Android
先看adb shell,我们先记住下面这个结论,后面会给出解释:
adb shell 实际上是以“shell”这个uid启动shell进程
adb shell xx 则是fork一个shell进程的子进程xx
因此xx进程的uid、gid与shell的uid、gid一致:id=2000
"id" 命令可以查看user信息:
image.png
"cat /proc/xxx/status"查看进程信息,包括uid、gid、groups
image.png
以上是Android中user和进程的uid gid,那么在Android中文件系统的uid、gid又是怎样的呢?
file 事实上是在文件系统创建时对目录和文件设置了相对应的uid、gid以及权限,这里涉及到一个重要文件 fs_config.c
对目录的定义: