1. UID 概述

在Android操作系统中,用户ID(UID)是用于标识用户、应用和进程的重要机制。UID用于隔离不同应用之间的资源和数据,管理权限,以及优化资源使用。每个安装在设备上的应用都会被分配一个唯一的UID。

2. UID 的分类

2.1 系统核心应用UID

系统核心应用是Android操作系统正常运行所必需的应用,通常具有系统级别的权限。这些应用的UID通常在较低的范围内,例如0FIRST_APPLICATION_UID - 1FIRST_APPLICATION_UID通常为10000)。

  • 示例
    • UID 0root用户,具有最高权限。
    • UID 1000system用户,用于系统服务。
    • UID 1001shell用户,用于命令行工具。
    • UID 1002radio用户,用于无线通信服务。
    • UID 1003log用户,用于日志服务。
    • :其他系统核心应用的UID。

2.2 普通应用UID

普通应用是由第三方开发者开发的应用,用户可以从应用商店下载和安装。这些应用的UID从FIRST_APPLICATION_UID(通常是10000)开始,每个应用被分配一个唯一的UID。

  • 示例
    • UID 10000:第一个普通应用。
    • UID 10001:第二个普通应用。
    • UID 10002:第三个普通应用。
    • :其他普通应用的UID。

3. 特殊UID

3.1 隔离UID(Isolated UID)

隔离UID用于特殊用途,如系统内部的隔离环境或特定应用的隔离运行。这些UID通常在AID_ISOLATED_STARTAID_ISOLATED_END之间。

  • 示例
    • AID_ISOLATED_START:隔离UID的起始值(通常是99000)。
    • AID_ISOLATED_END:隔离UID的结束值(通常是99999)。
    • UID 99000:第一个隔离UID。
    • UID 99001:第二个隔离UID。
    • ...:其他隔离UID。

4. 多用户环境中的UID

4.1 多用户支持

Android系统支持多用户功能,允许多个用户在同一个设备上使用不同的用户账户。每个用户账户有唯一的用户ID(uid),应用也有唯一的应用ID(appid)。UID的结构通常为UID = (1000 * user_id) + app_id

4.2 示例

假设用户user_id = 10,应用app_id = 1000

  • UID = 10000 + 1000 = 11000

5. 判断UID是否属于隔离用户

5.1 函数定义

以下函数用于判断一个给定的UID是否属于隔离用户:

1
2
3
4
bool is_multiuser_uid_isolated(uid_t uid) {
uid_t appid = multiuser_get_app_id(uid);
return appid >= AID_ISOLATED_START && appid <= AID_ISOLATED_END;
}

5.2 函数逻辑

  1. 提取应用ID
    • multiuser_get_app_id(uid):从给定的UID中提取应用ID(appid)。
  2. 判断是否属于隔离用户
    • 检查提取出的应用ID是否在AID_ISOLATED_STARTAID_ISOLATED_END之间。
    • 如果在范围内,返回true;否则返回false

5.3 示例

假设:

  • AID_ISOLATED_START = 99000
  • AID_ISOLATED_END = 99999

示例1:隔离用户

  • UID = 100000(假设user_id = 10app_id = 99000
    • appid = multiuser_get_app_id(100000) = 99000
    • 99000 >= 99000 && 99000 <= 99999,返回true

示例2:非隔离用户

  • UID = 100010(假设user_id = 10app_id = 10
    • appid = multiuser_get_app_id(100010) = 10
    • 10 >= 99000 && 10 <= 99999,返回false

6. 总结

  • UID:用于标识用户、应用和进程,确保资源和数据的隔离。
  • 系统核心应用UID:通常在09999之间,具有系统级别权限。
  • 普通应用UID:从10000开始,每个应用具有唯一UID。
  • 隔离UID:在9900099999之间,用于特殊用途。
  • 多用户环境:支持多用户,UID结构为UID = (1000 * user_id) + app_id
  • 判断隔离用户:通过检查应用ID是否在隔离UID范围内来判断。