1.權限
每個程序在安裝時都有建立一個系統ID,如app_15,用以保護數據不被其它應用獲取。Android根據不同的用戶和組,分配不同權限,比如訪問SD卡,訪問網絡等等。底層映射爲Linux權限。
2. 應用申請權限
1)應用開發者通過AndroidManifest.xml中<uses-permission>指定對應權限,再映射到底層的用戶和組,默認情況下不設定特殊的權限。AndroidManifest加入權限後系統安裝程序時會在圖形界面中提示權限
2) 如果是缺少某個權限(程序中使用的某種權限而在AndroidManifest.xml中並未聲名),程序運行時會在logcat中打印出錯誤信息requires <permission>
3) 與某個進程使用相同的用戶ID
應用程序可與系統中已存在的用戶使用同一權限,需要在AndroidManifest.xml中設置sharedUserId,如android:sharedUserId="android.uid.system ",作用是獲得系統權限,
但是這樣的程序屬性只能在build整個系統時放進去(就是系統軟件)才起作用,共享ID的程序必須是同一簽名的
4)關於應用程序共用權限的問題,在PackageManagerService.java中有相關的配置
PackageManagerService(){
mSettings.addSharedUserLPw("android.uid.system",
Process.SYSTEM_UID, ApplicationInfo.FLAG_SYSTEM);
mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID, ApplicationInfo.FLAG_SYSTEM,
new int[] {UID_NET_RAW, UID_QCOM_DIAG, UID_NET_ADMIN});
……
}
比如:看到PhoneApp 的AndroidManifest.xml中
android:sharedUserId="android.uid.phone" 使PhoneApp具有radio權限
在訪問RIL時會進行此權限檢測
3. Android權限的實現
1)第一層:由應用設置,修改AndroidManifest.xml,形如:
<uses-permission android:name=”android.permission.INTERNET”/>
2)第二層:框架層,權限對應組,frameworks/base/data/etc/platform.xml,形如:
<permission name=”android.permission.INTERNET”>
<group gid=inet” />
</permission>
3)第三層:系統層,系統的權限,
system/core/include/private/android_filesystem_config.h,形如:
#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_INET 3003 //建立SOCKET的權限
……
static const struct android_id_info android_ids[] = {
{ "radio", AID_RADIO, },
{ “inet”, AID_INET, },
……
4.系統權限
1) 特殊權限的用戶
#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 */
……
2) 查看可用系統的權限
$ adb shell
# pm list permissions
5. framework層對權限的判斷
1)相關源碼實現
frameworks/base/services/java/com/android/server/PackageManagerService.java
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
2)在系統層,如何查看某個應用的權限
a)在應用進程開啓時,ActivityManagerService.java會在logcat中輸出該應用的權限,形如:
I/ActivityManager(1730): Start proc com.anbdroid.phone for restart com.android.phone:pid=2605 uid=1000 gids={3002,3001,3003}
即它有3001,3002,3003三個權限:訪問藍牙和建立socket
b)注意:此打印輸出在應用第一次啓動時。如果進程已存在,需要先把對應進程殺掉,以保證該進程重新啓動,才能顯示
c)具體實現,見:
framewors/base/services/java/com/android/server/am/ActivityManagerService.java
的函數startProcessLocked(),其中取其組信息的具本語句是
mContext.getPackageManager().getPackageGids(app.info.packageName);
From:http://blog.csdn.net/xieyan0811/article/details/6083019?reload