Android..PackageManagerService權(quán)限校驗(yàn)

? ? ? ? 在android系統(tǒng)中缩多,應(yīng)用程序如果想操作系統(tǒng)資源,往往都需要去申請(qǐng)權(quán)限。比如:如果想去操作攝像頭第献,那么就需要去申請(qǐng)下面的權(quán)限<uses-permission android:name="andorid.permission.CAMERA">

? ? ? ? 那android系統(tǒng)是怎么去做這個(gè)權(quán)限的校驗(yàn)?zāi)兀吭诹私鈶?yīng)用程序權(quán)限校驗(yàn)之前兔港,先了解每個(gè)應(yīng)用程序權(quán)限數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)庸毫、權(quán)限的解析。我們的應(yīng)用在第一次安裝的時(shí)候衫樊,都是會(huì)經(jīng)過PKMS來解析飒赃,然后在PKMS中會(huì)去保存每個(gè)應(yīng)用需要用的權(quán)限。

? ? ? ? 1科侈、權(quán)限數(shù)據(jù)結(jié)構(gòu)

? ? ? ? 保存權(quán)限的相關(guān)數(shù)據(jù)結(jié)構(gòu)如下圖:

應(yīng)用權(quán)限數(shù)據(jù)結(jié)構(gòu)

? ? ? ? 每個(gè)安裝的應(yīng)用都會(huì)對(duì)應(yīng)一個(gè)變量PackageSettingBase? packageSetting來與之對(duì)應(yīng),而每個(gè)packageSetting都包含一個(gè)變量PermissionsState來記錄這個(gè)應(yīng)用的權(quán)限信息盒揉,而每個(gè)PermissionsState下面都會(huì)有多個(gè)PermissionData,每個(gè)permissionData來對(duì)應(yīng)一個(gè)權(quán)限兑徘,而permissionData下面有一個(gè)permissionState用來直接記錄該權(quán)限是否授權(quán)刚盈、權(quán)限名稱等信息。

? ? ? ? 2挂脑、應(yīng)用權(quán)限的解析

? ? ? ? 應(yīng)用安裝完后藕漱,所有的信息會(huì)保存在data/system/package.xml中欲侮,如下圖

應(yīng)用安裝信息

? ? ? ? 紅色框框tag是權(quán)限信息,這部分會(huì)在PKMS啟動(dòng)的時(shí)候肋联,會(huì)調(diào)用下面的接口來解析對(duì)應(yīng)權(quán)限信息威蕉。readInstallPermissionsLPr(parser,packageSetting.getPermissionsState());這里會(huì)將這個(gè)應(yīng)用所對(duì)應(yīng)的PermissionsState傳遞進(jìn)去。

? ? ? ? readInstallPermissionsLPr這個(gè)接口是在Settings.java中橄仍,接口里面會(huì)去獲取這個(gè)權(quán)限的名稱韧涨,再根據(jù)權(quán)限的名稱向Settings.mPermissions獲取這個(gè)權(quán)限名稱所對(duì)應(yīng)的BasePermission 即是PKMS最前解析到的permission與UID的映射BP列表(android應(yīng)用程序上層權(quán)限與底層linux的用戶組GID都是一一映射的,用來規(guī)定哪些GID的可以進(jìn)行訪問侮繁、操作等虑粥。映射表是在PKMS構(gòu)造函數(shù)里面解析路徑:system/etc/permissions文件所得)

? ? ? ? 在readInstallPermissionsLPr()中最后會(huì)調(diào)用permissionsState.grantInstallPermission(bp) ——>grantPermission()來授權(quán):

授權(quán)代碼

? ? ? ? 這里前后各做了一個(gè)computeGids得到oldGids / newGids,再通過比較得出授權(quán)后GID是否發(fā)生了變化宪哩,如果發(fā)生變化娩贷,那就很明顯這個(gè)權(quán)限是新增的。在這兩個(gè)computeGids有兩個(gè)關(guān)鍵函數(shù)ensurePermissionData()锁孟,permissionData.grant()彬祖,其實(shí)這兩個(gè)接口,前面那個(gè)是根據(jù)權(quán)限的name來獲取到對(duì)應(yīng)的PermissionData品抽,后面那個(gè)接口只是將其下面的變量permission標(biāo)志為授權(quán)而已储笑。

