Android 6.0 引入的运行时权限机制解决了什么问题?
解读
面试官问的是“解决了什么问题”,而不是“机制怎么实现”。国内项目普遍要适配 6.0 以下机型,又要过华为、小米、OPPO、vivo 等厂商的合规检测,因此回答必须突出“用户痛点→系统风险→商业后果”这一条逻辑链,并点明国内特有的合规与分发场景。
知识点
- 旧模型(install-time permission)(1)一次授权终身有效,用户安装时只能“全同意”或“放弃安装”;(2)应用商店与渠道包无法做二次拦截;(3)恶意 SDK 滥用敏感权限,后台偷偷录音、发短信、读取通讯录,导致用户投诉、工信部下架。
- 新模型(runtime permission,API 23+)(1)把权限分为 NORMAL、SIGNATURE、DANGEROUS 三类,仅 DANGEROUS 需动态申请;(2)采用“用时才问”与“可撤销”策略,用户可在设置里随时关闭;(3)系统提供 shouldShowRequestPermissionRationale 回调,支持开发者做友好引导;(4)targetSdkVersion<23 的兼容模式:仍按旧模型走,但国内主流市场强制 targetSdkVersion≥26,因此 6.0 机制事实上成为准入红线。
- 国内落地差异(1)小米、华为、魅族等 ROM 在系统层增加“后台定位”“后台弹出界面”等扩展权限,需额外适配;(2)工信部 164 号文要求“最小必要原则”,若首次启动即申请通讯录、定位且无业务场景,应用商店会直接驳回;(3)第三方 SDK(推送、统计、分享)若私自插入权限,会被华为应用市场扫描工具报“隐私违规”,导致下架。
答案
Android 6.0 之前,应用在安装时一次性获取所有敏感权限,用户无法单独关闭,造成三大问题:
① 体验差:用户因“权限恐惧症”放弃安装,拉新转化率低;
② 风险高:恶意应用利用短信、录音、定位等权限在后台偷偷上传数据,用户隐私泄露事件频发;
③ 合规难:国内应用商店与工信部对“强制索权”零容忍,旧模型应用无法过审。
运行时权限机制把敏感权限延后到“真正使用时”动态申请,用户可逐项授权、随时撤销,系统还提供二次引导与拒绝计数策略。这样既把选择权还给用户,降低卸载率,又满足国内隐私合规与商店检测要求,从根本上解决了“安装即授权”带来的安全与商业双重隐患。
拓展思考
-
如果用户永久拒绝(Deny & don’t ask again),业务链路如何降级?
答案:通过 shouldShowRequestPermissionRationale 判断是否为“永久拒绝”,弹出自定义落地页解释功能影响,并提供跳转到系统设置的手动开启入口,同时准备无权限的降级方案(如手动选择城市代替定位)。 -
国内 ROM 的“后台定位”权限与 Android 10 后台定位分离有何区别?
答案:国产 ROM 把“后台定位”做成独立开关,不受系统“仅使用期间允许”选项控制,需在代码中再申请 Manifest.permission.ACCESS_BACKGROUND_LOCATION,并在华为、小米后台权限白名单里登记,否则息屏 5 分钟后仍会被系统强制停止定位。 -
针对 targetSdkVersion≥30 的“精确位置”与“模糊位置”新策略,如何兼容 6.0 运行时模型?
答案:在 Android 12 及以上,先申请 ACCESS_FINE_LOCATION,若用户只给模糊位置,则通过 LocationManager.getCurrentLocation(PRIORITY_BALANCED_POWER_ACCURACY) 获取粗略坐标,同时把业务逻辑拆成“高精度场景”(导航)与“低精度场景”(天气),实现权限最小化。