Android所設(shè)計(jì)的權(quán)限

前言

Android 是一個(gè)權(quán)限分隔的操作系統(tǒng)什往,其中每個(gè)應(yīng)用都有其獨(dú)特的系統(tǒng)標(biāo)識(shí)(Linux 用戶 ID 和組 ID)怜跑。系統(tǒng)各部分也分隔為不同的標(biāo)識(shí)沼沈。Linux 據(jù)此將不同的應(yīng)用以及應(yīng)用與系統(tǒng)分隔開(kāi)來(lái)单绑。
其他更詳細(xì)的安全功能通過(guò)“權(quán)限”機(jī)制提供,此機(jī)制會(huì)限制特定進(jìn)程可以執(zhí)行的具體操作蓉驹,并且根據(jù) URI 權(quán)限授權(quán)臨時(shí)訪問(wèn)特定的數(shù)據(jù)段城榛。
本文檔介紹應(yīng)用開(kāi)發(fā)者可以如何使用 Android 提供的安全功能。一般性的 Android 安全性概覽在“Android 開(kāi)源項(xiàng)目”中提供态兴。

目錄

  • 前言
  • 安全架構(gòu)
  • 應(yīng)用簽署
  • 用戶ID和文件訪問(wèn)
  • 使用權(quán)限
  • 權(quán)限級(jí)別
  • 自動(dòng)權(quán)限調(diào)整

安全架構(gòu)


Android 安全架構(gòu)的中心設(shè)計(jì)點(diǎn)是:在默認(rèn)情況下任何應(yīng)用都沒(méi)有權(quán)限執(zhí)行對(duì)其他應(yīng)用狠持、操作系統(tǒng)或用戶有不利影響的任何操作。這包括讀取或?qū)懭胗脩舻乃接袛?shù)據(jù)(例如聯(lián)系人或電子郵件)瞻润、讀取或?qū)懭肫渌麘?yīng)用程序的文件喘垂、執(zhí)行網(wǎng)絡(luò)訪問(wèn)、使設(shè)備保持喚醒狀態(tài)等绍撞。

由于每個(gè) Android 應(yīng)用都是在進(jìn)程沙盒中運(yùn)行正勒,因此應(yīng)用必須顯式共享資源和數(shù)據(jù)。它們的方法是聲明需要哪些權(quán)限來(lái)獲取基本沙盒未提供的額外功能楚午。應(yīng)用以靜態(tài)方式聲明它們需要的權(quán)限昭齐,然后 Android 系統(tǒng)提示用戶同意尿招。

應(yīng)用沙盒不依賴用于開(kāi)發(fā)應(yīng)用的技術(shù)矾柜。特別是阱驾,Dalvik VM 不是安全邊界,任何應(yīng)用都可運(yùn)行原生代碼(請(qǐng)參閱 Android NDK)怪蔑。各類應(yīng)用 — Java里覆、原生和混合 — 以同樣的方式放在沙盒中,彼此采用相同程度的安全防護(hù)缆瓣。

應(yīng)用簽署權(quán)限


所有 APK(.apk 文件)都必須使用證書(shū)簽署喧枷,其私鑰由開(kāi)發(fā)者持有。此證書(shū)用于識(shí)別應(yīng)用的作者弓坞。證書(shū)不需要由證書(shū)頒發(fā)機(jī)構(gòu)簽署隧甚;Android 應(yīng)用在理想情況下可以而且通常也是使用自簽名證書(shū)。證書(shū)在 Android 中的作用是識(shí)別應(yīng)用的作者渡冻。這允許系統(tǒng)授予或拒絕應(yīng)用對(duì)簽名級(jí)權(quán)限的訪問(wèn)戚扳,以及授予或拒絕應(yīng)用獲得與另一應(yīng)用相同的 Linux 身份的請(qǐng)求

用戶 ID 和文件訪問(wèn)權(quán)限


在安裝時(shí)族吻,Android 為每個(gè)軟件包提供唯一的 Linux 用戶 ID帽借。此 ID 在軟件包在該設(shè)備上的使用壽命期間保持不變。在不同設(shè)備上超歌,相同軟件包可能有不同的 UID砍艾;重要的是每個(gè)軟件包在指定設(shè)備上的 UID 是唯一的。

由于在進(jìn)程級(jí)實(shí)施安全性巍举,因此任何兩個(gè)軟件包的代碼通常都不能在同一進(jìn)程中運(yùn)行脆荷,因?yàn)樗鼈冃枰鳛椴煌?Linux 用戶運(yùn)行。您可以在每個(gè)軟件包的 AndroidManifest.xmlmanifest 標(biāo)記中使用sharedUserId 屬性懊悯,為它們分配相同的用戶 ID简烘。這樣做以后,出于安全目的定枷,兩個(gè)軟件包將被視為同一個(gè)應(yīng)用孤澎,具有相同的用戶 ID 和文件權(quán)限。請(qǐng)注意欠窒,為保持安全性覆旭,只有兩個(gè)簽署了相同簽名(并且請(qǐng)求相同的 sharedUserId)的應(yīng)用才被分配同一用戶 ID。

