標籤:des android style blog http color java 使用
系統許可權 安全架構
app在獨立進程沙箱中運行,互不影響。app靜態定義所需要的許可權,系統安裝時提醒使用者是否給app授權。
應用簽名
所有應用必須用認證簽名,認證由開發人員管理,它們是開發人員的唯一標識。
使用者ID和檔案訪問
1、同樣的shareUserId和簽名,才能在同一個進程中共用一個使用者ID
2、在建立新檔案時,可以通過MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE標籤來設定其他應用能否讀寫此檔案
使用許可權
預設的,app沒有任何許可權,需要在AndroidManifest中的<uses-permission>標籤來定義所需的許可權。
比如app需要監聽簡訊訊息時:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.app.myapp" > <uses-permission android:name="android.permission.RECEIVE_SMS" /> ...</manifest>
應用在安裝的時候,package installer能夠根據應用的簽名和使用者的選擇來授權。
通常來說,授權失敗將拋出SecurityException異常,但並不是每次授權失敗都會拋此異常。
然而,正常安裝過程中,所有的app需要的許可權都必須確認後,才能安裝,所以基本不存在運行時授權失敗的問題。
Android系統提供的所有許可權可以在Manifest.permission查詢,任何應用都可以自訂許可權。
特定的許可權可以用於各種情境:
- 系統調用的時候,通過許可權來避免應用執行特定功能
- 啟動activity時,通過許可權來阻止被其他應用所啟動
- 收發廣播時,通過許可權來控制廣播收發的對象
- 訪問和操作content provider
- 綁定或者啟動服務
Caution:?
自訂許可權
如果app想控制其他app能否有許可權啟動自身,可用通過如下方式來定義:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.me.app.myapp" > <permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
<!--app用到此許可權,安裝時彈出的提示標題--> android:label="@string/permlab_deadlyActivity"
<!--提示內容--> android:description="@string/permdesc_deadlyActivity"
<!--可選項--> android:permissionGroup="android.permission-group.COST_MONEY"
<!--必選項--> android:protectionLevel="dangerous" /> ...</manifest>
adb shell pm list permissions(TODO:adb shell pm命令解析)
對於組件的存取權限,可以在AndroidManifest.xml中定義特定組件的android:permission屬性來控制
Activity:
誰能啟動它,許可權在Context.startActivity() 和 Activity.startActivityForResult()檢查,失敗會拋SecurityException
Service:
誰能啟動或綁定它,許可權在Context.startService(), Context.stopService() 和 Context.bindService()檢查,失敗拋SecurityException
BroadcastReceiver:
誰能給它發廣播,在Context.sendBroadcast()檢查,失敗不會拋異常,同時ontext.registerReceiver()也能檢查。在Context.sendBroadcast()時,可以帶許可權字串的參數來確認許可權。廣播發送和接收都可以設定許可權,如果同時設定,那麼必須同時匹配才會生效。
ContentProvider:
誰能訪問它的資料(CP還有另外一個非常重要的許可權機制:URI permissions ),CP分讀(android:readPermission)和寫(android:writePermission)兩種許可權,必須注意的是,如果讀和寫入權限同時存在,那麼僅僅擁有寫入權限的應用無法讀取資料。讀許可權在ContentResolver.query() 檢查,寫入權限在ContentResolver.insert(),ContentResolver.update(), ContentResolver.delete() 檢查,失敗會拋SecurityException
還有其他檢查許可權的方式,比如Context.checkCallingPermission(), Context.checkPermission(String, int, int), PackageManager.checkPermission(String, String)
URI許可權
TODO