Av中文字幕乱码免费看,日本免费大黄在线观看,影音先锋中文字幕亚洲资源站,99免费在线观看精品视频

        
        
      1. 新疆信息港歡迎您!

        新疆信息港
        新疆信息港 > 資訊 >安卓系統(tǒng)權(quán)限檢查機(jī)制,存儲(chǔ)位置,數(shù)據(jù)結(jié)構(gòu)

        安卓系統(tǒng)權(quán)限檢查機(jī)制,存儲(chǔ)位置,數(shù)據(jù)結(jié)構(gòu)

        2020-03-29 11:58:44
        來(lái)源:互聯(lián)網(wǎng)
        閱讀:-

        簡(jiǎn)介Android系統(tǒng)越來(lái)越安全的同時(shí),系統(tǒng)也越來(lái)越復(fù)雜。5.x以前(包括5.x)應(yīng)用程序需要的權(quán)限,寫(xiě)入AndroidManifest.xml配置文件,即可。從6.0開(kāi)始出現(xiàn)了運(yùn)行時(shí)權(quán)限檢查的概念,運(yùn)行時(shí)權(quán)限要在代碼里面去主動(dòng)申請(qǐng)。...

        簡(jiǎn)介

        Android系統(tǒng)越來(lái)越安全的同時(shí),系統(tǒng)也越來(lái)越復(fù)雜。5.x以前(包括5.x)應(yīng)用程序需要的權(quán)限,寫(xiě)入AndroidManifest.xml配置文件,即可。從6.0開(kāi)始出現(xiàn)了運(yùn)行時(shí)權(quán)限檢查的概念,運(yùn)行時(shí)權(quán)限要在代碼里面去主動(dòng)申請(qǐng)。

        從此,Android系統(tǒng)的權(quán)限分為安裝權(quán)限(install permission)和運(yùn)行時(shí)權(quán)限(runtime permission)。安裝權(quán)限在AndroidManifest.xml清單文件中進(jìn)行配置。運(yùn)行時(shí)權(quán)限需要在代碼里面動(dòng)態(tài)申請(qǐng)。

        應(yīng)用層

        舉個(gè)例子:我要做個(gè)通訊錄/電話本。通訊錄需要讀取系統(tǒng)的聯(lián)系人信息,然后進(jìn)行顯示。Android系統(tǒng)要求:讀取系統(tǒng)聯(lián)系人信息,必須要申請(qǐng)READ_CONTACTS權(quán)限。在用戶授權(quán)之后,才可以去讀取聯(lián)系人信息。我們分別看一下5.x以前和6.x以后,是怎樣申請(qǐng)權(quán)限的?

        1. 5.x以前

        在5.x(包括5.x)以前,只需要在應(yīng)用程序的AndroidManifest.xml文件,加入上面這句,就可以了。

        用戶在安裝這個(gè)應(yīng)用程序的時(shí)候,會(huì)在安裝界面上顯示,應(yīng)用程序申請(qǐng)的權(quán)限,用戶可以進(jìn)行權(quán)限管理,然后開(kāi)始安裝。應(yīng)用程序在運(yùn)行的時(shí)候,有讀取聯(lián)系人的權(quán)限就可以運(yùn)行成功,否則就會(huì)失敗,開(kāi)發(fā)者不能在運(yùn)行階段去申請(qǐng)權(quán)限。

        2. 6.x以后

        READ_CONTACTS是運(yùn)行時(shí)權(quán)限。

        這是Google官網(wǎng),發(fā)布Android 6.0的時(shí)候,對(duì)版本新特性的介紹。

        主要從用戶和開(kāi)發(fā)者的角度來(lái)對(duì)運(yùn)行時(shí)權(quán)限進(jìn)行介紹。用戶可以在應(yīng)用程序運(yùn)行的時(shí)候,管理應(yīng)用權(quán)限,對(duì)權(quán)限進(jìn)行授權(quán)或撤銷。用戶可以更好的了解和控制權(quán)限。同時(shí),為應(yīng)用開(kāi)發(fā)者精簡(jiǎn)了安裝和自動(dòng)更新過(guò)程。

        通過(guò)checkSelfPermission()檢查權(quán)限,通過(guò)requestPermissions()請(qǐng)求權(quán)限。

        首先檢查,本應(yīng)用是否已經(jīng)獲得了讀取通訊錄的權(quán)限。如果沒(méi)有獲得權(quán)限,就去主動(dòng)申請(qǐng)權(quán)限。系統(tǒng)會(huì)回調(diào)onRequestPermissionsResult()方法,來(lái)通知應(yīng)用程序用戶是否授權(quán)。

        系統(tǒng)層

        本節(jié)從系統(tǒng)源碼的角度,去看一下下層的設(shè)計(jì)和實(shí)現(xiàn)邏輯。

        我們先看看checkSelfPermission()的實(shí)現(xiàn)邏輯。

        Frameworks/base/core/java/android/app/ContextImpl.java

        Frameworks/base/core/java/android/app/ActivityManagerNative.java

        Binder IPC,下面會(huì)調(diào)用到AMS里面去。

        Frameworks/base/services/core/java/com/android/server/ActivityManagerService.java

        Frameworks/base/core/java/android/app/ActivityManager.java

        這里又一次進(jìn)行Binder通訊,調(diào)用到PMS。

        Frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

        permissionsState里面存儲(chǔ)著從packages.xml讀取的系統(tǒng)授權(quán)信息,通過(guò)調(diào)用hasPermission()獲取uid是否有permName的授權(quán)。

        Android系統(tǒng)授權(quán)信息

        授權(quán)數(shù)據(jù)是保存在文件里面/data/system/packages.xml。程序運(yùn)行過(guò)程中存儲(chǔ)授權(quán)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)在下面的類:

        frameworks/base/services/core/java/com/android/server/pm/PermissionsState.java

        PermissionsState的內(nèi)部類PermissionState。一個(gè)三個(gè)變量mFlags暫不清楚有啥作用,mName存儲(chǔ)權(quán)限的名字,mGranted標(biāo)示這個(gè)權(quán)限是否被授權(quán)。這里是最小的數(shù)據(jù)單元。

        PermissionData也是PermissionsState的內(nèi)部類,用來(lái)存儲(chǔ)所有uid的某一權(quán)限的授權(quán)數(shù)據(jù)。這里用到一個(gè)數(shù)據(jù)結(jié)構(gòu)SparseArray,也是用來(lái)存儲(chǔ)key-value,不過(guò)key只能是int或long。這是一個(gè)雙數(shù)組結(jié)構(gòu),一個(gè)數(shù)組用來(lái)存儲(chǔ)key,一個(gè)數(shù)組用來(lái)存儲(chǔ)value,通過(guò)兩個(gè)數(shù)組的下標(biāo)進(jìn)行key-value的對(duì)應(yīng)。

        PermissonsState類里面的ArrayMap的數(shù)據(jù)結(jié)構(gòu)存放著系統(tǒng)所有的權(quán)限數(shù)據(jù)。ArrayMap是一個(gè)特殊實(shí)現(xiàn)的哈希表,存放的也是key-value。每一個(gè)權(quán)限,對(duì)應(yīng)一個(gè)PermissionData。

        總結(jié)一下,授權(quán)數(shù)據(jù)存放涉及到的數(shù)據(jù)結(jié)構(gòu),就是上面這三個(gè)截圖。mPermissions是一個(gè)特殊的哈希表,里面存放著系統(tǒng)所有的授權(quán)數(shù)據(jù),每個(gè)權(quán)限對(duì)應(yīng)一個(gè)PermissionData。mUserStates是一個(gè)雙數(shù)組,存放的也是key-value,存放uid和對(duì)應(yīng)的授權(quán)數(shù)據(jù),uid對(duì)應(yīng)一個(gè)PermissionState。PermissionState是一個(gè)元數(shù)據(jù)類,存放一個(gè)權(quán)限的授權(quán)狀態(tài)。

        推薦閱讀:聯(lián)想p720手機(jī)

        免責(zé)聲明:本文僅代表企業(yè)觀點(diǎn),與新疆信息港無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
        熱門圖片
        熱門搜索