應(yīng)用存儲(chǔ)的任何數(shù)據(jù)都會(huì)被分配該應(yīng)用的用戶 ID岖妄,并且其他軟件包通常無(wú)法訪問(wèn)這些數(shù)據(jù)型将。使用 getSharedPreferences(String, int)openFileOutput(String, int)openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) 創(chuàng)建新文件時(shí)荐虐,可以使用 MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 標(biāo)記允許任何其他軟件包讀取/寫(xiě)入文件七兜。設(shè)置這些標(biāo)記時(shí),文件仍歸您的應(yīng)用所有福扬,但其全局讀取和/或?qū)懭霗?quán)限已適當(dāng)設(shè)置腕铸,使任何其他應(yīng)用都可看見(jiàn)它惜犀。

使用權(quán)限


基本 Android 應(yīng)用默認(rèn)情況下未關(guān)聯(lián)權(quán)限,這意味著它無(wú)法執(zhí)行對(duì)用戶體驗(yàn)或設(shè)備上任何數(shù)據(jù)產(chǎn)生不利影響的任何操作狠裹。要利用受保護(hù)的設(shè)備功能虽界,必須在應(yīng)用清單中包含一個(gè)或多個(gè) <uses-permission>標(biāo)記。

例如涛菠,需要監(jiān)控傳入的短信的應(yīng)用要指定:

<manifest  xmlns:android="http://schemas.android.com/apk/res/android"  package="com.android.app.myapp"  >  
    <uses-permission  android:name="android.permission.RECEIVE_SMS"  />
     ... 
</manifest>

權(quán)限級(jí)別

如需了解有關(guān)不同保護(hù)級(jí)別權(quán)限的詳細(xì)信息莉御,請(qǐng)參閱正常權(quán)限和危險(xiǎn)權(quán)限

如果您的應(yīng)用在其清單中列出正常權(quán)限(即俗冻,不會(huì)對(duì)用戶隱私或設(shè)備操作造成很大風(fēng)險(xiǎn)的權(quán)限)礁叔,系統(tǒng)會(huì)自動(dòng)授予這些權(quán)限。如果您的應(yīng)用在其清單中列出危險(xiǎn)權(quán)限(即迄薄,可能影響用戶隱私或設(shè)備正常操作的權(quán)限)晴圾,系統(tǒng)會(huì)要求用戶明確授予這些權(quán)限。Android 發(fā)出請(qǐng)求的方式取決于系統(tǒng)版本噪奄,而系統(tǒng)版本是應(yīng)用的目標(biāo):

  • 如果設(shè)備運(yùn)行的是 Android 6.0(API 級(jí)別 23)或更高版本死姚,并且應(yīng)用的 targetSdkVersion 是 23 或更高版本,則應(yīng)用在運(yùn)行時(shí)向用戶請(qǐng)求權(quán)限勤篮。用戶可隨時(shí)調(diào)用權(quán)限都毒,因此應(yīng)用在每次運(yùn)行時(shí)均需檢查自身是否具備所需的權(quán)限。如需了解有關(guān)在應(yīng)用中請(qǐng)求權(quán)限的詳細(xì)信息碰缔,請(qǐng)參閱使用系統(tǒng)權(quán)限培訓(xùn)指南账劲。
  • 如果設(shè)備運(yùn)行的是 Android 5.1(API 級(jí)別 22)或更低版本,并且應(yīng)用的 targetSdkVersion 是 22 或更低版本金抡,則系統(tǒng)會(huì)在用戶安裝應(yīng)用時(shí)要求用戶授予權(quán)限瀑焦。如果將新權(quán)限添加到更新的應(yīng)用版本,系統(tǒng)會(huì)在用戶更新應(yīng)用時(shí)要求授予該權(quán)限梗肝。用戶一旦安裝應(yīng)用榛瓮,他們撤銷權(quán)限的唯一方式是卸載應(yīng)用,但是在國(guó)產(chǎn)手機(jī)中巫击,由于廠商定制禀晓,或許可以在手機(jī)的設(shè)置中撤銷授權(quán)。

通常坝锰,權(quán)限失效會(huì)導(dǎo)致 SecurityException 被扔回應(yīng)用粹懒。但不能保證每個(gè)地方都是這樣。例如顷级,sendBroadcast(Intent) 方法在數(shù)據(jù)傳遞到每個(gè)接收者時(shí)會(huì)檢查權(quán)限凫乖,在方法調(diào)用返回后棵帽,即使權(quán)限失效樱蛤,您也不會(huì)收到異常邑商。但在幾乎所有情況下督函,權(quán)限失效會(huì)記入系統(tǒng)日志。

