Android 安全架構及權限控制機制剖析

簡介: Android 是業界流行的開源移動平臺,受到廣泛關注併爲多個手機製造商作爲手機的操作系統平臺,因此,研究其安全架構及權限控制機制具有非常的重要性。本文從 Android 層次化安全架構入手,詳細地介紹 Android 平臺的安全架構及其權限控制機制,涵蓋 Android 應用程序權限申請方法等,並從源代碼實現層面來解析該機制。

Android 層次化安全架構

Android 作爲一個移動設備的平臺,其軟件層次結構包括了一個操作系統(OS),中間件(MiddleWare)和應用程序(Application)。根據 Android 的軟件框圖,其軟件層次結構自下而上分爲以下幾個層次:

●操作系統層(OS)

●各種庫(Libraries)和 Android 運行環境(RunTime)

●應用程序框架(Application Framework)

●應用程序(Application)

以下分別介紹 Andoid 各個層次的軟件的重點及其相關技術:

(1)操作系統層(OS)

Android 使用 Linux2.6 作爲操作系統,Linux2.6 是一種標準的技術,Linux 也是一個開放的操作系統。Android 對操作系統的使用包括核心和驅動程序兩部分,Android 的 Linux 核心爲標準的 Linux2.6 內核,Android 更多的是需要一些與移動設備相關的驅動程序。主要的驅動如下所示:

●顯示驅動(Display Driver):常用基於 Linux 的幀緩衝(Frame Buffer)驅動

●Flash 內存驅動(Flash Memory Driver)

●照相機驅動(Camera Driver):常用基於 Linux 的 v4l(Video for )驅動。

●音頻驅動(Audio Driver):常用基於 ALSA(Advanced Linux Sound Architecture,高級 Linux 聲音體系)驅動

●WiFi 驅動(Camera Driver):基於 IEEE 802.11 標準的驅動程序

●鍵盤驅動(KeyBoard Driver)

●藍牙驅動(Bluetooth Driver)

●Binder IPC 驅動:Andoid 一個特殊的驅動程序,具有單獨的設備節點,提供進程間通訊的功能。

●Power Management(能源管理)

(2)各種庫(Libraries)和 Android 運行環境(RunTime)

本層次對應一般嵌入式系統,相當於中間件層次。Android 的本層次分成兩個部分一個是各種庫,另一個是 Android 運行環境。本層的內容大多是使用 C++ 實現的。 在其中,各種庫包括:

●C 庫:C 語言的標準庫,這也是系統中一個最爲底層的庫,C 庫是通過 Linux 的系統調用來實現。

●多媒體框架(MediaFrameword):這部分內容是 Android 多媒體的核心部分,基於 PacketVideo(即 PV)的 OpenCORE,從功能上本庫一共分爲兩大部分,一個部分是音頻、視頻的回放(PlayBack),另一部分是則是音視頻的紀錄(Recorder)。

●SGL:2D 圖像引擎。

●SSL:即 Secure Socket Layer 位於 TCP/IP 協議與各種應用層協議之間 , 爲數據通訊提供安全支持。

●OpenGL ES 1.0 :本部分提供了對 3D 的支持。

●界面管理工具(Surface Management):本部分提供了對管理顯示子系統等功能。

●SQLite:一個通用的嵌入式數據庫

●WebKit:網絡瀏覽器的核心

●FreeType:位圖和矢量字體的功能。

Android 的各種庫一般是以系統中間件的形式提供的,它們均有的一個顯著特點就是與移動設備的平臺的應用密切相關。 Android 運行環境主要指的虛擬機技術—— Dalvik。Dalvik 虛擬機和一般 JAVA 虛擬機(Java VM)不同,它執行的不是 JAVA 標準的字節碼(bytecode )而是 Dalvik 可執行格式(.dex)中執行文件。在執行的過程中,每一個應用程序即一個進程(Linux 的一個 Process)。 二者最大的區別在於 Java VM 是以基於棧的虛擬機(Stack-based),而 Dalvik 是基於寄存器的虛擬機(Register-based)。顯然,後者最大的好處在於可以根據硬件實現更大的優化,這更適合移動設備的特點。

(3)應用程序框架(Application Framework)