? ? ? ? 3、權(quán)限校驗(yàn)

? ? ? ? 在系統(tǒng)服務(wù)中需要可以到看下面這段代碼mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BIND_DEVICE_ADMIN,null); 參數(shù)是各種各樣的權(quán)限名稱圆恤,這部分是做權(quán)限校驗(yàn)部分

? ?權(quán)限校驗(yàn)流程

? ? ? ? 各個(gè)流程就上圖南蓬,最后會(huì)來到PKMS的checkUidPermission()


權(quán)限校驗(yàn)

? ? ? ? android原生的代碼,權(quán)限校驗(yàn)部分哑了,前面說到每個(gè)安裝的應(yīng)用都會(huì)對(duì)應(yīng)一個(gè)變量PackageSettingBase? packageSetting來與之對(duì)應(yīng)赘方,PackageSettingBase的父類就是SettingBase,所以這里面還是一樣先去獲取這個(gè)應(yīng)用的permissionsState弱左,查看這個(gè)權(quán)限是否授權(quán)窄陡,再返回值,注釋有一個(gè)special case拆火,說明還有例外的情況跳夭。。们镜。

? ? ? ? 另外如果沒有獲取到這個(gè)應(yīng)用的LPr币叹,則會(huì)繼續(xù)去判斷mSystemPermissions,這個(gè)變量跟前面提到的mPermissions是那么一點(diǎn)點(diǎn)聯(lián)系模狭,解析system/etc/permissions的時(shí)候颈抚,<permission name ="android.permission.BLUETOOTH">

<group gid="net-bt"/>

</permission>

? ? ? ? ?上面這部分則會(huì)被解析到mPermisisons中,而tag為<assign-permissino ...>則會(huì)被解析到這個(gè)變量中嚼鹉,mSystemPermissions贩汉,原生的注釋的意思是給開發(fā)者一個(gè)更開放的開發(fā)環(huán)境驱富。比如android開發(fā)人員想要查看surface layout的信息,那么他直接可以adb shell后再運(yùn)行dumpsys SurfaceFlinger匹舞,即可以看到信息褐鸥,這里有一個(gè)權(quán)限<assign-permission? name ="android.permisison.ACCESS_SURFACE_FLIGNER">,這個(gè)權(quán)限是在mSystemPermissions中赐稽,所以開發(fā)人員可以直接利用這個(gè)權(quán)限去調(diào)試叫榕,這是屬于高等權(quán)限之一笛谦。叹哭。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痕寓,一起剝皮案震驚了整個(gè)濱河市蠢莺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌零如,老刑警劉巖躏将,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異考蕾,居然都是意外死亡祸憋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門肖卧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯窥,“玉大人,你說我怎么就攤上這事塞帐±乖” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵葵姥,是天一觀的道長(zhǎng)荷鼠。 經(jīng)常有香客問我,道長(zhǎng)榔幸,這世上最難降的妖魔是什么允乐? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮削咆,結(jié)果婚禮上牍疏,老公的妹妹穿的比我還像新娘。我一直安慰自己拨齐,他們只是感情好鳞陨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞻惋,像睡著了一般炊邦。 火紅的嫁衣襯著肌膚如雪编矾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天馁害,我揣著相機(jī)與錄音窄俏,去河邊找鬼。 笑死碘菜,一個(gè)胖子當(dāng)著我的面吹牛凹蜈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忍啸,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仰坦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了计雌?” 一聲冷哼從身側(cè)響起悄晃,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凿滤,沒想到半個(gè)月后妈橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翁脆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年眷蚓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片反番。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沙热,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罢缸,到底是詐尸還是另有隱情篙贸,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布枫疆,位于F島的核電站歉秫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏养铸。R本人自食惡果不足惜雁芙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钞螟。 院中可真熱鬧兔甘,春花似錦鳞滨、人聲如沸洞焙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澡匪。三九已至熔任,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唁情,已是汗流浹背疑苔。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸鸟,地道東北人惦费。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抢韭,于是被迫代替她去往敵國和親薪贫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容