一、核心概念對比
特性 | 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的安全沙盒機制。