Android 的應用程序框架爲應用程序層的開發者提供 APIs,它實際上是一個應用程序的框架。由於上層的應用程序是以 JAVA 構建的,因此本層次提供的首先包含了 UI 程序中所需要的各種控件: 例如: Views ( 視圖組件 ) 包括 lists( 列表 ), grids( 柵格 ), text boxes( 文本框 ), buttons( 按鈕 ) 等,甚至一個嵌入式的 Web 瀏覽器。一個 Android 的應用程序可以利用應用程序框架中的以下幾個部分: Activity (活動)、Broadcast Intent Receiver (廣播意圖接收者)、Service (服務)、Content Provider (內容提供者)。

(4)應用程序(Application)

Android 的應用程序主要是用戶界面(User Interface),通常以 JAVA 程序編寫,其中還可以包含各種資源文件(放置在 res 目錄中)。JAVA 程序及相關資源經過編譯後,將生成一個 APK 包。Android 本身提供了主屏幕(Home),聯繫人(Contact),電話(Phone),瀏覽器(Browsers)等衆多的核心應用。同時應用程序的開發者還可以使用應用程序框架層的 API 實現自己的程序。

圖 1. Android 分層安全架構圖

圖 1. Android 分層安全架構圖

Android 的組件模型(Component Model)

Android 系統中包括 4 種組件:

(1)Activity

Activity 就是一個界面,這個界面裏面可以放置各種控件。例如:Task Manager 的界面、Root Explorer 的界面等;Activity 是爲用戶操作而展示的可視化用戶界面。例如說,一個 activity 可以展示一個菜單項列表供用戶選擇,或者顯示一些包含說明的照片。一個短消息應用程序可以包括一個用於顯示做爲發送對象的聯繫人的列表的 activity,一個給選定的聯繫人寫短信的 activity 以及翻閱以前的短信和改變設置的 activity。儘管

它們一起組成了一個內聚的用戶界面,但其中每個 activity 都與其它的保持獨立。每個都是以 Activity類爲基類的子類實現。
一個應用程序可以只有一個 activity,或者,如剛纔提到的短信應用程序那樣,包含很多個。而每個 activity 的作用以及其數目,自然取決於應用程序及其設計。一般情況下,總有一個應用程序被標記爲用戶在應用程序啓動的時候第一個看到的。從一個 activity 轉向另一個的方式是靠當前的 activity 啓動下一個。

每個 activity 都被給予一個默認的窗口以進行繪製。一般情況下,這個窗口是滿屏的,但它也可以是一個小的位於其它窗口之上的浮動窗口。一個 activity 也可以使用超過一個的窗口。例如,在 activity 運行過程中彈出的一個供用戶反應的小對話框,或是當用戶選擇了屏幕上特定項目後顯示的必要信息。

窗口顯示的可視內容是由一系列視圖構成的,這些視圖均繼承自 View基類。每個視圖均控制着窗口中一塊特定的矩形空間。父級視圖包含並組織它子視圖的佈局。葉節點視圖(位於視圖層次最底端)在它們控制的矩形中進行繪製,並對用戶對其直接操作做出響應。所以,視圖是 activity 與用戶進行交互的界面。例如說,視圖可以顯示一個小圖片,並在用戶指點它的時候產生動作。Android 有很多既定的視圖供用戶直接使用,包括按鈕、文本域、卷軸、菜單項、複選框等等。

(2)Service

服務是運行在後臺的功能模塊。如文件下載、音樂播放程序等;服務沒有可視化的用戶界面,而是在一段時間內在後臺運行。例如說,一個服務可以在用戶做其它事情的時候在後臺播放背景音樂、從網絡上獲取一些數據或者計算一些東西並提供給需要這個運算結果的 activity 使用。每個服務都繼承自 Service基類。

一個媒體播放器播放播放列表中的曲目是一個不錯的例子。播放器應用程序可能有一個或多個 activity 來給用戶選擇歌曲並進行播放。然而,音樂播放這個任務本身不應該爲任何 activity 所處理,因爲用戶期望在他們離開播放器應用程序而開始做別的事情時,音樂仍在繼續播放。爲達到這個目的,媒體播放器 activity 應該啓用一個運行於後臺的服務。而系統將在這個 activity 不再顯示於屏幕之後,仍維持音樂播放服務的運行。
可以連接至(綁定)一個正在運行的服務(如果服務沒有運行,則啓動之)。連接之後,可以通過那個服務暴露出來的接口與服務進行通訊。對於音樂服務來說,這個接口可以允許用戶暫停、回退、停止以及重新開始播放。

