Android 多用戶詳情

Android 多用戶

一、Linux 用戶和組

Linux作為一個多用戶的操作系統,每個用戶在機器上都有一個私有空間,特別是它會擁有配額的磁盤空間,以存儲文件、接收私有的mail消息等。Linux必須保證這部分私有空間隻對它的擁有者是可見的(類似於銀行賬戶,當然隻能對於儲戶自己可見啦),而且應該確保沒有用戶可以使用系統應用程序來侵犯其他用戶的私有空間(當然也就是不能讓別人隨便來動我銀行賬戶的資金啦)。

在Linux操作系統中,所有的用戶都是通過唯一的用戶ID(UID->User ID)來識別的。但是如果選擇與其他用戶共享資料,共享的用戶就應該是一個或者多個組的成員,這個用組ID(GID->group ID)來識別(幾個人出錢成立瞭一個小公司,這個公司名就是GID,我們的錢就是共享的資源,大傢都可以使用和可見)。每個文件都可與一個確切的組相關聯。如:作為文件擁有者的用戶對該文件的讀寫權限,而組中其他用戶則隻擁有讀權限,系統內非組中的用戶則沒有任何權限(不可讀不可寫不可執行)。

1、超級用戶:

在Linux系統中,有一個特殊的用戶->超級用戶(root),root用戶幾乎可以在Linux系統中做任何事情,因為OS沒有對它采取一般的防護機制,root用戶可以訪問系統上的每個文件,可以管理每一個正在運行的用戶程序。

2、普通用戶和超級用戶的切換

在Linux命令行輸入命令:su -,然後輸入root用戶的密碼即可切換至root用戶,但是建議一般情況下,不要隨意使用root用戶,因為root用戶操作失誤會導致系統文件丟失甚至系統崩潰。

在傳統計算機上,UID是跟隨著「人」(例如計算機的使用者或用戶)。Android裡的UID是跟隨著「軟件」(例如Android應用程序)。
由於每個應用程序都有個UID,隻有帶著此UID,才能存取該UID所涵蓋的有關資料。所以如果AP-1與AP-2的UID不同,則在預設(Default)情況下,雙方都無法讀取對方的數據。這種分而治之的方式,可以減輕黑客軟件的惡意傷害數據,提升手機的安全性。
當手機使用者(即User)下載你(即開發者)的應用程序,在安裝(Install)時,Android就會給予一個UID。這個UID可連結到該應用程序的 AndroidManifest.xml檔案的內容。所以User在安裝你的應用程序時,在屏幕上的窗口裡可以檢視這個AndroidManifest.xml檔案的內容。在檢視時,用戶會看到你對應用程序的目的、權限等說明。當你接受這支程序的意圖、權限說明之後,Android就安裝它,並給它一個UID。萬一在你的應用程序執行期間有越軌(企圖做出非權限范圍)的行為時,用戶將會得到Android的警告訊息。
有一些特殊情形下,兩支應用程序是可以持有一樣的UID。例如,同一位開發者撰寫的應用程序,常常需要推出新版本,這兩種版本的程序可以持有一樣的UID, 才有權限去將舊版程序所產生的數據拷貝轉移到新版軟件裡。

Pid是進程IDUid是用戶ID,隻是Android和計算機不一樣,計算機每個用戶都具有一個Uid,哪個用戶start的程序,這個程序的Uid就是那個用戶,而Android中每個程序都有一個Uid,默認情況下,Android會給每個程序分配一個普通級別互不相同的 Uid,如果應用之間要互相調用,隻能是Uid相同才行,這就使得共享數據具有瞭一定安全性,每個軟件之間是不能隨意獲得數據的。而同一個application 隻有一個Uid,所以application下的Activity之間不存在訪問權限的問題。

關於APPID UID userid,在單用戶的情況下,appid 就是Uid,在多用戶的時候通過appid 和userid 重新計算新的uid

public static int getUid(@UserIdInt int userId, @AppIdInt int appId) {
    if (MU_ENABLED) {


        return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);
    } else {
        return appId;
    }
}

UserHandle包含三種概念:userid,uid,appid

  • userid:就是有多少個實際的用戶羅,例如老爸很窮,要跟兒子共用一臺手機,那可以跟手機將兩個用戶,user 0和user 1。兩個用戶的應用和數據是獨立的。
  • uid:跟應用進程相關。除瞭sharduid的應用,每個用戶的每個應用的uid不一樣的。用戶0的應用的uid從一萬開始算。
  • appid:跟app相關,包名相同的appid都一樣。即使是不同用戶。例如你和兒子都在這臺手機裝瞭微信,但這兩個微信的appid是一樣的。
appid 的范圍是
public static final int FIRST_APPLICATION_UID = 10000;
 
/**
 * Last of application-specific UIDs starting at
 * {@link #FIRST_APPLICATION_UID}.
 */
public static final int LAST_APPLICATION_UID = 19999;

對於用戶組的進程來說,似於u0_a86這樣的UID。這個UID的前一部分表示userId,後一部分表示appId(減去Process.FIRST_APPLICATION_UID的結果)。

   //uid 不能超出限制。Android 對 UID 進行瞭分類,應用 APK 所在進程的 UID 從 10000 開始,
    //而系統 APK 所在進程小於 10000

到此這篇關於Android 多用戶詳情的文章就介紹到這瞭,更多相關Android 多用戶內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: