轉載請注明出處juejin.im/post/5a93f9…
總結一下Android中PID和UID的概念
1. PID
Android中的PID全稱為Process Identifier,來源于Linux中,在程序啟動的時候系統會為程序配置設定一個獨一無二的辨別,程序銷毀後PID會被系統回收,但是在Android中一般不會重新配置設定,後面的程序PID會比前面的程序的大。
2.UID
Android中的UID一般認為是User Identifier,同樣來源于Linux中。但是在Android中不太一樣,Android最初的設計是單使用者,是以UID并不是為了差別使用者的,而是為了不同程式間進行資料共享,方式見Android 跨應用調用元件與Uid機制
UID是如何擷取的呢? 在 UserHandle.java檔案中
* 擷取Uid
* @param userId 使用者id
* @param appId 安裝的時候就确定了
* @return
*/
public static int getUid(@UserIdInt int userId, @AppIdInt int appId) {
//如果是多用使用者的情況下
if (MU_ENABLED) {
return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);
} else {
//單使用者就直接傳回appId
return appId;
}
}
複制代碼
Android4.2之前都是單使用者,Android4.2開始支援多使用者。于是就有上面這段代碼了。
UserId怎麼擷取?在 UserHandle.java檔案中
/**
* Returns the user id of the current process
* @return user id of the current process
* @hide
*/
@SystemApi
public static @UserIdInt int myUserId() {
return getUserId(Process.myUid());
}
/**
* Returns the user id for a given uid.
* @hide
*/
public static @UserIdInt int getUserId(int uid) {
if (MU_ENABLED) {
return uid / PER_USER_RANGE;
} else {
return UserHandle.USER_SYSTEM;
}
}
複制代碼
這段代碼是擷取UID的逆推,其實我們在申請多使用者的時候,該使用者的userId就已經确定了,一般我們手機自帶的使用者UserId為0,第二個使用者的userId為10這樣。
請參考
Android下uid與多使用者釋疑(一)
Android下uid與多使用者釋疑(二)
APPID怎麼來的?
在APP安裝的時候系統會掃描已經安裝的應用,檢視是否sharedUserId有相同的App。
- 有的話配置設定已經安裝的APP的id。
- 沒有的話根據目前已經安裝的APP以及未使用的id擷取一個值作為目前APP的APPID(一般從小到大配置設定)。
具體可以參考:
Android中的UID和AppId
Android中的PID和UID就說到這裡吧,文章中參考來自網絡,如有侵權請告知。
文中如有錯誤請一起探讨。
轉載于:https://juejin.im/post/5a93f95c6fb9a06361089dbb