每個 Android 應(yīng)用都處于各自的安全沙盒中,并受以下 Android 安全功能的保護(hù):
Android 操作系統(tǒng)是一種多用戶 Linux 系統(tǒng),其中的每個應(yīng)用都是一個不同的用戶;
默認(rèn)情況下,系統(tǒng)會為每個應(yīng)用分配一個唯一的 Linux 用戶 ID(該 ID 僅由系統(tǒng)使用,應(yīng)用并不知曉)。系統(tǒng)會為應(yīng)用中的所有文件設(shè)置權(quán)限,使得只有分配給該應(yīng)用的用戶 ID 才能訪問這些文件;
每個進(jìn)程都擁有自己的虛擬機 (VM),因此應(yīng)用代碼獨立于其他應(yīng)用而運行。
默認(rèn)情況下,每個應(yīng)用都在其自己的 Linux 進(jìn)程內(nèi)運行。Android 系統(tǒng)會在需要執(zhí)行任何應(yīng)用組件時啟動該進(jìn)程,然后當(dāng)不再需要該進(jìn)程或系統(tǒng)必須為其他應(yīng)用恢復(fù)內(nèi)存時,其便會關(guān)閉該進(jìn)程。
應(yīng)用仍可通過一些途徑與其他應(yīng)用共享數(shù)據(jù)以及訪問系統(tǒng)服務(wù):
1 . 可以安排兩個應(yīng)用共享同一 Linux 用戶 ID,在此情況下,二者便能訪問彼此的文件。為節(jié)省系統(tǒng)資源,也可安排擁有相同用戶 ID 的應(yīng)用在同一 Linux 進(jìn)程中運行,并共享同一 VM。應(yīng)用還必須使用相同的證書進(jìn)行簽名
- 應(yīng)用可以請求訪問設(shè)備數(shù)據(jù)(如用戶的聯(lián)系人、短信消息、可裝載存儲裝置(SD 卡)、相機、藍(lán)牙等)的權(quán)限。用戶必須明確授予這些權(quán)限。如需了解詳細(xì)信息,請參閱使用系統(tǒng)權(quán)限
應(yīng)用組件
應(yīng)用組件是 Android 應(yīng)用的基本構(gòu)建塊。每個組件都是一個入口點,系統(tǒng)或用戶可通過該入口點進(jìn)入您的應(yīng)用。有些組件會依賴于其他組件。
共有四種不同的應(yīng)用組件類型:
Activity
服務(wù)
廣播接收器
內(nèi)容提供程序
啟動組件
每種組件都有不同的啟動方法:
- 如要啟動 Activity,您可以向
[startActivity()](https://developer.android.com/reference/android/content/Context#startActivity(android.content.Intent))或[startActivityForResult()](https://developer.android.com/reference/android/app/Activity#startActivityForResult(android.content.Intent, int))傳遞[Intent](https://developer.android.com/reference/android/content/Intent)(當(dāng)您想讓 Activity 返回結(jié)果時),或者為其安排新任務(wù)。 - 在 Android 5.0(API 級別 21)及更高版本中,您可以使用
[JobScheduler](https://developer.android.com/reference/android/app/job/JobScheduler)類來調(diào)度操作。對于早期 Android 版本,您可以通過向[startService()](https://developer.android.com/reference/android/content/Context#startService(android.content.Intent))傳遞[Intent](https://developer.android.com/reference/android/content/Intent)來啟動服務(wù)(或?qū)?zhí)行中的服務(wù)下達(dá)新指令)。您也可通過向?qū)?[bindService()](https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent, android.content.ServiceConnection, int))傳遞[Intent](https://developer.android.com/reference/android/content/Intent)來綁定到該服務(wù)。 - 您可以通過向
[sendBroadcast()](https://developer.android.com/reference/android/content/Context#sendBroadcast(android.content.Intent))、[sendOrderedBroadcast()](https://developer.android.com/reference/android/content/Context#sendOrderedBroadcast(android.content.Intent, java.lang.String))或[sendStickyBroadcast()](https://developer.android.com/reference/android/content/Context#sendStickyBroadcast(android.content.Intent))等方法傳遞[Intent](https://developer.android.com/reference/android/content/Intent)來發(fā)起廣播。 - 您可以通過在
[ContentResolver](https://developer.android.com/reference/android/content/ContentResolver)上調(diào)用[query()](https://developer.android.com/reference/android/content/ContentProvider#query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal)),對內(nèi)容提供程序執(zhí)行查詢。
清單文件
在 Android 系統(tǒng)啟動應(yīng)用組件之前,系統(tǒng)必須通過讀取應(yīng)用的清單文件 (AndroidManifest.xml) 確認(rèn)組件存在。您的應(yīng)用必須在此文件中聲明其所有組件,該文件必須位于應(yīng)用項目目錄的根目錄中。
除了聲明應(yīng)用的組件外,清單文件還有許多其他作用,如:
- 確定應(yīng)用需要的任何用戶權(quán)限,如互聯(lián)網(wǎng)訪問權(quán)限或?qū)τ脩袈?lián)系人的讀取權(quán)限。
- 根據(jù)應(yīng)用使用的 API,聲明應(yīng)用所需的最低 API 級別。
- 聲明應(yīng)用使用或需要的硬件和軟件功能,如相機、藍(lán)牙服務(wù)或多點觸摸屏幕。
- 聲明應(yīng)用需要鏈接的 API 庫(Android 框架 API 除外),如 Google 地圖庫。