Android - 系统中的各种id

-

看系统源码的时候遇到了 uid gid userId appId,当时不是很了解这些id的作用,这里记录一下

参考


Linux UID GID

  • Android中的安全机制同样基于linux,Linux中使用ID来标识用户,每个登录的用户都会取得两个ID,UID和GID,Linux利用它们进行权限判断,每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理,Linux系统中的用户(UID)分为3类,即普通用户、root用户、系统用户
  • 普通用户(uid 500-60000)是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统。一般来说普通用户只能在其家目录、系统临时目录或其他经过授权的目录中操作,以及操作属于该用户的文件。通常普通用户的UID大于500,因为在添加普通用户时,系统默认用户ID从500开始编号
  • root用户(ID 0),也被称为超级用户,root账户拥有对系统的完全控制权:可以修改、删除任何文件,运行任何命令
  • 系统用户(UID 1-499)也叫伪用户,与系统和程序服务相关,因为并不是真实的使用者,所以叫伪用户,如bin、daemon、shutdown、halt等,任何Linux系统都默认有这些伪用户;mail、ftp、sshd等,与Linux系统的进程相关


Android


uid

  • 在 Android 上,一个用户 UID 标示一个应用程序。应用程序在安装时被分配用户 UID,应用程序在设备上的存续期间内,用户 UID 保持不变。uid由userid和appid共同组成
  • 在多用户的情况下,每个用户对应一个userid,同一用户启动的应用userid都是一致的
  • appid,每个应用都有一个appid,appid是由PackageManagerService在安装应用时分配的,同一应用的多个进程一般都拥有相同appid,只是pid不一样,appId的范围一定在10000到19999


gid

  • 对于普通的应用程序,GID即等于UID,值得一提的是,gid和权限组是相映射的,一个权限一般会属于一个gid,android中将权限分组,系统的每个权限都属于某个组,如果申请了一个组的一个权限,同时也会获取组中的其他权限(不过在8.0当中依然需要申请,只不过系统还是自动授权,不经过用户)


进程隔离

  • 隔离进程是4.1之后加入的安全机制,一般用于对系统有风险的代码,我们很少会用到
  • 每个appID会属于某个用户组。同属于一个用户组的appid有些权限是共享的,在manifest中加入android:isolatedProcess=”true”参数,可以使service运行与应用userid不同的新进程当中,这样这个service就不会获取到当前应用的权限,并且也不允许启动Activity
  • 系统判断一个进程是否为的条件为Process.FIRST_ISOLATED_UID && appId \<= Process.LAST_ISOLATED_UID,这些常量一般是编译时定好的



本篇完