<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"] />
<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>
<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 發送的消息。 html
因爲Android部分設計原理較爲開放,可能經過Intent或PackageManager就能夠解析處理調用其餘應用的子類,因此在部分應用中須要作更多的安全處理,保證應用內部的穩定性和安全性。 android
穩定性: 部分類可能沒有數值的傳入將會致使可能初始化失敗,形成Force Close等問題。 數據庫
安全性: 其餘應用調用本程序的SQL數據庫等問題,可能會形成一些沒法預料到的損失。 安全
1、Android應用內部安全保護 多線程
爲了考慮內部部分敏感數據處理的安全性加入類ACL訪問控制,固然使用了更加靈活的,好比UID、SID、PID等多種方式。 app
1. 部分私有的配置信息,或相對輕量級的內容,可使用SharedPreferences接口提供的相關方法處理,並設置爲安全標誌位私有MODE_PRIVATE,不過須要注意的是該方法僅能本進程調用。 ide
2. SQLite的安全問題,對於Content Provider的處理權限,在Android中能夠直接顯示的聲明,好比在androidmanifest.xml中聲明讀或寫權限,在Provider節點中,聲明android:writePermission或android:readPermission屬性,固然其餘程序聲明瞭這些權限也能夠訪問,這時咱們能夠經過 android:authorities屬性限制一個類的訪問,好比android:authorities="cn.com.android.cwj" 。最終相似 ui
<provider
android:name="cwjProvider"
android:authorities="cn.com.android.cwj"
android:writePermission="cn.com.android.cwj.permission.WRITE_DATABASE"
android:readPermission="cn.com.android.cwj.permission.READ_DATABASE" /> spa
數據庫自己的讀寫能夠處理多線程問題,可是數據的前後能夠考慮同步問題,設置android:multiprocess="true"屬性來保證數據的正確性,相關問題不在本文討論範圍內,咱們可能會在之後的內容中涉及這部分問題。 線程
3. Activity、Service和Receiver的權限聲明方式,能夠直接使用android:permission屬性,具體的和上面的SQLite安全同樣的處理方式,演示代碼以下
<activity
android:name=".cwj"
android:authorities="cn.com.android"
android:permission="cn.com.android.cwj.permission.ACCESS"/>
2、Permission的聲明
<permission
android:name="cn.com.android.cwj.permission.ACCESS"
android:protectionLevel="normal"
android:label="@string/permission_aceess"
android:description="@string/permission_aceess_detail" />
固然還有可選的屬性好比說android:protectionLevel="normal"設置保護權限,還有必須簽名signature,固然這裏對於權限分組咱們能夠經過相似permission的方法來聲明permissionGroup,或直接使用系統的,好比android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最終其餘應用中調用,能夠顯示的在本身的manifest.xml中聲明便可,相似 <uses-permission android:name="cn.com.android.cwj.permission.ACCESS" />
3、帳戶安全聲明
直接在androidmanifest.xml中的Application中直接聲明,好比標準用戶權限相似
android:sharedUserId="android.uid.shared" ,固然處理一些RIL方面的能夠聲明相似 android.uid.phone 的權限,處理一些更敏感的數據。
4、Service安全
對於Service而言除了限制訪問的package外,咱們還能夠經過直接綁定並參數判斷的訪問來處理儘可能不使用android:exported="true"的導出方法,固然經過broadcast方式通信能夠經過intent的extra方式能夠作一些簡單的驗證。
5、PID的安全問題
PID的安全問題,經過限制processID的方式限制訪問,僅容許在同一個進程空間訪問。
6、android permissionLevel
在permissionLevel的定義時設置了android:protectionLevel這一項。取值範圍有四種: "normal" "dangerous" "signature" "signatureOrSystem" 若是定義的是前面兩種normal或者dangerous, 咱們本身的應用須要去訪問其對應受保護的資源時只須要在androidManifest.xml中添加相同的uses-permission就好了。 若是是signature, 咱們僅僅添加對權限的使用還不行, 必須同時具備相同的簽名。 若是是signatureOrSystem, 不只要有相同的簽名, 還必須有相同的sharedUserId.