如何做到Android權(quán)限的實現(xiàn)
Android權(quán)限目前分為三種:正常權(quán)限、危險權(quán)限、特殊權(quán)限。本文主要講述了Android權(quán)限的實現(xiàn)。
1.權(quán)限
每個程序在安裝時都有建立一個系統(tǒng)ID,如app_15,用以保護數(shù)據(jù)不被其它應用獲取。Android根據(jù)不同的用戶和組,分配不同權(quán)限,比如訪問SD卡,訪問網(wǎng)絡等等。底層映射為Linux權(quán)限。
2.應用申請權(quán)限
1)應用開發(fā)者通過AndroidManifest.xml中指定對應權(quán)限,再映射到底層的用戶和組,默認情況下不設(shè)定特殊的權(quán)限。AndroidManifest加入權(quán)限后系統(tǒng)安裝程序時會在圖形界面中提示權(quán)限
2)如果是缺少某個權(quán)限(程序中使用的某種權(quán)限而在AndroidManifest.xml中并未聲名),程序運行時會在logcat中打印出錯誤信息requires
3)與某個進程使用相同的用戶ID
應用程序可與系統(tǒng)中已存在的用戶使用同一權(quán)限,需要在AndroidManifest.xml中設(shè)置sharedUserId,如android:sharedUserId="android.uid.shared",作用是獲得系統(tǒng)權(quán)限,但是這樣的程序?qū)傩灾荒茉赽uild整個系統(tǒng)時放進去(就是系統(tǒng)軟件)才起作用,共享ID的程序必須是同一簽名的
3.Android權(quán)限的實現(xiàn)
1)第一層:由應用設(shè)置,修改AndroidManifest.xml,形如:
2)第二層:框架層,權(quán)限對應組,frameworks/base/data/etc/platform.xml,形如:
3)第三層:系統(tǒng)層,系統(tǒng)的權(quán)限,
system/core/include/private/android_filesystem_config.h,形如:
#define AID_INET 3003 建立SOCKET的權(quán)限
……
{ “inet”, AID_INET, },
4.系統(tǒng)權(quán)限
1)特殊權(quán)限的用戶
a)system uid 1000
b)radio uid 1001
2)查看可用系統(tǒng)的權(quán)限
$ adb shell
# pm list permissions
5.framework層對權(quán)限的判斷
1)相關(guān)源碼實現(xiàn)
frameworks/base/services/java/com/android/server/PackageManagerService.java frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
2)在系統(tǒng)層,如何查看某個應用的權(quán)限
a)在應用進程開啟時,ActivityManagerService.java會在logcat中輸出該應用的權(quán)限,形如:
I/ActivityManager(1730): Start proc com.anbdroid.phone for restart com.android.phone:pid=2605 uid=1000 gids={3002,3001,3003}
即它有3001,3002,3003三個權(quán)限:訪問藍牙和建立socket
b)注意:此打印輸出在應用第一次啟動時。如果進程已存在,需要先把對應進程殺掉,以保證該進程重新啟動,才能顯示
c)具體實現(xiàn),見:
framewors/base/services/java/com/android/server/am/ActivityManagerService.java的函數(shù)startProcessLocked(),其中取其組信息的具本語句是
mContext.getPackageManager().getPackageGids(app.info.packageName);