來源:Yury Zhauniarovich | Publications
譯者:飛龍
雖然在這一節中我們描述了應用層的安全性,但是實際的安全實施通常出現在到目前爲止描述的底層。 但是,在介紹應用層之後,我們更容易解釋 Android 的一些安全功能。
5.1 應用組件
Android 應用以 Android 軟件包(.apk
)文件的形式分發。 一個包由 Dalvik 可執行文件,資源文件,清單文件和本地庫組成,並由應用的開發人員使用自簽名證書籤名。 每個 Android 應用由四個組件類型的幾個組件組成:活動(Activity),服務(Service),廣播接收器(Boardcast Reciver)和內容供應器(Content Provider)。 將應用分離爲組件有助於應用的一部分在應用之間重用。
活動。 活動是用戶界面的元素之一。 一般來說,一個活動通常代表一個界面。
服務。 服務是 Android 中的後臺工作裝置。 服務可以無限期運行。 最知名的服務示例是在後臺播放音樂的媒體播放器,即使用戶離開已啓動此服務的活動。
廣播接收器。 廣播接收器是應用的組件,它接收廣播消息並根據所獲得的消息啓動工作流。
內容供應器。 內容供應器是爲應用提供存儲和檢索數據的能力的組件。 它還可以與另一應用共享一組數據。
因此,Android 應用由不同的組件組成,沒有中央入口點,不像 Java 程序和main
方法那樣。 由於沒有入口點,所有組件(廣播接收器除外,它也可以動態定義)需要由應用的開發人員在AndroidManifest.xml
文件中聲明。 分離成組件使得我們可以在其它應用中使用組件。 例如,在清單 5.1 中,顯示了一個應用的AndroidManifest.xml
文件的示例。 此應用包含第 21 行中聲明的一個Activity
。其他應用可能會調用此活動,將此組件的功能集成到其應用中。
1 <?xml version="1.0" encoding="utf−8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.testpackage.testapp"
4 android:versionCode="1"
5 android:versionName="1.0"
6 android:sharedUserId="com.testpackage.shareduid"
7 android:sharedUserLabel="@string/sharedUserId" >
8
9 <uses−sdk android:minSdkVersion="10" />
10
11 <permission android:name="com.testpackage.permission.mypermission"
12 android:label="@string/mypermission_string"
13 android:description="@string/mypermission_descr_string"
14 android:protectionLevel="dangerous" />
15
16 <uses−permission android:name="android.permission.SEND_SMS"/>
17
18 <application
19 android:icon="@drawable/ic_launcher"
20 android:label="@string/app_name" >
21 <activity android:name=".TestActivity"
22 android:label="@string/app_name"
23 android:permission="com.testpackage.permission.mypermission" >
24 <intent−filter>
25 <action android:name="android.intent.action.MAIN" />
26 <category android:name="android.intent.category.LAUNCHER" />
27 </intent−filter>
28 <intent−filter>
29 <action android:name="com.testpackage.testapp.MY_ACTION" />
30 <category android:name="android.intent.category.DEFAULT" />
31 </intent−filter>
32 </activity>
33 </application>
34 </manifest>複製代碼
代碼 5.1:AndroidManifest.xml
文件示例
Android 提供了各種方式來調用應用的組件。 我們可以通過使用方法startActivity
和startActivityForResult
啓動新的活動。 服務通過startService
方法啓動。 在這種情況下,被調用的服務調用其方法onStart
。 當開發人員要在組件和服務之間建立連接時,它調用bindService
方法,並在被調用的服務中調用onBind
方法。 當應用或系統組件使用sendBroadcast
,sendOrderedBroadcast
和sendStickyBroadcast
方法發送特殊消息時,將啓動廣播接收器。
內容供應器由來自內容解析器的請求調用。所有其他組件類型通過Intent
(意圖)激活。 意圖是 Android 中基於Binder
框架的特殊通信手段。意圖被傳遞給執行組件調用的方法。被調用的組件可以被兩種不同類型的意圖調用。爲了顯示這些類型的差異,讓我們考慮一個例子。例如,用戶想要在應用中選擇圖片。應用的開發人員可以使用顯式意圖或隱式意圖來調用選擇圖片的組件。對於第一種意圖類型,開發人員可以在他的應用的組件中實現挑選功能,並使用帶有組件名稱數據字段的顯式意圖調用此組件。當然,開發人員可以調用其他應用的組件,但是在這種情況下,他必須確保該應用安裝在系統中。一般來說,從開發人員的角度來看,一個應用中的組件或不同應用的組件之間的交互不存在差異。對於第二種意圖類型,開發人員將選擇適當組件的權利轉移給操作系統。 intent
對象在其Action
,Data
和Category
字段中包含一些信息。根據這個信息,使用意圖過濾器,操作系統選擇可以處理意圖的適當組件。意圖過濾器定義了組件可以處理的意圖的“模板"。當然,相同的應用可以定義一個意圖過濾器,它將處理來自其他組件的意圖。
5.2 應用層的權限
權限不僅用於保護對系統資源的訪問。 第三方應用的開發人員還可以使用自定義權限來保護對其應用的組件的訪問。 自定義權限聲明的示例如清單 5.1 中第 11 行所示。自定義權限的聲明類似於系統權限之一。
爲了說明自定義權限的用法,請參考圖 5.1。由 3 個組件組成的應用 2 希望保護對其中兩個的訪問:C1 和 C2。爲了實現這個目標,應用 2 的開發者必須聲明兩個權限標籤p1
,p2
,並相應地將它們分配給受保護的組件。如果應用 1 的開發者想要訪問應用 2 的組件 C1 ,則他必須定義他的應用需要權限p1
。在這種情況下,應用 1 就可以使用應用 2 的組件 C1。如果應用沒有指定所需的權限,則禁止訪問受此權限保護的組件(參見圖 5.1 中組件 C2 的情況)。回頭看看我們在代碼 5.1 中的AndroidManifest.xml
文件的例子,活動TestActivity
被權限com.testpackage.permission.mypermission
保護,它在同一個應用清單文件中聲明。如果另一個應用想要使用TestActivity
提供的功能,它必須請求使用此權限,類似於第 16 行中的操作。
圖 5.1:保護第三方應用組件的權限實施
ActivityManagerService
負責調用應用的組件。 爲了保證應用組件的安全性,在用於調用組件的框架方法(例如,5.1 節中描述的startActivity
)中,放置特殊的鉤子。 這些鉤子檢查應用是否有權調用組件。 這些檢查以PackageManagerServer
類的CheckUidPermission
方法結束(參見清單 4.6)。 因此,發生在 Android 框架層的實際的權限實施,可以看做 Android 操作系統的受信任部分。 因此,應用不能繞過檢查。 有關如何調用組件和權限檢查的更多信息,請參見[8]。