秋霞步兵区国产精品,国产精品视频二区第二页,亚洲aⅴ欧美综合一区二区三区,亚洲日韩欧美一区二区不卡

      1. <small id="x8tpb"></small>
        <address id="x8tpb"></address>

        新疆信息港歡迎您!

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

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

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

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

        簡介

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

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

        應(yīng)用層

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

        1. 5.x以前

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

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

        2. 6.x以后

        READ_CONTACTS是運行時權(quán)限。

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

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

        通過checkSelfPermission()檢查權(quán)限,通過requestPermissions()請求權(quán)限。

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

        系統(tǒng)層

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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