文档开发者中心
我的

Android 权限 | 四:Android app中的权限是必须先声明后使用吗?

声明权限:是指在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

......

点赞
3
收藏
2
回复
3
分享
举报
浏览7429 发布于2019-08-21 06:43未知归属地
全部评论
最多点赞
最新发布
最早发布
学习
3楼回复于2023-11-28 13:20 未知归属地
学习
2楼回复于2023-08-28 12:03 未知归属地

多谢分享!

1楼回复于2019-08-22 01:12 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。