Android中PID与UID的区别和联系(2)
一、核心概念对比
特性 | PID (Process ID) | UID (User ID) |
---|---|---|
本质 | 进程唯一标识符 | 应用身份标识符 |
分配时机 | 进程启动时动态分配 | 应用安装时静态分配 |
生命周期 | 进程结束时回收 | 应用卸载时才回收 |
变化性 | 每次启动都可能不同 | 长期保持不变 |
作用范围 | 单进程内唯一 | 全设备范围唯一 |
核心作用 | 系统资源管理(CPU/内存) | 权限控制与安全隔离 |
查看方式 | adb shell ps / android.os.Process.myPid() | adb shell dumpsys package / getApplicationInfo().uid |
二、工作流程图解
三、核心作用深度解析
1. PID (进程ID)
资源管理:
// 系统通过PID监控进程资源 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo info : processes) {int pid = info.pid; // 关键标识long memory = am.getProcessMemoryInfo(new int[]{pid})[0].getTotalPss(); }
进程生命周期控制:
// 系统服务终止异常进程 if (processCpuTimeExceeded(pid)) {android.os.Process.killProcess(pid); // 通过PID终止 }
多进程应用管理:
<!-- AndroidManifest.xml --> <activity android:name=".MainActivity" android:process=":main"/> <!-- 主进程 --><service android:name=".BackgroundService"android:process=":background"/> <!-- 子进程 -->
2. UID (用户ID)
权限控制模型:
// 系统权限检查核心逻辑 public static boolean checkPermission(String permission, int pid, int uid) {// 1. 根据PID获取UIDint targetUid = mapPidToUid(pid); // 2. 查询该UID的权限列表Set<String> grantedPermissions = getGrantedPermissions(targetUid);// 3. 验证权限return grantedPermissions.contains(permission); }
沙盒隔离机制:
/data/data/com.example.app/ // 应用数据目录 ├── cache ├── databases └── shared_prefs
目录权限:
drwx------ u0_a123 u0_a123
只有相同UID的应用才能访问
共享UID机制:
<!-- 应用A --> <manifest package="com.example.appA"android:sharedUserId="com.example.shared"><!-- 应用B --> <manifest package="com.example.appB"android:sharedUserId="com.example.shared">
可共享数据文件
可互相访问组件
签名必须相同
四、PID与UID协作场景
1. Binder IPC 安全验证
2. 多用户系统实现
UID组成:
用户ID * 100000 + 应用ID
隔离效果:不同用户间的相同应用具有不同UID
五、常见问题
Q:Android中PID和UID的区别与作用
A:
PID和UID是Android系统中的两个核心标识符:1. PID(进程ID)
动态标识:系统为每个正在运行的进程分配的唯一数字标识
核心作用:
系统资源管理(CPU/内存分配)
进程生命周期控制(启动/终止)
多进程应用中的子进程标识
特性:进程重启时PID会变化
2. UID(用户ID)
静态标识:应用安装时分配的唯一身份标识
核心作用:
权限控制:系统基于UID验证应用权限
沙盒隔离:每个应用有独立的数据目录(基于UID)
跨应用共享:通过
sharedUserId
实现数据共享特性:应用卸载前UID保持不变
关键协作:
系统通过PID到UID的映射实现运行时权限检查
Binder IPC使用
(PID, UID)
元组验证调用方身份多用户系统中UID包含用户ID和应用ID(
userId * 100000 + appId
)总结:
PID是进程的"临时身份证",用于资源管理;UID是应用的"永久身份证",用于安全控制。二者协同构建了Android的安全沙盒机制。