Android中UID、GID和PID的講解

1、概述

在實際的開發中常常會碰到各類ID,這是因爲在計算機的發展過程當中,須要對程序執行的每一步作標記,經過這些標記的關聯便於系統的統一管理。像PID、UID、GID、和EUID等,其實對於這些ID不須要刻意記憶,只須要了解其名稱含義,就明白其所對應的意義。mysql

2、Linux中的概念解析

2.1 UID

在Linux中用戶的概念分爲:普通用戶、根用戶和系統用戶。 普通用戶:表示平時使用的用戶概念,在使用Linux時,須要經過用戶名和密碼登陸,獲取該用戶相應的權限,其權限具體表如今對系統中文件的增刪改查和命令執行的限制,不一樣用戶具備不一樣的權限設置,其UID一般大於500。 根用戶:該用戶就是ROOT用戶,其UID爲0,能夠對系統中任何文件進行增刪改查處理,執行任何命令,所以ROOT用戶極其危險,如操做不當,會致使系統完全崩掉。 系統用戶:該用戶是系統虛擬出的用戶概念,不對使用者開發的用戶,其UID範圍爲1-499,例如運行MySQL數據庫服務時,須要使用系統用戶mysql來運行mysqld進程。android

2.2 GID

GID顧名思義就是對於UID的封裝處理,就是包含多個UID的意思,實際上在Linux下每一個UID都對應着一個GID。設計GID是爲了便於對系統的統一管理,例如增長某個文件的用戶權限時,只對admin組的用戶開放,那麼在分配權限時,只需對該組分配,其組下的全部用戶均獲取權限。一樣在刪除時,也便於統一操做。sql

除了UID和GID外,其還包括其擴展的有效的用戶、組(euid、egid)、文件系統的用戶、組(fsuid、fsgid)和保存的設置用戶、組(suid、sgid)等。數據庫

2.3 PID

系統在程序運行時,會爲每一個可執行程序分配一個惟一的進程ID(PID),PID的直接做用是爲了代表該程序所擁有的文件操做權限,不一樣的可執行程序運行時互不影響,相互之間的數據訪問具備權限限制。bash

三 、Android中的概念解析

因爲Android是基於Linux的基礎上開發的,所以的UID(User Identifier)、GID(Group Identifier)和PID(Process Identifier)的概念也是來自於Linux,可是Android是基於客戶端的系統,在Linux的基礎上又進行了刪改。網絡

3.1 UID、GID

在Android中一個UID的對應的就是一個可執行的程序,對於普通的程序其UID就是對應與GID,程序在Android系統留存期間,其UID不變。 在Android中採用沙箱的概念來管理程序,不一樣的程序具備惟一的UID和PID,經過該UID來標識其所具備的「資源」,包括文件目錄、數據庫的訪問、網絡、傳感器和日誌等。和Linux同樣,相互之間互不影響。 app

在這裏插入圖片描述
不一樣的應用程序通常是運行在不一樣的進程中,相互之間的「資源」不能夠訪問,但能夠經過進程共享的方式,實現不一樣程序之間的數據訪問主要是針對Activity、Service和ContentProvider,其實現方式按照權限暴露級別分爲:徹底暴露、權限提示暴露和私有暴露三種方式。

  • 徹底暴露:是指經過android:exported=」true」實現,在AndroidMaindfest.xml中申明Activity、Service或ContentProvider時,將該屬性設置爲true後,就代表該類容許外界的數據訪問。若是在申明時添加了intentFilter屬性,則默認exported就爲true,此時也可強制的設置爲fasle。如未作其餘設置(exported/intentFilter),則默認exported爲fasle,即不對外暴露。
<activity android:name=".TestActivty" android:exported="true"/>
複製代碼
  • 權限提示暴露:在AndroidMaindfest.xml中申明Activity、Service或ContentProvider時,添加了permission,代表若是其餘應用須要訪問該類時,須要在該應用添加該類聲明時的權限,以下所示。 聲明私有的權限。
<activity android:name=".TestActivty" android:permission="com.xiaohan.permission"/>
複製代碼

添加訪問的權限說明。ide

<uses-permission android:name="com.xiaohan.permission"/>
複製代碼
  • 私有暴露:不一樣於以上兩種類的暴露方式,若是想對於不一樣應用之間能夠互相訪問任何數據,則須要經過sharedUserId+同一套簽名的方式實現,只有這樣才能運行在同一個進程中(同一個沙箱中)保證數據的相互訪問。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.xiaohan.test"      //應用包名
    android:sharedUserId="com.xiaohan.sharedUID"  //暴露的惟一標識
    android:sharedUserLabel="@string/app_name"  //必須是引入資源文件中的字符串
    android:versionCode="1"
    android:versionName="1.1.0"
    android:installLocation="internalOnly">//安裝位置,默認在內部目錄,還包括auto:自動、preferExternal:外置SD卡中
複製代碼

在這裏插入圖片描述

3.2 PID

在3.1中已經不斷的說起PID的概念,通常爲了防止不一樣應用之間的相互干擾而分配惟一的PID,可是對同一個安卓應用能夠具備多個PID,添加也很方便,只須要在聲明類時指定進程名稱便可,以下所示:ui

<activity android:name=".TestActivty" android:process="com.xiaohan.test"/>
複製代碼

添加很方便,可是不能隨意使用,由於在同一個應用(PID)中,設計到程序之間最多的是線程間的通訊,一旦獨立出PID則涉及到進程間通訊,相似於不一樣的兩個應用,固然也能夠經過上面的私有暴露和權限暴露的方式實現數據的通訊,可是系統的開銷較大。spa

4、總結 本文主要講述UID、GID和PID概念 ,在Linux和Android中的應用說明,這裏針對Android系統須要特別注意如下幾點:

  • 不一樣的應用具備惟一的UID,同一個UID可具備不一樣的PID;
  • 針對不一樣的PID之間數據的暴露可採用私有暴露和權限暴露,針對不一樣的UID之間可經過徹底暴露的方式;
  • 若是一個應用是系統應用,則不須要其餘應用暴露,即可直接訪問該應用的數據。
相關文章
相關標籤/搜索