天天看點

Android中的PID和UID

轉載請注明出處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