赞
踩
动态运行时权限的检测流程分析:(Android 6.0开始就有了危险权限)
Android 9.0 对于权限处理和6.0的有较大区别。
在6.0中,申请了权限组中当中的某个组的子权限,比如申请写入外部存储空间的权限,系统同时会授予读外部存储空间的权限。
Android 9.0:如果只申请了权限组中的某个子权限,就只会授予该权限的使用,该权限组的其他子权限在使用的时候需要额外的去申请。
运行时权限涉及安全校验。【开发中很少涉及】
关于哪些是危险权限,实际请以Android Developer 官网资料为准。
权限组 | 子权限 |
SMS 短信 | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH |
STORAGE 存储卡 | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
CONTACTS 联系人 | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
PHONE 手机 | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG |
CALENDAR日历 | READ_CALENDAR WRITE_CALENDAR |
CAMERA 相机 | CAMERA |
LOCATION 位置 | ACCESS_FINE_LOCATION ACCESS_COASE_LOCATION |
BODY_SENSORS | BODY_SENSORS |
MICROPHONE 麦克风 | RECORD_AUDIO |
1. uid 与 pid:
uid:本身是linux权限系统中用以区分用户身份的标识。android是单一用户权限系统,uid在android里可以理解为应用的标识Id,该Id自安装之日起就被分配,始终不变,除非重新安装。
pid:进程唯一标识id,用以和远程服务交互。
2. appId与callerId:
appId: 可理解为应用Id,和uid一样。是本地应用在远程服务中的叫法。
callerId: 是服务请求者的身份Id,可以是本地应用的身份id,可以是远程服务的身份标识id。
Android Hidden API是经过修改的jar文件,它将
android.jar
Android SDK中的和framework.jar
真实设备中的结合在一起。这个jar可以在开发中使用Android的内部/隐藏API。什么是Android内部和隐藏API? 内部API位于
com.android.internal
包中,可framework.jar
从真实的Android设备在文件中找到,而隐藏的API位于android.jar
具有@hide javadoc属性的文件中。尽管类和方法是public
您无法直接访问的。您可以从此软件包中使用许多的方法和资源。假定这是一个API,并将其称为隐藏API。有什么好处? 当您想在项目中使用类似的函数时,无需创建新的类,常量,方法或资源。例如,如果您要创建一个
String
包含“接受”一词的新资源。然后,您想为另一种语言(例如阿拉伯语,印度尼西亚语)创建新的翻译,即使世界上所有语言也是如此。这太累了,浪费时间。您为什么不使用com.android.internal.R.string.accept
通过检索的内容InternalAccessor.getString("accept")
?
(以28为示例)
替换后新建一个项目改动如下
1. checkSelfPermission:
跳到了context里面,这里是抽象方法,众所周知,context类的实现类是ContextImpl,所以跳转到该类去查看本方法的实现。【关于context的理解可以看源码】
直接拿到了ActivityManager的实例【AMS家族~可能说法不准确,好像
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。