声明权限:是指在AndroidManifest.xml中使用了<permission>;
使用权限:是指在AndroidManifest.xml中使用了<uses-permission>;
获得权限(或赋予权限):是指真正的可以通过系统的权限检查,调用到权限保护的方法。
场景:App A 中声明了权限 PermissionA,App B 中使用了权限 PermissionA。那么App A 必须比App B 先安装,App B 才能获取到权限吗?
答案是不一定,要看具体情况而定。这个具体情况就是权限的保护级别。
情况一:PermissionA的保护级别是normal或者dangerous
App B先安装,App A后安装,此时App B没有获取到PermissionA的权限。即此种情况下,权限必须先声明再使用。即使App A和App B是相同的签名。
情况二:PermissionA的保护级别是signature或者signatureOrSystem
App B先安装,App A后安装,如果App A和App B是相同的签名,那么App B可以获取到PermissionA的权限。如果App A和App B的签名不同,则App B获取不到PermissionA权限。即对于相同签名的app来说,不论安装先后,只要是声明了权限,请求该权限的app就会获得该权限。
这也说明了对于具有相同签名的系统app来说,安装过程不会考虑权限依赖的情况。安装系统app时,按照某个顺序(例如名字排序,目录位置排序等)安装即可,等所有app安装完了,所有使用权限的app都会获得权限。
验证某个app是否获得了某个权限的方法:
可以用下面2个命令来验证:
adb shell dumpsys package permission <权限名>
adb shell dumpsys package <包名>
其中,
adb shell dumpsys package permission <权限名> 可以查看某个权限是谁声明的,谁使用了。
adb shell dumpsys package <包名> 可以看到某个app是否获得了某个权限。
命令一:adb shell dumpsys package permission <权限名>
Permissions:
Permission [android.permission.WRITE_EXTERNAL_STORAGE] (adf259f):
sourcePackage=android //权限的声明者
uid=1000 gids=null type=1 prot=dangerous //保护级别为dangers
perm=Permission{af0aa25 android.permission.WRITE_EXTERNAL_STORAGE}
packageSetting=PackageSetting{ae479a1 android/1000}
Packages:
Package [com.huawei.camera] (ad8a4b1): //权限的使用者
userId=10123
pkg=Package{b01e3c5 com.huawei.camera}
codePath=/hw_product/app/HwCamera2
......
declared permissions:
requested permissions:
android.permission.WRITE_EXTERNAL_STORAGE: restricted=true
install permissions:
......
命令二:adb shell dumpsys package <包名>
Packages:
Package [com.sina.weibo] (aeaf3b9):
userId=10166
pkg=Package{b096ac2 com.sina.weibo}
......
declared permissions:
com.sina.weibo.push.permission.MESSAGE: prot=signature, INSTALLED
.....
requested permissions:
android.permission.ACCESS_WIFI_STATE
android.permission.WRITE_SETTINGS
android.permission.ACCESS_NETWORK_STATE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.READ_LOGS
......
install permissions:
android.permission.USE_CREDENTIALS: granted=true
android.permission.MODIFY_AUDIO_SETTINGS: granted=true
android.permission.MANAGE_ACCOUNTS: granted=true
android.permission.CHANGE_NETWORK_STATE: granted=true
android.permission.FOREGROUND_SERVICE: granted=true
android.permission.WRITE_SYNC_SETTINGS: granted=true
......





































苏公安网备 32011402010933号