1. 程式人生 > >android APP 權限基礎

android APP 權限基礎

int script receive oca wake storage read completed ger

  1 權限(permission)的定義。
  系統本身定義了很多permission,例如

  • "android.permission.WAKE_LOCK",     
  • "android.permission.ACCESS_WIFI_STATE",
  • "android.permission.ACCESS_FINE_LOCATION" ,
  • "android.permission.ACCESS_FINE_LOCATION"

應用也可以定義一個自己的權限,例如
<permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"
android:label="@string/permlab_downloadManager"
android:description="@string/permdesc_downloadManager"
android:protectionLevel="signatureOrSystem" />

使用這些permission,第一步需要在AndroidManifest裏面定義。例如

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
當然了系統不會對任何應用開放任何權限的。否則就等於沒有權限,權限還是有級別的

2 android權限定義的級別。權限的級別是權限使用的一個維度
就拿上面定義的android.permission.ACCESS_DOWNLOAD_MANAGER權限來說。它的使用級別(定義: android:protectionLevel="signatureOrSystem")是系統簽名或者系統應用才可以使用。
系統定義一下級別: normal , dangerous , signature , signatureorsystem
norma

l 一般定義就可以使用到
dangerous 在安裝時會給用戶提醒,如果用戶關閉了這些權限,使用時一般的應用程序會提示用戶打開這些權限。這種級別的權限是有限的

  •     GROUP PERMISSIONS
  •     CALENDAR(日歷): READ_CLENDER, WRITE_CLENDAR
  •      CAMERA(相機): CAMEAR
  •     CONTACTS(聯系人):READ_CONTACTS , WRITE_CONTACTS, GET_ACCOUNTS
  •     LOCATION(定位): ACCESS_FINE_LOCATION, ACCESS_CORASE_LOCATION
  •     MICROPHONE(麥克風):RECORD_AUDIO
  •     PHONE(電話):READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP,         PROCESS_OUTGOING_CALLS
  • SMS(短信):SEND_SMS, RECEIVE_SMS, READ_SMS, RECEIVE_WAP_PUSH,RECEIVE_MMS
  •     SENSORS(傳感器):BODY_SENSORS
  •     STORAGE(存儲)


  signature 需要系統簽名才可以使用。例如一下的權限
  <permission android:name="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS"
   android:label="@string/permlab_downloadCompletedIntent"
   android:description="@string/permdesc_downloadCompletedIntent"
  android:protectionLevel="signature" />
  當然了回報相關權限的API會生效。
  signatureorsystem 表示需要系統簽名,或者屬於系統應用,(一般內置在system/app或者system/priv-app或者system/priv-app下面的應用)可   以使用系統的API。例如"android.permission.ACCESS_DOWNLOAD_MANAGER",

3 android 權限使用的用戶維度
  app安裝的時候,android會為每一個引用程序分配一個UID(用戶ID)和GID(用戶組ID)。
  此外安裝過程中還會生成一個GIDS。通過解析AndroidManifest,可以解析到應用運行時使用到的權限(<uses-permission>),如果安裝過程中app  被賦予了permission的權限,而且它有自己的GID,那麽這些權限的GID會被添加到這個應用的GID裏面。從這個角度來說,app的GIDS會包含它使用  的權限的集合(前提是已經被賦予)。進一步就是說app能使用到那些權限或者資源都被定義在他的GUIDS裏面。
  綜合上述,一個應用程序會有一個UID。而且會有個一個GIDS。這個GIDS包含了運行時可以使用到的系統資源。
   Android利用沙盒來隔離每個應用程序,是之使用到獨立的資源。每個應用程序都有獨立的沙盒,這樣就阻礙了應用程序之間的共享。但是如果需要做到兩個應用程序之間的資源共享,則需要兩個前提:1 是這兩個應用程序有相同的簽名。2 是兩個應用程序定義相同的android:sharedUserId 這樣兩個應用程序就會運行同一進程裏面,彼此共享權限。

4 其他,linux進程運行中的用戶

  • uid(guid).真實用戶(組),進程的真是所有者。
  • euid(geuid).有效用戶(組),進程運行的時候需要的各種權限,依賴於suid。
  • suid(gsuid).保存設置用戶(組),是有效用戶的副本。當超級用戶修改有效用用戶時,會先生成一個有效用戶的副本,即suid。這樣就會有主於有效用戶的恢復。
  • fuid(fuid). 文件用戶(組)

android APP 權限基礎