Android 三大权限介绍-Android第一次开机App授权弹框-默认授权

提示:Android第一次开机App授权问题

文章目录


前言

MTK平台,刷完固件第一次开机会有App请求授权问题,如何规避授权、默认授权。

最终目的:

  • 默认授权,不让弹框提醒授权
  • 增加、提升体验

一、 需求-屏蔽授权弹框-默认授权

实际问题如下,第一次刷完机、或者恢复出厂设置后,开机会弹出这样的授权弹框

那么第一次开机有很多流程的,不允许弹框让客户去点击的,要做的就是默认授权、去掉弹框提醒。

二、参考资料

Rk-内置应用作为系统Launcher-内置APK-拷贝文件-替换开机动画 内容里面有默认给内置应用授权
Android系统默认输入法-搜狗输入法或者谷歌拼音输入法-运行时授权

MTK平台-去除第一次开机-默认权限提示框

直接来说就是为了解决开机默认这个弹框:

有人会问,这三个弹框和需求弹框不一样呀? 后面给出说明,这里暂不讨论。

三、修改文件

java 复制代码
frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java

四、实现方案

默认授权运行时权限

路径
frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java

如参考资料中给出的之前解决方案,在 grantDefaultPermissions 方法中添加包名即可。

禁止权限预览

路径:frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java

在方法 isPermissionsReviewRequiredInternal 是否预览中直接返回false,不让预览权限。

此权限弹框界面-到底是什么

首先 dumpsys 一下当前ACTIVITY是啥子

java 复制代码
  ACTIVITY com.komect.ajlauncher/com.komect.bussness.guide.GuideActivity a534b13 pid=3586
  ACTIVITY com.android.permissioncontroller/.permission.ui.ReviewPermissionsActivity 92b893 pid=3173
  ACTIVITY com.android.permissioncontroller/.permission.ui.ReviewPermissionsActivity ac6cfe5 pid=3173
  ACTIVITY com.android.permissioncontroller/.permission.ui.ReviewPermissionsActivity 75a8123 pid=3173
  ACTIVITY com.android.permissioncontroller/.permission.ui.ReviewPermissionsActivity f097229 pid=3173
  ACTIVITY com.android.permissioncontroller/.permission.ui.ReviewPermissionsActivity a0c4e6b pid=3173
 
 

查阅资料,简要说明如下:

  • ReviewPermissionsActivity:批量授权确认页(Android12 新 UI),App 首次启动时一次性让用户审阅并授予所有危险权限。

五、Android体系三大权限

MTK Android12 三大权限 Activity 完整对比表说明

我这里整理一张表,分别对应如上界面,这里先整体理解三大权限弹框:

通过整理先搞清楚不同弹框的实际、意义、为什么弹框,然后在针对性的解决各种弹框问题、默认授权等。

对比项 ReviewPermissionsActivity PermissionsAnnouncementActivity GrantPermissionsActivity
核心目的 App 首次启动批量审阅所有危险权限、统一授权 系统开机 / 升级隐私权限政策公告告知 App 运行时单个 / 逐个动态申请权限
是否实际授权 ✅ 是,操作后直接写入权限授予状态 ❌ 否,仅弹窗告知,不修改任何权限 ✅ 是,逐个授予 / 拒绝单项权限
触发主体 系统 AMS/PMS 主动拦截 App 启动触发 系统开机向导 / 系统升级流程主动触发 应用主动调用 requestPermissions() 触发
触发时机 新安装 App 首次启动、清数据后首次启动、系统升级后 App 首启 新机恢复出厂首次开机、系统大版本 OTA 升级后首次进桌面 App 运行中用到相机 / 定位 / 麦克风等时随时触发
作用范围 单个应用所有危险权限组 整机系统全局,对所有 App 生效 单个应用单个权限组
界面按钮 允许全部 / 拒绝全部 知道了 / 同意确认 允许 / 仅使用期间允许 / 拒绝 / 拒绝不再询问
弹窗频次 每个 App终身只弹 1 次(已审阅不再弹) 整机终身只弹 1 次(开机 / 升级仅一次) 可多次弹窗,每次缺权限就弹
是否拦截流程 强拦截,不操作无法进入 App 主页 强拦截,不确认无法进入系统桌面 不拦截 App 主流程,悬浮弹窗询问
Android12 角色 Android12 新增批量权限审阅 UI 原生遗留 + 12 强化的隐私合规公告页 传统经典运行时权限申请 UI
MTK 常用定制点 关闭弹窗、默认全授权、豁免系统 App 不弹窗 直接屏蔽弹窗、修改公告文案、跳过强制确认 默认允许所有单项权限、屏蔽弹窗、静默授权
归属场景 预装 / 第三方 App 首启权限批量管控 系统合规、隐私政策合规弹窗 应用日常动态权限申请

三者底层联系(MTK Android12 统一架构)

  • 三者都隶属于 PermissionController 系统 priv-app,同属于系统权限管理 UI 层;
  • 底层都依赖 PMS / PermissionManagerService 权限管理服务;
  • 流程优先级:PermissionsAnnouncementActivity(开机最先弹)
java 复制代码
→ 进入桌面
→ 打开新 App 触发 ReviewPermissionsActivity(批量授权)
→ App 运行缺权限触发 GrantPermissionsActivity(单项授权)

各自独立作用小结

1. PermissionsAnnouncementActivity

系统全局隐私公告页,纯合规告知,不授权、不干预 App 权限,只做开机首次政策确认,是安卓隐私合规强制页面。

2. ReviewPermissionsActivity

Android12 专属App 批量权限审阅页,系统主动拦截 App 启动,一次性展示该 App 所有高危权限,用户批量同意 / 拒绝,替代旧版逐个弹的模式。

3. GrantPermissionsActivity

传统单项运行时权限弹窗,App 代码主动申请哪个权限,就弹哪个权限的确认框,是日常开发最常见的权限弹窗。

六、思考

如何解决ReviewPermissionsActivity 批量授权弹框

分了两步骤:

  • 默认授权 :frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java

    如参考资料中给出的之前解决方案,在 grantDefaultPermissions 方法中添加包名

  • 不让批量授权弹框显示:禁止权限批量授权预览,frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java

    在方法 isPermissionsReviewRequiredInternal 是否预览中直接返回false,不让预览权限

    禁止批量授权会不会影响授权?

    其实是不会的,本身就有运行时权限动态授权 机制的。 比如新按照的第三方应用或者内置应用,你屏蔽了批量授权也会有动态申请权限的,比如:

针对源码这里暂不分析了,已经知道了弹框的ACTIVITY,源码自行查看研究下。


总结

  • 搞清楚权限弹框是什么:批量授权
  • MTK Android12 以后的一个机制
  • 以前很少遇到,突然遇到了在这里就针对性整理一下,恰好三大弹框-权限相关的知识点联系起来了,意义很大。