1. 權限html
每一個程序在安裝時都有創建一個系統ID,如app_15,用以保護數據不被其它應用獲取。Android根據不一樣的用戶和組,分配不一樣權限,好比訪問SD卡,訪問網絡等等。底層映射爲Linux權限。java
2. 應用申請權限android
1) 應用開發者經過AndroidManifest.xml中<uses-permission>指定對應權限,再映射到底層的用戶和組,默認狀況下不設定特殊的權限。AndroidManifest加入權限後系統安裝程序時會在圖形界面中提示權限shell
2)若是是缺乏某個權限(程序中使用的某種權限而在AndroidManifest.xml中並未聲名),程序運行時會在logcat中打印出錯誤信息requires <permission>網絡
3)與某個進程使用相同的用戶ID應用程序可與系統中已存在的用戶使用同一權限,須要在AndroidManifest.xml中設置sharedUserId,如android:sharedUserId="android.uid.shared",做用是得到系統權限,可是這樣的程序屬性只能在build整個系統時放進去(就是系統軟件)才起做用,共享ID的程序必須是同一簽名的app
3. Android權限的實現框架
1)第一層:由應用設置,修改AndroidManifest.xml,形如:socket
<uses-permission android:name=」android.permission.INTERNET」/>函數
2)第二層:框架層,權限對應組,frameworks/base/data/etc/platform.xml,形如:ui
<permission name=」android.permission.INTERNET」>
<group gid=inet」 />
</permission>
3)第三層:系統層,系統的權限,system/core/include/private/android_filesystem_config.h,形如:
#define AID_INET 3003 創建SOCKET的權限
……
{ 「inet」, AID_INET, },
4. 系統權限
1) 特殊權限的用戶
a)system uid 1000
b)radio uid 1001
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);
6. 參考
http://wenku.baidu.com/view/7754a4360b4c2e3f5727634e.html
轉自:http://blog.csdn.net/xieyan0811/article/details/6083019