Android权限管理--权限类型
目錄
1.普通權限(normal)
2.運行時權限(dangerous)
3.簽名權限(signature)
4.特殊權限(privileged)
查看android權限的等級
判斷應用是否擁有對應權限
?Android 將權限分為不同的類型,包括安裝時權限、運行時權限和特殊權限。每種權限類型都指明了當系統授予應用該權限后,應用可以訪問的受限數據范圍以及應用可以執行的受限操作范圍。
1.普通權限(normal)
此類權限允許訪問超出應用沙盒的數據和執行超出應用沙盒的操作。但這些數據和操作對用戶隱私及對其他應用的操作帶來的風險非常小。
2.運行時權限(dangerous)
運行時權限也稱為危險權限,此類權限授予應用對受限數據的額外訪問權限,并允許應用執行對系統和其他應用具有更嚴重影響的受限操作。因此需要先在應用中請求運行時權限,然后才能訪問受限數據或執行受限操作。當應用請求運行時權限時,系統會顯示運行時權限彈窗提示。
3.簽名權限(signature)
當應用聲明了其他應用已定義的簽名權限時,如果兩個應用使用同一證書進行簽名,系統會在安裝時向前者授予該權限。否則,系統無法向前者授予該權限。(注意:有些簽名權限不適合第三方應用使用。)
該權限只需要在manifest中聲明使用,同時應用和這類權限定義者擁有一樣的簽名系統就會默認授予應用這類權限;系統授予這類權限后應用無需像運行時權限一樣動態申請。
4.特殊權限(privileged)
特殊權限與特定的應用操作相對應。只有平臺和原始設備制造商 (OEM) 可以定義特殊權限。此外,如果平臺和 OEM 想要防止有人執行功能特別強大的操作(例如通過其他應用繪圖),通常會定義特殊權限。系統設置中的特殊應用訪問權限頁面包含一組用戶可切換的操作。其中的許多操作都以特殊權限的形式實現。每項特殊權限都有自己的實現細節。系統會為特殊權限分配“appop”保護級別。
該權限只需要在manifest中聲明使用,同時擁有系統簽名且不是預置到 **/priv_app/ (如:system/priv-app)目錄下,系統就會默認授予;如果應用是預置到 **/priv_app/ 目錄下則需要在配置文件privapp-permissions-platform.xml中配置權限信息,否則系統不會授予權限,并且也會無法通過cts測試
查看android權限的等級
在系統源碼中找到文件 /frameworks/base/core/res/AndroidManifest.xml ,這個文件中定義了系統權限等信息。
如 WRITE_MEDIA_STORAGE權限 具體如下:
權限名稱:android.permission.WRITE_MEDIA_STORAGE
權限等級為:signature|privileged (該權限既是signature也是privileged權限)
<!-- @SystemApi @TestApi Allows an application to write to internal media storage@hide --> <permission android:name="android.permission.WRITE_MEDIA_STORAGE"android:protectionLevel="signature|privileged" />如 READ_CONTACTS權限 具體如下:
權限名稱:android.permission.READ_CONTACTS
權限等級為:dangerous (該權限為運行時權限,也就是需要應用去動態申請)
<!-- Allows an application to read the user's contacts data.<p>Protection level: dangerous --> <permission android:name="android.permission.READ_CONTACTS"android:permissionGroup="android.permission-group.UNDEFINED"android:label="@string/permlab_readContacts"android:description="@string/permdesc_readContacts"android:protectionLevel="dangerous" />同時,也可以如下adb命令來獲取權限等級
adb shell dumpsys package permision |grep -i prot
判斷應用是否擁有對應權限
使用如下命令查看 adb shell dumpsys package com.miui.home
下面的install permissions記錄的是該應用擁有的普通權限以及簽名權限的信息,如果應用申請的權限被系統授予了,在對應權限后面就會顯示 granted=true
相反,如果沒有搜到相關權限的字符串,說明該應用沒有聲明使用這個權限
C:\Users\Administrator>adb shell dumpsys package com.miui.home Activity Resolver Table: ... ... ... ... Packages:Package [com.miui.home] (41dff44):userId=10089pkg=Package{724982d com.miui.home} install permissions:android.permission.REAL_GET_TASKS: granted=truecom.android.settings.permission.CLOUD_SETTINGS_PROVIDER: granted=trueandroid.permission.WRITE_SETTINGS: granted=truemiui.autoinstall.config.permission.AUTOINSTALL: granted=trueandroid.permission.SET_PROCESS_LIMIT: granted=trueandroid.permission.MODIFY_AUDIO_SETTINGS: granted=truemiui.os.permisson.INIT_MIUI_ENVIRONMENT: granted=trueandroid.miui.permission.SHELL: granted=trueandroid.permission.SYSTEM_ALERT_WINDOW: granted=true為什么應用在manifest中申請了signature權限或者privileged權限,但是還報錯沒有權限錯誤
1.對于signature權限,先判斷應用是否擁有平臺簽名。可以通過dump命令來判斷,執行 adb shell dumpsys package 包名 |findstr -i signatures 和adb shell dumpsys package android | findstr signatures,對比兩者的簽名是否一致。
2.對于privileged權限,先判斷應用的預置路徑。是否預置到.../priv-app/路徑下(獲取通過包信息查看應用的flag是否帶有privileged),如果是就把/system/etc/permissions/的配置文件pull出來,配置文件為:privapp-permissions-platform.xml,查看自己的應用是否在這兩個文件里面配置了,如果沒有配置則需要在代碼中進行配置。(可以將修改的文件push到/system/etc/permissions/目錄,然后重啟手機驗證是否生效)
總結
以上是生活随笔為你收集整理的Android权限管理--权限类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA---FX
- 下一篇: Android 动态权限申请