(3)Content Provider

它是 Android 平臺應用程序間數據共享的一種標準接口,它以類似於 URI(Universal Resources Identification)的方式來表示數據,如:content://contacts/people/1101;內容提供者將一些特定的應用程序數據供給其它應用程序使用。數據可以存儲於文件系統、SQLite 數據庫或其它方式。內容提供者繼承於 ContentProvider基類,爲其它應用程序取用和存儲它管理的數據實現了一套標準方法。然而,應用程序並不直接調用這些方法,而是使用一個 ContentResolver對象,調用它的方法作爲替代。ContentResolver 可以與任意內容提供者進行會話,與其合作來對所有相關交互通訊進行管理。

(4)Broadcast Receiver

Broadcast Receiver 是一個專注於接收廣播通知信息,並做出對應處理的組件。很多廣播是源自於系統代碼的。例如,通知時區改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應用程序也可以進行廣播,例如通知其它應用程序一些數據下載完成並處於可用狀態。

應用程序可以擁有任意數量的 Broadcast Receiver 以對所有它感興趣的通知信息予以響應。所有的接收器均繼承自 BroadcastReceiver基類。
Broadcast Receiver 沒有用戶界面。然而,它們可以啓動一個 activity 來響應它們收到的信息,或者用 NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。

與此組件相關的概念是 Intent,Intent 是一個對動作和行爲的抽象描述,負責組件之間程序之間進行消息傳遞。而 Broadcast Receiver 組件則提供了一種把 Intent 作爲一個消息廣播出去,由所有對其感興趣的程序對其作出反應的機制。舉個簡單的例子,爲了實現一個系統啓動後播放音樂的功能,則可以定義 Intent 爲 android.intent.action.BOOT_COMPLETED,由 Broadcast Receiver 組件將其進行廣播,而系統中的 Media Player 接收到該信息後則進行播放。

如上所述,4 個組件之間的關係如下圖:

圖 2. Android 各組件關係圖

圖 2. Android 各組件關係圖

Android 的權限分類

根據用戶的使用過程體驗,可以將 Android 涉及的權限大致分爲如下三類:

(1)Android 手機所有者權限:自用戶購買 Android 手機後,用戶不需要輸入任何密碼,就具有安裝一般應用軟件、使用應用程序等的權限;

(2)Android root 權限:該權限爲 Android 系統的最高權限,可以對所有系統中文件、數據進行任意操作。出廠時默認沒有該權限,需要使用 z4Root 等軟件進行獲取,然而,並不鼓勵進行此操作,因爲可能由此使用戶失去手機原廠保修的權益。同樣,如果將 Android 手機進行 root 權限提升,則此後用戶不需要輸入任何密碼,都將能以 Android root 權限來使用手機。

(3)Android 應用程序權限:Android 提供了豐富的 SDK(Software development kit),開發人員可以根據其開發 Android 中的應用程序。而應用程序對 Android 系統資源的訪問需要有相應的訪問權限,這個權限就稱爲 Android 應用程序權限,它在應用程序設計時設定,在 Android 系統中初次安裝時即生效。值得注意的是:如果應用程序設計的權限大於 Android 手機所有者權限,則該應用程序無法運行。如:沒有獲取 Android root 權限的手機無法運行 Root Explorer,因爲運行該應用程序需要 Android root 權限。

Android 系統權限定義

Android 系統在 /system/core/private/android_filesystem_config.h 頭文件中對 Android 用戶 / 用戶組作了如下定義,且權限均基於該用戶 / 用戶組設置。

