android.permission.MODIFY_PHONE_STATE
修改电话状态:开机,MMI等。 不包括打电话
此权限, 只能为系统应用 所获取。 第3方开发应用不能获得此权限
iccOpenLogicalChannel 需要此权限 或者 有运营商权限 (hasCarrierPrivileges)
android.permission.READ_PHONE_STATE
读取电话状态:包括移动网络信息,电话当前的状态
getSubscriberId 需要
1) READ_PRIVILEGED_PHONE_STATE
2) READ_PHONE_STATE
3) hasCarrierPrivileges()
4) 默认的短信应用
5) android.permission.USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER
getSimSerialNumber
1) READ_PRIVILEGED_PHONE_STATE
2) READ_PHONE_STATE
3) hasCarrierPrivileges
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。
Android系统仅会向使用平台密钥进行签名的应用以及特权系统应用授予 READ_PRIVILEGED_PHONE_STATE
权限。
两点要求:
1)app使用平台签名
2) app是特权系统应用(放在 /system/priv-app目录?)
特许权限白名单,以向特权应用授予 READ_PRIVILEGED_PHONE_STATE
权限
如果应用是预加载(预装到系统)的特权应用,则需要获得在 AndroidManifest.xml 中声明的 READ_PRIVILEGED_PHONE_STATE
权限。此外,该应用还需要将此特许权限列入白名单。
特权应用是位于系统映像某个分区上 priv-app
目录下的系统应用。各 Android 版本中,该分区为:
- Android 8.1 及更低版本 –
/system
- Android 9 及更高版本 –
/system, /product, /vendor
/etc/permissions/priv-app
应该实际解析为 partition/etc/permissions/priv-app
早期版本中,设备制造商几乎无法控制可对特权应用授予哪些签名|特许权限。从 Android 8.0 开始,制造商必须在 /etc/permissions
目录下的系统配置 XML 文件中明确授予特许权限。从 Android 9 开始,实现人员必须明确授予或拒绝授予所有特许权限,否则设备将无法启动。
privapp-permissions.xml
文件只有在与特权应用位于同一分区时才能授予或拒绝授予该应用权限。例如,如果 /vendor
分区上的应用请求特许权限,则只能由同样位于 /vendor
上的 privapp-permissions.xml
文件来同意或拒绝该请求。
应用的权限白名单可列在位于 frameworks/base/etc/permissions
目录下的单个或多个 XML 文件中,如下所示:
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
对于如何组织内容,没有严格的规则。设备实现人员可以决定内容结构,只要 /system/priv-app
下的所有应用均列入白名单即可。例如,Google 针对由 Google 开发的所有特权应用提供了一个白名单,并建议使用以下组织方式:
- 对于已包含在 Android 开源项目 (AOSP) 树中的应用,请将其权限列在
/etc/permissions/privapp-permissions-platform.xml
中。 - 对于 Google 应用,请将其权限列在
/etc/permissions/privapp-permissions-google.xml
中。 - 对于其他应用,请使用以下格式的文件:
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
。
https://source.android.com/devices/tech/config/perms-whitelist?hl=zh-cn
public int checkPermission(String permission, int pid, int uid) {
….
am.checkPermission(permission, pid, uid);
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/permission/PermissionManager.java
am.checkPermission(permission, pid, uid);
ActivityManagerService.checkPermission
com.android.server.am.ActivityManagerService
public static int checkComponentPermission(String permission, int uid,
int owningUid, boolean exported) {
….
https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
public int checkPermission(String permName, String pkgName, int userId) {
https://gowa.club/Android/Android%E7%9A%84%E6%9D%83%E9%99%90%E6%A3%80%E6%9F%A5%E8%BF%87%E7%A8%8B.html
https://lishuaiqi.top/2017/07/06/Permission3-checkPermissions/#1-3-checkPermission