Android 系統(tǒng)提供的權(quán)限請(qǐng)參閱 Manifest.permission嚣镜。此外,任何應(yīng)用都可定義并實(shí)施自己的權(quán)限橘蜜,因此這不是所有可能權(quán)限的詳盡列表菊匿。

可能在程序運(yùn)行期間的多個(gè)位置實(shí)施特定權(quán)限:

  • 在調(diào)用系統(tǒng)時(shí),防止應(yīng)用執(zhí)行某些功能计福。
  • 在啟動(dòng) Activity 時(shí)跌捆,防止應(yīng)用啟動(dòng)其他應(yīng)用的 Activity。
  • 在發(fā)送和接收廣播時(shí)象颖,控制誰(shuí)可以接收您的廣播佩厚,誰(shuí)可以向您發(fā)送廣播。
  • 在訪問(wèn)和操作內(nèi)容提供程序時(shí)说订。
  • 綁定至服務(wù)或啟動(dòng)服務(wù)抄瓦。

自動(dòng)權(quán)限調(diào)整

隨著時(shí)間的推移,平臺(tái)中可能會(huì)加入新的限制陶冷,要想使用特定 API钙姊,您的應(yīng)用可能必須請(qǐng)求之前不需要的權(quán)限。因?yàn)楝F(xiàn)有應(yīng)用假設(shè)可隨意獲取這些 API 應(yīng)用的訪問(wèn)權(quán)限埂伦,所以 Android 可能會(huì)將新的權(quán)限請(qǐng)求應(yīng)用到應(yīng)用清單煞额,以免在新平臺(tái)版本上中斷應(yīng)用。Android 將根據(jù)為 targetSdkVersion 屬性提供的值決定應(yīng)用是否需要權(quán)限沾谜。如果該值低于在其中添加權(quán)限的版本膊毁,則 Android 會(huì)添加該權(quán)限。

例如基跑,API 級(jí)別 4 中加入了 WRITE_EXTERNAL_STORAGE 權(quán)限婚温,用以限制訪問(wèn)共享存儲(chǔ)空間。如果您的 targetSdkVersion 為 3 或更低版本媳否,則會(huì)向更新 Android 版本設(shè)備上的應(yīng)用添加此權(quán)限缭召。

注意:如果某權(quán)限自動(dòng)添加到應(yīng)用,則即使您的應(yīng)用可能實(shí)際并不需要這些附加權(quán)限逆日,Google Play 上的應(yīng)用列表也會(huì)列出它們嵌巷。

為避免這種情況,并且刪除您不需要的默認(rèn)權(quán)限室抽,請(qǐng)始終將 targetSdkVersion 更新至最高版本搪哪。可在 Build.VERSION_CODES 文檔中查看各版本添加的權(quán)限坪圾。

正常權(quán)限和危險(xiǎn)權(quán)限

系統(tǒng)權(quán)限分為幾個(gè)保護(hù)級(jí)別晓折。需要了解的兩個(gè)最重要保護(hù)級(jí)別是正常權(quán)限危險(xiǎn)權(quán)限

  • 正常權(quán)限 涵蓋應(yīng)用需要訪問(wèn)其沙盒外部數(shù)據(jù)或資源惑朦,但對(duì)用戶隱私或其他應(yīng)用操作風(fēng)險(xiǎn)很小的區(qū)域。例如漓概,設(shè)置時(shí)區(qū)的權(quán)限就是正常權(quán)限漾月。如果應(yīng)用聲明其需要正常權(quán)限,系統(tǒng)會(huì)自動(dòng)向應(yīng)用授予該權(quán)限胃珍。如需當(dāng)前正常權(quán)限的完整列表梁肿,請(qǐng)參閱正常權(quán)限
  • 危險(xiǎn)權(quán)限 涵蓋應(yīng)用需要涉及用戶隱私信息的數(shù)據(jù)或資源觅彰,或者可能對(duì)用戶存儲(chǔ)的數(shù)據(jù)或其他應(yīng)用的操作產(chǎn)生影響的區(qū)域吩蔑。例如,能夠讀取用戶的聯(lián)系人屬于危險(xiǎn)權(quán)限填抬。如果應(yīng)用聲明其需要危險(xiǎn)權(quán)限烛芬,則用戶必須明確向應(yīng)用授予該權(quán)限。