#define AID_ROOT 0 /* traditional unix root user */
#define AID_SYSTEM 1000 /* system server */
#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH 1002 /* bluetooth subsystem */
#define AID_GRAPHICS 1003 /* graphics devices */
#define AID_INPUT 1004 /* input devices */
#define AID_AUDIO 1005 /* audio devices */
#define AID_CAMERA 1006 /* camera devices */
#define AID_LOG 1007 /* log devices */
#define AID_COMPASS 1008 /* compass device */
#define AID_MOUNT 1009 /* mountd socket */
#define AID_WIFI 1010 /* wifi subsystem */
#define AID_ADB 1011 /* android debug bridge (adbd) */
#define AID_INSTALL 1012 /* group for installing packages */
#define AID_MEDIA 1013 /* mediaserver process */
#define AID_DHCP 1014 /* dhcp client */
#define AID_SDCARD_RW 1015 /* external storage write access */
#define AID_VPN 1016 /* vpn system */
#define AID_KEYSTORE 1017 /* keystore subsystem */
#define AID_USB 1018 /* USB devices */
#define AID_DRM 1019 /* DRM server */
#define AID_DRMIO 1020 /* DRM IO server */
#define AID_GPS 1021 /* GPS daemon */
#define AID_NFC 1022 /* nfc subsystem */
#define AID_SHELL 2000 /* adb and debug shell user */
#define AID_CACHE 2001 /* cache access */
#define AID_DIAG 2002 /* access to diagnostic resources */
/* The 3000 series are intended for use as supplemental group id's only.
* They indicate special Android capabilities that the kernel is aware of. */
#define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
#define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
#define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
#define AID_NET_RAW 3004 /* can create raw INET sockets */
#define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */
#define AID_MISC 9998 /* access to misc storage */
#define AID_NOBODY 9999
#define AID_APP 10000 /* first app user */

值得注意的是:每個應用程序在安裝到 Android 系統後,系統都會爲其分配一個用戶 ID,如 app_4、app_11 等。以下是 Calendar 和 Terminal 軟件在 Android 系統中進程瀏覽的結果(其中,黑色字體標明的即爲應用分配的用戶 ID):

USER PID PPID VSIZE RSS WCHAN PC NAME
app_16 2855 2363 216196 20960 ffffffff afd0ee48 S com.android.providers.calendar
app_91 4178 2363 218872 25076 ffffffff afd0ee48 S jackpal.androidterm

在 Android 系統中,上述用戶 / 用戶組對文件的訪問遵循 Linux 系統的訪問控制原則,即根據長度爲 10 個字符的權限控制符來決定用戶 / 用戶組對文件的訪問權限。該控制符的格式遵循下列規則:

●第 1 個字符:表示一種特殊的文件類型。其中字符可爲 d( 表示該文件是一個目錄 )、b( 表示該文件是一個系統設備,使用塊輸入 / 輸出與外界交互,通常爲一個磁盤 )、c( 表示該文件是一個系統設備,使用連續的字符輸入 / 輸出與外界交互,如串口和聲音設備 ),“.”表示該文件是一個普通文件,沒有特殊屬性。

●2 ~ 4 個字符:用來確定文件的用戶 (user) 權限;

●5 ~ 7 個字符:用來確定文件的組 (group) 權限;

●8 ~ 10 個字符:用來確定文件的其它用戶 (other user,既不是文件所有者,也不是組成員的用戶 ) 的權限。

●第 2、5、8 個字符是用來控制文件的讀權限的,該位字符爲 r 表示允許用戶、組成員或其它人可從該文件中讀取數據。短線“-”則表示不允許該成員讀取數據。

●第 3、6、9 位的字符控制文件的寫權限,該位若爲 w 表示允許寫,若爲“-”表示不允許寫。

●第 4、7、10 位的字符用來控制文件的製造權限,該位若爲 x 表示允許執行,若爲“-”表示不允許執行。

舉個例子,“drwxrwxr– 2 root root 4096 2 月 11 10:36 lu”表示的訪問控制權限(黑色字體標明)爲:因爲 lu 的第 1 個位置的字符是 d,所以由此知道 lu 是一個目錄。第 2 至 4 位置上的屬性是 rwx,表示用戶 root 擁有權限列表顯示 lu 中所有的文件、創建新文件或者刪除 lu 中現有的文件,或者將 lu 作爲當前工作目錄。第 5 至 7 個位置上的權限是 rwx,表示 root 組的成員擁有和 root 一樣的權限。第 8 至 10 位上的權限僅是 r–,表示不是 root 的用戶及不屬於 root 組的成員只有對 lu 目錄列表的權限。這些用戶不能創建或者刪除 lu 中的文件、執行 junk 中的可執行文件,或者將 junk 作爲他們的當前工作目錄。

