如何做到Android權(quán)限的實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
Android權(quán)限目前分為三種:正常權(quán)限、危險(xiǎn)權(quán)限、特殊權(quán)限。本文主要講述了Android權(quán)限的實(shí)現(xiàn)。
1.權(quán)限
每個(gè)程序在安裝時(shí)都有建立一個(gè)系統(tǒng)ID,如app_15,用以保護(hù)數(shù)據(jù)不被其它應(yīng)用獲取。Android根據(jù)不同的用戶和組,分配不同權(quán)限,比如訪問(wèn)SD卡,訪問(wèn)網(wǎng)絡(luò)等等。底層映射為L(zhǎng)inux權(quán)限。
2.應(yīng)用申請(qǐng)權(quán)限
1)應(yīng)用開(kāi)發(fā)者通過(guò)AndroidManifest.xml中指定對(duì)應(yīng)權(quán)限,再映射到底層的用戶和組,默認(rèn)情況下不設(shè)定特殊的權(quán)限。AndroidManifest加入權(quán)限后系統(tǒng)安裝程序時(shí)會(huì)在圖形界面中提示權(quán)限
2)如果是缺少某個(gè)權(quán)限(程序中使用的某種權(quán)限而在AndroidManifest.xml中并未聲名),程序運(yùn)行時(shí)會(huì)在logcat中打印出錯(cuò)誤信息requires
3)與某個(gè)進(jìn)程使用相同的用戶ID
應(yīng)用程序可與系統(tǒng)中已存在的用戶使用同一權(quán)限,需要在AndroidManifest.xml中設(shè)置sharedUserId,如android:sharedUserId="android.uid.shared",作用是獲得系統(tǒng)權(quán)限,但是這樣的程序?qū)傩灾荒茉赽uild整個(gè)系統(tǒng)時(shí)放進(jìn)去(就是系統(tǒng)軟件)才起作用,共享ID的程序必須是同一簽名的
3.Android權(quán)限的實(shí)現(xiàn)
1)第一層:由應(yīng)用設(shè)置,修改AndroidManifest.xml,形如:
2)第二層:框架層,權(quán)限對(duì)應(yīng)組,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層對(duì)權(quán)限的判斷
1)相關(guān)源碼實(shí)現(xiàn)
frameworks/base/services/java/com/android/server/PackageManagerService.java frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
2)在系統(tǒng)層,如何查看某個(gè)應(yīng)用的權(quán)限
a)在應(yīng)用進(jìn)程開(kāi)啟時(shí),ActivityManagerService.java會(huì)在logcat中輸出該應(yīng)用的權(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三個(gè)權(quán)限:訪問(wèn)藍(lán)牙和建立socket
b)注意:此打印輸出在應(yīng)用第一次啟動(dòng)時(shí)。如果進(jìn)程已存在,需要先把對(duì)應(yīng)進(jìn)程殺掉,以保證該進(jìn)程重新啟動(dòng),才能顯示
c)具體實(shí)現(xiàn),見(jiàn):
framewors/base/services/java/com/android/server/am/ActivityManagerService.java的函數(shù)startProcessLocked(),其中取其組信息的具本語(yǔ)句是
mContext.getPackageManager().getPackageGids(app.info.packageName);