在android系統的安全模型中,應用程序在默認的狀況下不能夠執行任何對其餘應用程序,系統或者用戶帶來負面影響的操做。若是應用須要執行某些操做,就須要聲明使用這個操做對應的權限。 (在manifest文件中 添加<uses-permission>標記)
android 系統提供了一系列這樣的權限,具體能夠查看android 權限,另外,android系統在新的版本中會增長一些permission,能夠查看android 版本信息。
固然,app也能夠自定義屬於本身的permission 或屬於開發者使用的同一個簽名的permission。定義一個permission 就是在menifest文件中添加一個permission標籤。html
<permission android:description="string resource" android:icon="drawable resource" android:label="string resource" android:name="string" android:permissionGroup="string" android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
android:description :對權限的描述,通常是兩句話,第一句話描述這個權限所針對的操做,第二句話告訴用戶授予app這個權限會帶來的後果
android:label: 對權限的一個簡短描述
android:name :權限的惟一標識,通常都是使用 報名加權限名
android:permissionGroup: 權限所屬權限組的名稱
android:protectionLevel: 權限的等級,
normal 是最低的等級,聲明次權限的app,系統會默認授予次權限,不會提示用戶
dangerous 權限對應的操做有安全風險,系統在安裝聲明此類權限的app時會提示用戶
signature 權限代表的操做只針對使用同一個證書籤名的app開放
signatureOrSystem 與signature相似,只是增長了rom中自帶的app的聲明
android:name 屬性是必須的,其餘的可選,未寫的系統會指定默認值
下面經過指定一個BroadcastReceiver的權限來實驗
首先建立了兩個app,app A ,app B ;
app A中註冊了一個BroadcastReceiver ,app B 發送消息
app A的menifest文件:android
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testbutton" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /> <!-- 聲明權限 --> <permission android:name="com.example.testbutton.RECEIVE" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" launcheMode="singleTask" android:configChanges="locale|orientation|keyboardHidden" android:screenOrientation="portrait" android:theme="@style/android:style/Theme.NoTitleBar.Fullscreen" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 註冊Broadcast Receiver,並指定了給當前Receiver發送消息方須要的權限 --> <receiver android:name="com.example.testbutton.TestButtonReceiver" android:permission="com.example.testbutton.RECEIVE" > <intent-filter> <action android:name="com.test.action" /> </intent-filter> </receiver> </application> </manifest>
app B 的menifest 文件內容安全
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testsender" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /> <!-- 聲明使用指定的權限 --> <uses-permission android:name="com.example.testbutton.RECEIVE" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
這樣app B 給app A 發送消息,A就能夠收到了,若未在app B的menifest文件中聲明使用相應的權限,app B發送的消息,A是收不到的。
另外,也可在app B 的menifest文件中聲明權限時,添加android:protectionLevel=「signature」,指定app B只能接收到使用同一證書籤名的app 發送的消息。 app