1. 为什么需要installd
从下面的输出可以看出,system_server以system用户的身份运行。我们知道,PackageManager运行于system_server中。也就是说,PackageManager的身份也是system用户。
[email protected]:/$ busybox ps
busyboxps
PID USER TIME COMMAND
……
701 system 0:23 system_server
146 install 0:00 /system/bin/installd
但是,system用户并没有访问应用程序目录的权限。下面的输出显示当前用户是system,它不能访问/data/data/com.xiaomi.shop目录(此目录应为小米应用程序商店应用的目录)。
[email protected]:/data/data$ id
id
uid=1000(system) gid=1000(system)context=u:r:toolbox:s0
[email protected]:/data/data$ ls -l com.xiaomi.shop
ls -lcom.xiaomi.shop
opendir failed, Permission denied
这就是installd存在的原因。
2. Installd为什么可以访问应用程序的目录(比如/data/data/com.xiaomi.shop)?
installd的源程序在frameworks\native\cmds\installd目录下。
在install.c文件中有下面的代码。
static void drop_privileges() {
……
struct __user_cap_header_struct capheader;
struct __user_cap_data_struct capdata[2];
memset(&capheader, 0,sizeof(capheader));
memset(&capdata, 0, sizeof(capdata));
capheader.version =_LINUX_CAPABILITY_VERSION_3;
capheader.pid = 0;
capdata[CAP_TO_INDEX(CAP_DAC_OVERRIDE)].permitted |= CAP_TO_MASK(CAP_DAC_OVERRIDE);
……
if (capset(&capheader, &capdata[0])< 0) {
ALOGE("capset failed: %s\n",strerror(errno));
exit(1);
}
}
int main(const int argc__unused, const char *argv[] __unused) {
……
drop_privileges();
……
}
从上面的代码中可以看出,installd进程具有CAP_DAC_OVERRIDE特权(Privilege)。根据http://linux.die.net/man/7/capabilities, 对于具有CAP_DAC_OVERRIDE特权的进程,Linux会跳过文件的读、写、执行权限的检查。所以,installd可以访问任何目录下的文件。
CAP_DAC_OVERRIDE
Bypass file read, write, and executepermission checks. (DAC is an abbreviation of "discretionary accesscontrol".)