Android相關權限的概念

1.權限

  每個程序在安裝時都有建立一個系統ID,如app_15,用以保護數據不被其它應用獲取。Android根據不同的用戶和組,分配不同權限,比如訪問SD卡,訪問網絡等等。底層映射爲Linux權限。

2. 應用申請權限
  1)應用開發者通過AndroidManifest.xml中<uses-permission>指定對應權限,再映射到底層的用戶和組,默認情況下不設定特殊的權限。AndroidManifest加入權限後系統安裝程序時會在圖形界面中提示權限

  2) 如果是缺少某個權限(程序中使用的某種權限而在AndroidManifest.xml中並未聲名),程序運行時會在logcat中打印出錯誤信息requires <permission>

  3) 與某個進程使用相同的用戶ID

    應用程序可與系統中已存在的用戶使用同一權限,需要在AndroidManifest.xml中設置sharedUserId,如android:sharedUserId="android.uid.system ",作用是獲得系統權限,

  但是這樣的程序屬性只能在build整個系統時放進去(就是系統軟件)才起作用,共享ID的程序必須是同一簽名的

  4)關於應用程序共用權限的問題,在PackageManagerService.java中有相關的配置

    PackageManagerService(){

      mSettings.addSharedUserLPw("android.uid.system",

      Process.SYSTEM_UID, ApplicationInfo.FLAG_SYSTEM);

      mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID, ApplicationInfo.FLAG_SYSTEM,

      new int[] {UID_NET_RAW, UID_QCOM_DIAG, UID_NET_ADMIN});

      ……
    }

 

    比如:看到PhoneApp 的AndroidManifest.xml中

      android:sharedUserId="android.uid.phone" 使PhoneApp具有radio權限

      在訪問RIL時會進行此權限檢測

3. Android權限的實現

  1)第一層:由應用設置,修改AndroidManifest.xml,形如:

    <uses-permission android:name=”android.permission.INTERNET”/>

  2)第二層:框架層,權限對應組,frameworks/base/data/etc/platform.xml,形如:

    <permission name=”android.permission.INTERNET”>

      <group gid=inet” />

    </permission>

  3)第三層:系統層,系統的權限,

    system/core/include/private/android_filesystem_config.h,形如:

    #define AID_RADIO 1001 /* telephony subsystem, RIL */

    #define AID_INET 3003 //建立SOCKET的權限

    ……

 

    static const struct android_id_info android_ids[] = {

      { "radio", AID_RADIO, },

      { “inet”, AID_INET, },

      ……

4.系統權限

  1) 特殊權限的用戶

  #define AID_ROOT 0 /* traditional unix root user */

  #define AID_SYSTEM 1000 /* system server */

  #define AID_RADIO 1001 /* telephony subsystem, RIL */
  #define AID_BLUETOOTH 1002 /* bluetooth subsystem */
  #define AID_GRAPHICS 1003 /* graphics devices */
  #define AID_INPUT 1004 /* input devices */
  #define AID_AUDIO 1005 /* audio devices */
  #define AID_CAMERA 1006 /* camera devices */
  #define AID_LOG 1007 /* log devices */

  ……

  2) 查看可用系統的權限

    $ adb shell

    # pm list permissions

5. framework層對權限的判斷

  1)相關源碼實現

    frameworks/base/services/java/com/android/server/PackageManagerService.java

    frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

  2)在系統層,如何查看某個應用的權限

    a)在應用進程開啓時,ActivityManagerService.java會在logcat中輸出該應用的權限,形如:

      I/ActivityManager(1730): Start proc com.anbdroid.phone for restart com.android.phone:pid=2605 uid=1000 gids={3002,3001,3003}

      即它有3001,3002,3003三個權限:訪問藍牙和建立socket

    b)注意:此打印輸出在應用第一次啓動時。如果進程已存在,需要先把對應進程殺掉,以保證該進程重新啓動,才能顯示

    c)具體實現,見:

      framewors/base/services/java/com/android/server/am/ActivityManagerService.java

      的函數startProcessLocked(),其中取其組信息的具本語句是

      mContext.getPackageManager().getPackageGids(app.info.packageName);

 

From:http://blog.csdn.net/xieyan0811/article/details/6083019?reload

發佈了15 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章