特殊權(quán)限
有許多權(quán)限其行為方式與正常權(quán)限及危險(xiǎn)權(quán)限都不同飒责。SYSTEM_ALERT_WINDOWWRITE_SETTINGS 特別敏感赘娄,因此大多數(shù)應(yīng)用不應(yīng)該使用它們。如果某應(yīng)用需要其中一種權(quán)限宏蛉,必須在清單中聲明該權(quán)限擅憔,并且發(fā)送請(qǐng)求用戶授權(quán)的 intent。系統(tǒng)將向用戶顯示詳細(xì)管理屏幕檐晕,以響應(yīng)該 intent暑诸。
如需了解有關(guān)如何請(qǐng)求這些權(quán)限的詳情,請(qǐng)參閱 SYSTEM_ALERT_WINDOW`和 WRITE_SETTINGS 參考條目辟灰。

權(quán)限組

所有危險(xiǎn)的 Android 系統(tǒng)權(quán)限都屬于權(quán)限組个榕。如果設(shè)備運(yùn)行的是 Android 6.0(API 級(jí)別 23),并且應(yīng)用的 targetSdkVersion 是 23 或更高版本芥喇,則當(dāng)用戶請(qǐng)求危險(xiǎn)權(quán)限時(shí)系統(tǒng)會(huì)發(fā)生以下行為:

  • 如果應(yīng)用請(qǐng)求其清單中列出的危險(xiǎn)權(quán)限西采,而應(yīng)用目前在權(quán)限組中沒(méi)有任何權(quán)限,則系統(tǒng)會(huì)向用戶顯示一個(gè)對(duì)話框继控,描述應(yīng)用要訪問(wèn)的權(quán)限組械馆。對(duì)話框不描述該組內(nèi)的具體權(quán)限。例如武通,如果應(yīng)用請(qǐng)求 READ_CONTACTS 權(quán)限霹崎,系統(tǒng)對(duì)話框只說(shuō)明該應(yīng)用需要訪問(wèn)設(shè)備的聯(lián)系信息。如果用戶批準(zhǔn)冶忱,系統(tǒng)將向應(yīng)用授予其請(qǐng)求的權(quán)限尾菇。
  • 如果應(yīng)用請(qǐng)求其清單中列出的危險(xiǎn)權(quán)限,而應(yīng)用在同一權(quán)限組中已有另一項(xiàng)危險(xiǎn)權(quán)限,則系統(tǒng)會(huì)立即授予該權(quán)限派诬,而無(wú)需與用戶進(jìn)行任何交互劳淆。例如,如果某應(yīng)用已經(jīng)請(qǐng)求并且被授予了 READ_CONTACTS 權(quán)限默赂,然后它又請(qǐng)求 WRITE_CONTACTS沛鸵,系統(tǒng)將立即授予該權(quán)限。

任何權(quán)限都可屬于一個(gè)權(quán)限組缆八,包括正常權(quán)限和應(yīng)用定義的權(quán)限曲掰。但權(quán)限組僅當(dāng)權(quán)限危險(xiǎn)時(shí)才影響用戶體驗(yàn)∫铮可以忽略正常權(quán)限的權(quán)限組蜈缤。

如果設(shè)備運(yùn)行的是 Android 5.1(API 級(jí)別 22)或更低版本拾氓,并且應(yīng)用的 targetSdkVersion 是 22 或更低版本冯挎,則系統(tǒng)會(huì)在安裝時(shí)要求用戶授予權(quán)限。再次強(qiáng)調(diào)咙鞍,系統(tǒng)只告訴用戶應(yīng)用需要的權(quán)限房官,而不告知具體權(quán)限。

  • 危險(xiǎn)權(quán)限和權(quán)限組续滋。


    image.png
定義和實(shí)施權(quán)限

要實(shí)施您自己的權(quán)限翰守,必須先使用一個(gè)或多個(gè) <permission> 元素在 AndroidManifest.xml 中聲明它們。

例如疲酌,想要控制誰(shuí)可以開(kāi)始其中一個(gè) Activity 的應(yīng)用可如下所示聲明此操作的權(quán)限:

<manifest  xmlns:android="http://schemas.android.com/apk/res/android"  package="com.example.myapp"  >  
<permission  
  android:name="com.example.myapp.permission.DEADLY_ACTIVITY"          
  android:label="@string/permlab_deadlyActivity"  
  android:description="@string/permdesc_deadlyActivity"  
  android:permissionGroup="android.permission-group.COST_MONEY"  android:protectionLevel="dangerous"  />
 ... 
</manifest>

:系統(tǒng)不允許多個(gè)軟件包使用同一名稱聲明權(quán)限蜡峰,除非所有軟件包都使用同一證書(shū)簽署。如果軟件包聲明權(quán)限朗恳,則系統(tǒng)不允許用戶安裝具有相同權(quán)限名稱的其他軟件包湿颅,除非這些軟件包使用與第一個(gè)軟件包相同的證書(shū)簽署。為避免命名沖突粥诫,建議對(duì)自定義權(quán)限使用相反域名樣式命名油航,例如 com.example.myapp.ENGAGE_HYPERSPACE

protectionLevel 屬性是必要屬性怀浆,用于指示系統(tǒng)如何向用戶告知需要權(quán)限的應(yīng)用谊囚,或者誰(shuí)可以擁有該權(quán)限,具體如鏈接的文檔中所述执赡。

android:permissionGroup 屬性是可選屬性镰踏,只是用于幫助系統(tǒng)向用戶顯示權(quán)限。大多數(shù)情況下沙合,您要將此設(shè)為標(biāo)準(zhǔn)系統(tǒng)組(列在 android.Manifest.permission_group 中)余境,但您也可以自己定義一個(gè)組。建議使用現(xiàn)有的組,因?yàn)檫@樣可簡(jiǎn)化向用戶顯示的權(quán)限 UI芳来。

需要為權(quán)限提供標(biāo)簽和描述含末。這些是用戶在查看權(quán)限列表(android:label)或單一權(quán)限詳細(xì)信息(android:description)時(shí)可以看到的字符串資源。標(biāo)簽應(yīng)簡(jiǎn)短即舌;用幾個(gè)詞描述權(quán)限保護(hù)的功能的關(guān)鍵部分佣盒。描述應(yīng)該用幾個(gè)句子描述權(quán)限允許持有人執(zhí)行的操作。我們的約定是用兩個(gè)句子描述:第一句描述權(quán)限顽聂,第二句向用戶提醒為應(yīng)用授予權(quán)限后可能出現(xiàn)的錯(cuò)誤類型肥惭。

下面是 CALL_PHONE 權(quán)限的標(biāo)簽和描述示例:

<string  name="permlab_callPhone">directly call phone numbers</string>  
<string  name="permdesc_callPhone">Allows the application to call
    phone numbers without your intervention. Malicious applications may
    cause unexpected calls on your phone bill. Note that this does not
    allow the application to call emergency numbers.
</string>

您可以使用 Settings 應(yīng)用和 shell 命令 adb shell pm list permissions 查看系統(tǒng)中當(dāng)前定義的權(quán)限。要使用 Settings 應(yīng)用紊搪,請(qǐng)轉(zhuǎn)到 Settings > Applications蜜葱。選擇一個(gè)應(yīng)用并向下滾動(dòng)查看該應(yīng)用使用的權(quán)限。對(duì)于開(kāi)發(fā)者耀石,adb '-s' 選項(xiàng)以類似于用戶將會(huì)看到的形式顯示權(quán)限:

$ adb shell pm list permissions -s
All Permissions:

Network communication: view Wi-Fi state, create Bluetooth connections, full
Internet access, view network state

Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location

Services that cost you money: send SMS messages, directly call phone numbers

...

自定義權(quán)限建議

應(yīng)用可以定義自己的自定義權(quán)限牵囤,并通過(guò)定義 <uses-permission> 元素請(qǐng)求其他應(yīng)用的自定義權(quán)限。不過(guò)滞伟,您應(yīng)該仔細(xì)評(píng)估您的應(yīng)用是否有必要這樣做揭鳞。

  • 如果要設(shè)計(jì)一套向彼此顯示功能的應(yīng)用,請(qǐng)盡可能將應(yīng)用設(shè)計(jì)為每個(gè)權(quán)限只定義一次梆奈。如果所有應(yīng)用并非使用同一證書(shū)簽署野崇,則必須這樣做。即使所有應(yīng)用使用同一證書(shū)簽署亩钟,最佳做法也是每個(gè)權(quán)限只定義一次乓梨。
  • 如果功能僅適用于使用與提供應(yīng)用相同的簽名所簽署的應(yīng)用,您可能可以使用簽名檢查避免定義自定義權(quán)限清酥。當(dāng)一個(gè)應(yīng)用向另一個(gè)應(yīng)用發(fā)出請(qǐng)求時(shí)扶镀,第二個(gè)應(yīng)用可在遵從該請(qǐng)求之前驗(yàn)證這兩個(gè)應(yīng)用是否使用同一證書(shū)簽署。
  • 如果您要開(kāi)發(fā)一套只在您自己的設(shè)備上運(yùn)行的應(yīng)用总处,則應(yīng)開(kāi)發(fā)并安裝管理該套件中所有應(yīng)用權(quán)限的軟件包狈惫。此軟件包本身無(wú)需提供任何服務(wù)。它只是聲明所有權(quán)限鹦马,然后套件中的其他應(yīng)用通過(guò) <uses-permission> 元素請(qǐng)求這些權(quán)限胧谈。
實(shí)施 AndroidManifest.xml 中的權(quán)限

您可以通過(guò) AndroidManifest.xml 應(yīng)用高級(jí)權(quán)限,限制訪問(wèn)系統(tǒng)或應(yīng)用的全部組件荸频。要執(zhí)行此操作菱肖,在所需的組件上包含 android:permission 屬性,為用于控制訪問(wèn)它的權(quán)限命名旭从。

Activity 權(quán)限(應(yīng)用于 <activity> 標(biāo)記)限制誰(shuí)可以啟動(dòng)相關(guān)的 Activity稳强。在 Context.startActivity()Activity.startActivityForResult() 時(shí)會(huì)檢查權(quán)限场仲;如果調(diào)用方?jīng)]有所需的權(quán)限,則調(diào)用會(huì)拋出 SecurityException退疫。

Service 權(quán)限(應(yīng)用于 <service> 標(biāo)記)限制誰(shuí)可以啟動(dòng)或綁定到相關(guān)的服務(wù)渠缕。在 Context.startService()Context.stopService()Context.bindService() 時(shí)會(huì)檢查權(quán)限褒繁;如果調(diào)用方?jīng)]有所需的權(quán)限亦鳞,則調(diào)用會(huì)拋出 SecurityException

BroadcastReceiver 權(quán)限(應(yīng)用于 <receiver> 標(biāo)記)限制誰(shuí)可以發(fā)送廣播給相關(guān)的接收方棒坏。在 Context.sendBroadcast() 返回后檢查權(quán)限燕差,因?yàn)橄到y(tǒng)會(huì)嘗試將提交的廣播傳遞到指定的接收方。因此坝冕,權(quán)限失效不會(huì)導(dǎo)致向調(diào)用方拋回異常徒探;只是不會(huì)傳遞該 intent。同樣喂窟,可以向 Context.registerReceiver() 提供權(quán)限來(lái)控制誰(shuí)可以廣播到以編程方式注冊(cè)的接收方测暗。另一方面,可以在調(diào)用 Context.sendBroadcast() 時(shí)提供權(quán)限來(lái)限制允許哪些 BroadcastReceiver 對(duì)象接收廣播(請(qǐng)參閱下文)谎替。

ContentProvider 權(quán)限(應(yīng)用于 <provider> 標(biāo)記)限制誰(shuí)可以訪問(wèn) ContentProvider 中的數(shù)據(jù)偷溺。(內(nèi)容提供程序有重要的附加安全工具可用蹋辅,稱為 URI 權(quán)限钱贯,將在后面介紹。)與其他組件不同侦另,您可以設(shè)置兩個(gè)單獨(dú)的權(quán)限屬性:android:readPermission 限制誰(shuí)可以讀取提供程序秩命,android:writePermission 限制誰(shuí)可以寫(xiě)入提供程序。請(qǐng)注意褒傅,如果提供程序有讀取和寫(xiě)入權(quán)限保護(hù)弃锐,僅擁有寫(xiě)入權(quán)限并不表示您可以讀取提供程序。第一次檢索提供程序時(shí)將會(huì)檢查權(quán)限(如果沒(méi)有任何權(quán)限殿托,將會(huì)拋出 SecurityException)霹菊,對(duì)提供程序執(zhí)行操作時(shí)也會(huì)檢查權(quán)限。使用 ContentResolver.query() 需要擁有讀取權(quán)限支竹;使用 ContentResolver.insert()旋廷、ContentResolver.update()ContentResolver.delete() 需要寫(xiě)入權(quán)限礼搁。在所有這些情況下饶碘,沒(méi)有所需的權(quán)限將導(dǎo)致調(diào)用拋出 SecurityException

發(fā)送廣播時(shí)實(shí)施權(quán)限

除了實(shí)施誰(shuí)可以向注冊(cè)的 BroadcastReceiver 發(fā)送 intent 的權(quán)限(如上所述)馒吴,您還可以指定在發(fā)送廣播時(shí)需要的權(quán)限扎运。通過(guò)使用權(quán)限字符串調(diào)用 Context.sendBroadcast()瑟曲,您可以要求接收方的應(yīng)用必須擁有該權(quán)限才可接收您的廣播。

請(qǐng)注意豪治,接收者和廣播者可能需要權(quán)限洞拨。此時(shí)负拟,這兩項(xiàng)權(quán)限檢查都必須通過(guò)后方可將 intent 傳遞到相關(guān)的目標(biāo)扣甲。

其他權(quán)限實(shí)施

可對(duì)任何服務(wù)調(diào)用實(shí)施任意細(xì)化的權(quán)限。這可通過(guò) Context.checkCallingPermission() 方法完成齿椅。使用所需的權(quán)限字符串調(diào)用琉挖,它將返回一個(gè)整數(shù),表示權(quán)限是否已授予當(dāng)前的調(diào)用進(jìn)程涣脚。請(qǐng)注意示辈,僅在執(zhí)行從另一個(gè)進(jìn)程傳入的調(diào)用(通常是通過(guò)從服務(wù)發(fā)布的 IDL 界面或者指定給另一進(jìn)程的某種其他方式完成)時(shí)才可使用此方法。

檢查權(quán)限還有許多其他有用的方法遣蚀。如果您有另一個(gè)進(jìn)程的 pid矾麻,可以使用 Context 方法 Context.checkPermission(String, int, int) 檢查針對(duì)該 pid 的權(quán)限。如果您有另一個(gè)應(yīng)用的軟件包名稱芭梯,可以使用直接的 PackageManager 方法 PackageManager.checkPermission(String, String) 了解是否已為特定軟件包授予特定權(quán)限险耀。

URI 權(quán)限

到目前為止所述的是標(biāo)準(zhǔn)權(quán)限系統(tǒng),內(nèi)容提供程序僅僅使用此系統(tǒng)通常是不夠的玖喘。內(nèi)容提供程序可能需要通過(guò)讀取和寫(xiě)入權(quán)限保護(hù)自己甩牺,而其直接客戶端也需要將特定 URI 傳給其他應(yīng)用以便于它們運(yùn)行。郵件應(yīng)用中的附件是一個(gè)典型的示例累奈。應(yīng)通過(guò)權(quán)限保護(hù)對(duì)郵件的訪問(wèn)贬派,因?yàn)檫@是敏感的用戶數(shù)據(jù)。但是澎媒,如果將圖像附件的 URI 提供給圖像查看程序搞乏,該圖像查看程序不會(huì)有打開(kāi)附件的權(quán)限,因?yàn)樗鼪](méi)有理由擁有訪問(wèn)所有電子郵件的權(quán)限戒努。

此問(wèn)題的解決方法是采用 per-URI 權(quán)限機(jī)制:在啟動(dòng) Activity 或返回結(jié)果給 Activity 時(shí)请敦,調(diào)用方可以設(shè)置 Intent.FLAG_GRANT_READ_URI_PERMISSION 和/或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION。這將授予接收 Activity 權(quán)限訪問(wèn) intent 中的特定數(shù)據(jù) URI储玫,而不管它是否具有訪問(wèn) intent 對(duì)應(yīng)的內(nèi)容提供程序中數(shù)據(jù)的任何權(quán)限侍筛。

此機(jī)制支持常見(jiàn)的能力式模型,其中用戶交互(打開(kāi)附件缘缚、從列表中選擇聯(lián)系人等)驅(qū)動(dòng)臨時(shí)授予細(xì)化的權(quán)限勾笆。這是一項(xiàng)關(guān)鍵功能,可將應(yīng)用所需的權(quán)限縮小至只與其行為直接相關(guān)的權(quán)限桥滨。

但授予細(xì)化的 URI 權(quán)限需要與擁有這些 URI 的內(nèi)容提供程序進(jìn)行一定的合作窝爪。強(qiáng)烈建議內(nèi)容提供程序?qū)嵤┐斯δ艹诔担⑶彝ㄟ^(guò) android:grantUriPermissions 屬性或 <grant-uri-permissions> 標(biāo)記聲明支持此功能。

Context.grantUriPermission()蒲每、Context.revokeUriPermission()Context.checkUriPermission() 方法中可以找到更多信息纷跛。

普通應(yīng)用使用正常權(quán)限列表:

權(quán)限名 說(shuō)明
ACCESS_LOCATION_EXTRA_COMMANDS 允許程序訪問(wèn)額外的位置提供者指令
ACCESS_NETWORK_STATE 允許程序訪問(wèn)有關(guān)GSM網(wǎng)絡(luò)信息
ACCESS_NOTIFICATION_POLICY APP通知顯示在狀態(tài)欄
ACCESS_WIFI_STATE 允許程序獲取當(dāng)前WiFi接入的狀態(tài)以及WLAN熱點(diǎn)的信息
BLUETOOTH 允許程序進(jìn)行藍(lán)牙通信
BLUETOOTH_ADMIN 允許程序操縱藍(lán)牙,譬如進(jìn)行發(fā)現(xiàn)和配對(duì)新的藍(lán)牙設(shè)備
BROADCAST_STICKY 允許使用粘性廣播
CHANGE_NETWORK_STATE 允許應(yīng)用改變網(wǎng)絡(luò)的連接狀態(tài)
CHANGE_WIFI_MULTICAST_STATE 允許應(yīng)用進(jìn)入Wi-Fi的組播方式
CHANGE_WIFI_STATE 允許應(yīng)用改變Wi-Fi的連接狀態(tài)
DISABLE_KEYGUARD 禁用鍵盤鎖
EXPAND_STATUS_BAR 展開(kāi)通知欄
FOREGROUND_SERVICE 前臺(tái)Service服務(wù)
GET_PACKAGE_SIZE 獲取應(yīng)用程序包大小
INSTALL_SHORTCUT 添加啟動(dòng)logo快捷方式
INTERNET 網(wǎng)絡(luò)訪問(wèn)
KILL_BACKGROUND_PROCESSES 清理后臺(tái)程序
MANAGE_OWN_CALLS 允許通過(guò)自我管理的ConnectionService API管理自己的調(diào)用的調(diào)用應(yīng)用程序
MODIFY_AUDIO_SETTINGS 音頻設(shè)置修改
NFC NFC
READ_SYNC_SETTINGS 允許程序讀取同步設(shè)置
READ_SYNC_STATS 允許程序讀取同步狀態(tài)
RECEIVE_BOOT_COMPLETED 開(kāi)機(jī)自啟
REORDER_TASKS 允許應(yīng)用改變?nèi)蝿?wù)的關(guān)系位置
REQUEST_COMPANION_RUN_IN_BACKGROUND 允許伴隨應(yīng)用在后臺(tái)運(yùn)行
REQUEST_COMPANION_USE_DATA_IN_BACKGROUND 允許伴隨應(yīng)用在后臺(tái)使用數(shù)據(jù)
REQUEST_DELETE_PACKAGES 允許應(yīng)用程序請(qǐng)求刪除軟件包
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 應(yīng)用程序必須擁有該權(quán)限才能使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
SET_ALARM 允許程序設(shè)置鬧鈴提醒
SET_WALLPAPER 允許程序設(shè)置桌面壁紙
SET_WALLPAPER_HINTS 允許程序設(shè)置壁紙?zhí)崾揪?/td>
TRANSMIT_IR 允許使用設(shè)備的紅外發(fā)射器
USE_FINGERPRINT 允許應(yīng)用使用指紋硬件
VIBRATE 允許手機(jī)開(kāi)啟振動(dòng)
WAKE_LOCK 允許持有電量鎖
WRITE_SYNC_SETTINGS 寫(xiě)入Google在線同步設(shè)置

參考文章:
【Android官方 系統(tǒng)權(quán)限說(shuō)明文檔(原文)】

image

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邀杏,一起剝皮案震驚了整個(gè)濱河市贫奠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌望蜡,老刑警劉巖唤崭,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脖律,居然都是意外死亡谢肾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門小泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芦疏,“玉大人,你說(shuō)我怎么就攤上這事微姊∷彳睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵兢交,是天一觀的道長(zhǎng)薪捍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)魁淳,這世上最難降的妖魔是什么飘诗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任与倡,我火速辦了婚禮界逛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺座。我一直安慰自己息拜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布净响。 她就那樣靜靜地躺著少欺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馋贤。 梳的紋絲不亂的頭發(fā)上赞别,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音配乓,去河邊找鬼仿滔。 笑死惠毁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崎页。 我是一名探鬼主播鞠绰,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼飒焦!你這毒婦竟也來(lái)了蜈膨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤牺荠,失蹤者是張志新(化名)和其女友劉穎翁巍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體休雌,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曙咽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挑辆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片例朱。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鱼蝉,靈堂內(nèi)的尸體忽然破棺而出洒嗤,到底是詐尸還是另有隱情,我是刑警寧澤魁亦,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布渔隶,位于F島的核電站,受9級(jí)特大地震影響洁奈,放射性物質(zhì)發(fā)生泄漏间唉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一利术、第九天 我趴在偏房一處隱蔽的房頂上張望呈野。 院中可真熱鬧,春花似錦印叁、人聲如沸被冒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昨悼。三九已至,卻和暖如春跃洛,著一層夾襖步出監(jiān)牢的瞬間率触,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工汇竭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葱蝗,地道東北人痊剖。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垒玲,于是被迫代替她去往敵國(guó)和親陆馁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 總結(jié)整理了一下android權(quán)限相關(guān)的知識(shí)合愈,由于篇幅過(guò)長(zhǎng)叮贩,分為兩篇博客來(lái)寫(xiě),上篇博客主要是詳解權(quán)限和安全佛析,下篇主要...
    Shawn_Dut閱讀 3,785評(píng)論 2 10
  • 權(quán)限概述 權(quán)限的目的是保護(hù)Android用戶的隱私益老。Android應(yīng)用程序必須請(qǐng)求訪問(wèn)敏感用戶數(shù)據(jù)(如聯(lián)系人和短信...
    WilsonYoung閱讀 1,276評(píng)論 0 0
  • 權(quán)限的目的是保護(hù)Android用戶的隱私。Android應(yīng)用訪問(wèn)敏感的用戶數(shù)據(jù)(如聯(lián)系人和短信)以及某些系統(tǒng)功能(...
    鹿小純0831閱讀 1,238評(píng)論 0 1
  • Android 是一個(gè)特權(quán)分離(privilege-separated)操作系統(tǒng)寸莫,在其中每個(gè)應(yīng)用都以一個(gè)不同的系統(tǒng)...
    DanieX閱讀 4,100評(píng)論 0 3
  • 今天媽媽給我報(bào)名去做月餅了捺萌。我們先去貽信園5棟的22樓,到了那里我發(fā)現(xiàn)有三張小桌子膘茎。上面分別放著塑料案板桃纯,電子稱,...
    翟澤源閱讀 386評(píng)論 0 0