Android 應用程序權限申請

每個應用程序的 APK 包裏面都包含有一個 AndroidMainifest.xml 文件,該文件除了羅列應用程序運行時庫、運行依賴關係等之外,還會詳細地羅列出該應用程序所需的系統訪問。程序員在進行應用軟件開發時,需要通過設置該文件的 uses-permission 字段來顯式地向 Android 系統申請訪問權限。

AndroidMainifest.xml 文件用途

AndroidManifest.xml 主要包含以下功能:

1、說明 application 的 java 數據包,數據包名是 application 的唯一標識;

2、描述 application 的 component;

3、說明 application 的 component 運行在哪個 process 下;

4、聲明 application 所必須具備的權限,用以訪問受保護的部分 API,以及與其他 application 的交互;

5、聲明 application 其他的必備權限,用以 component 之間的交互;

6、列舉 application 運行時需要的環境配置信息,這些聲明信息只在程序開發和測試時存在,發佈前將被刪除;

7、聲明 application 所需要的 Android API 的最低版本級別,例如 1.0,1.1,1.5;

8、列舉 application 所需要鏈接的庫;

AndroidManifest.xml 文件的結構及元素

AndroidManifest.xml 文件的結構、元素,以及元素的屬性,可以在 Android SDK 文檔中查看詳細說明。而在看這些衆多的元素以及元素的屬性前,需要先了解一下這些元素在命名、結構等方面的規則:

1、元素:在所有的元素中只有 和 是必需的,且只能出現一次。如果一個元素包含有其他子元素,必須通過子元素的屬性來設置其值。處於同一層次的元素,這些元素的說明是沒有順序的。

2、屬性:按照常理,所有的屬性都是可選的,但是有些屬性是必須設置的。那些真正可選的屬性,即使不存在,其也有默認的數值項說明。除了根元素 的屬性,所有其他元素屬性的名字都是以 android: 前綴的;

3、定義類名:所有的元素名都對應其在 SDK 中的類名,如果你自己定義類名,必須包含類的數據包名,如果類與 application 處於同一數據包中,可以直接簡寫爲“.”;

4、多數值項:如果某個元素有超過一個數值,這個元素必須通過重複的方式來說明其某個屬性具有多個數值項,且不能將多個數值項一次性說明在一個屬性中;

5、資源項說明:當需要引用某個資源時,其採用如下格式:@[package:]type:name。例如

6、字符串值:類似於其他語言,如果字符中包含有字符“\”,則必須使用轉義字符“\\”;

下面結合 cookie 實例中的 AndroidManifest.xml 文件來說明一下,原 XML 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version=”1.0 ″ encoding=”utf-8 ″ ?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android
          package=”moandroid.cookie”
          android:versionCode=”1 ″
          android:versionName=”1.0 ″ >
          <application android:icon=”@drawable/icon” android:label=”@string/app_name”>
                <activity android:name=”.cookie” android:label=”@string/app_name”>
                     <intent-filter>
                          <action android:name=”android.intent.action.MAIN” />
                          <category android:name=”android.intent.category.LAUNCHER” />
                     </intent-filter>
                </activity>
         </application>
         <uses-sdk android:minSdkVersion=”3 ″ />
</manifest>

除了頭部的 XML 信息說明外,首先是 manifest 項(也就是根節點),其屬性包括:schemas URL 地址、包名(moandroid.cookie),以及程序的版本說明。其次是 manifest 的子節點 application,其屬性包括:程序圖標、程序名稱。前面帶有 @ 表示引用資源,例如:@drawable/icon 表示引用的是 drawable 資源中的 icon,可以在其源工程的 res/drawable 中找到。然後就是 application 的子節點 activity,其屬性包括:activity 的名稱、activity 的標籤名,其子節點 intent-filter 則是對 activity 的說明。

而在 intent-filter 中,action android:name=”android.intent.action.MAIN”和 category android:name=”android.intent.category.LAUNCHER”用以說明程序啓動時的入口 activity 是哪個。如果這兩個屬性值中分別含有 MAIN 和 LAUNCHER,則說明它就是啓動程序時的入口活動。uses-sdk android:minSdkVersion=”3 ″說明程序使用的 Android SDK 的最低版本,其中 1 表示 Android 1.0,2 表示 Android 1.1,而 3 則表示 Android 1.5。

