Android 权限模型简史:从安装时全给到用时才问
现在装一个安卓 App,通常是打开之后用到某个功能(比如拍照、定位)才会弹出一次权限请求,拒绝了大概率也不影响其它功能继续用。但这套体验并不是安卓一开始就有的,这篇聊聊权限模型这些年是怎么变过来的。
最早:安装时一次性全部列出
早期安卓(大致到 Android 5.x 那个阶段)的权限机制叫”安装时授权(Install-time permissions)“。App 在自己的清单文件(Manifest)里声明好这次运行需要哪些权限,用户在安装界面会看到一份完整的权限列表,只有两个选择:要么接受全部权限、完成安装,要么直接放弃安装。
这套设计最大的问题是权限粒度太粗、时机太早。用户往往在还没开始用这个 App 之前,就要对一堆听起来敏感、但当下完全不知道具体用途的权限做一次性表态,而且一旦同意,后续没法单独收回某一项——想拒绝通讯录权限,唯一的办法是连这个 App 都不装。这种”要么全给、要么不装”的模式,客观上纵容了不少 App 申请远超实际需要的权限。
Android 6.0 引入运行时权限
Android 6.0(Marshmallow)开始,一部分权限被划入”危险权限(Dangerous permissions)“这个分类——大致是那些涉及用户隐私或者可能影响设备正常使用的能力,比如定位、通讯录、摄像头、麦克风、短信这些。这类权限不再于安装时统一授予,而是改成运行时申请:App 代码执行到真正需要用某项能力的那一刻,才会触发系统弹窗,询问用户是否授权,用户可以针对每一项权限单独同意或拒绝。
同样重要的是,这个决定不是一次性的——用户可以随时在系统设置里,针对已安装的 App 单独打开或关闭某一项已经授予过的权限,不需要卸载重装。
危险权限之外还有一类叫”普通权限(Normal permissions)“,比如访问网络这种不太涉及用户隐私、风险较低的能力,这类权限依然是安装时自动授予,不会弹窗打断用户。运行时申请这套流程,针对的只是被划入危险权限分类的那部分。
后续几个版本的进一步收紧
运行时权限落地之后,后续版本又陆续加了几层细化:
- 一次性权限:用户可以选择”仅本次使用时允许”,App 退到后台之后这项授权就会自动失效,下次再用还得重新申请
- 位置权限拆分为”精确/大致”:用户能选择只给一个大致范围的位置信息,而不是精确坐标
- 照片和视频的部分访问:用户不必把整个相册权限都给出去,可以只选择授权某几张照片,App 拿不到相册里的其它内容
- 后台位置访问单独收紧:App 想在用户不在使用它的时候仍然持续获取位置,需要经过一道额外的、更明确的确认
小结
安卓权限模型的演变方向很一致:从”安装前一次性打包同意、决定了就改不了”,逐渐变成”用到才问、随时可以单独收回、粒度也越来越细”。这个过程本质上是把”这个功能到底需不需要这项权限”的判断权,从开发者一方逐步转移到用户自己手里,也是现在装 App 时体验更细腻、更让人有掌控感的原因。