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