如何進行應用程序權限申請

如下所示,文中黑體標記的部分爲應用程序權限申請內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
          package="cn.com.fetion.android"
          android:versionCode="1"
          android:versionName="1.0.0">
          <application android:icon="@drawable/icon" android:label="@string/app_name">
               <activity android:name=".welcomActivity"
                     android:label="@string/app_name">
                     <intent-filter>
                           <action android:name="android.intent.action.MAIN" />
                           <category android:name="android.intent.category.LAUNCHER" />
                     </intent-filter>
              </activity>
         </application>
         <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
</manifest>

如上述文件描述中加下劃線的斜體部分,該文件的作用是說明該軟件需要發送短信的功能。

Android 定義了百餘種 permission,可供開發人員使用,具體詳見網址:http://developers.androidcn.com/reference/android/Manifest.permission.html。

在文件中,用戶還可以自定義權限。permission 就是自定義權限的聲明,可以用來限制 app 中特殊組件,特性與 app 內部或者和其他 app 之間訪問。寫了一個引用自定義權限的例子,在安裝 app 的時候,提示權限:

定義權限如下:

1
2
3
4
5
<permission android:label="”自定義權限”"
      android:description=”@string/test”
      android:name=”com.example.project.TEST”
      android:protectionLevel=”normal”
      android:icon=”@drawable/ic_launcher”>

聲明的含義如下;

  • android:label:權限名字,顯示給用戶的,值可是一個 string 數據,例如這裏的“自定義權限”。
  • android:description:比 label 更長的對權限的描述。值是通過 resource 文件中獲取的,不能直接寫 string 值,例如這裏的”@string/test”。
  • android:name:權限名字,如果其他 app 引用該權限需要填寫這個名字。
  • android:protectionLevel:權限級別,分爲 4 個級別:
  • ○normal:低風險權限,在安裝的時候,系統會自動授予權限給 application。
  • ○dangerous:高風險權限,系統不會自動授予權限給 app,在用到的時候,會給用戶提示。
  • ○signature:簽名權限,在其他 app 引用聲明的權限的時候,需要保證兩個 app 的簽名一致。這樣系統就會自動授予權限給第三方 app,而不提示給用戶。
  • ○signatureOrSystem:這個權限是引用該權限的 app 需要有和系統同樣的簽名才能授予的權限,一般不推薦使用。

值得注意的是:通過測試發現一種特殊的情況,應用程序可以在程序運行時申請 root 權限,如下圖,在使用 Android Terminal Emulator 時嘗試使用 su 命令切換到 root 用戶。若用戶已通過 hacking 的方式使得 Android 系統獲得了 root 權限,則可以允許該程序以 root 用戶權限執行;反之即算用戶選擇“允許”,也不能使程序以 root 用戶權限執行。

圖 3. Android 用戶權限賦予示意圖

圖 3. Android 用戶權限賦予示意圖

Android 系統對應用程序權限申請的處理方式分析

對 Android 源代碼中的如下文件進行分析:

●InstallAppProgress.java:其路徑爲 \packages\apps\PackageInstaller\src\com\android\packageinstaller\InstallAppProgress.java;

●PackageInstallerActivity.java:其路徑爲 \packages\apps\PackageInstaller\src\com\android\packageinstaller\PackageInstallerActivity.java;

●AppSecurityPermissions.java:其路徑爲 \frameworks\base\core\java\android\widget\AppSecurityPermissions.java

總結得出如下圖所示的 Android 系統對應用程序授權申請的處理流程:

●進入處理應用程序授權申請的入口函數;

●系統從被安裝應用程序的 AndroidManifest.xml 文件中獲取該應用正常運行需申請的權限列表;

●顯示對話框,請求用戶確認是否滿足這些權限需求;

●若同意,則應用程序正常安裝,並被賦予相應的權限;若否定,則應用程序不被安裝。系統僅提供給用戶選擇“是”或者“否”的權利,沒有選擇其中某些權限進行授權的權利。

圖 4. Android 用戶權限賦予示意圖

圖 4. Android 用戶權限賦予示意圖

發佈了0 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章