1、Android权限模型概述:从Linux内核到Android应用层的权限体系演进
大家好,我是你们的讲师。今天咱们聊聊Android权限模型。说实话,这个题目看着挺大,但说白了就是一件事——谁,能干什么,在什么时候。
我刚开始做Android系统开发那会儿,权限这块儿真是踩了不少坑。有一次,一个第三方应用明明只申请了存储权限,结果偷偷读了我的通讯录。嗯,那时候我就意识到,权限模型不是纸上谈兵,它直接关系到用户的安全感。
1.1 Linux内核层的权限基础
Android底层跑的是Linux内核。所以,最基础的权限控制,其实是Linux那一套。
Linux的权限模型,核心就是用户、组、其他。每个文件都有读、写、执行三个权限位。你想想看,一个文件属主是root,那普通用户想删它?没门。
我记得在项目里排查过一个诡异问题:某个系统服务老是报"Permission denied"。查了半天,发现是SELinux策略没配好。嗯,这里要注意,Linux内核层的权限,不仅仅是传统的DAC(自主访问控制),还有SELinux这种MAC(强制访问控制)。
核心要点:Linux内核权限是Android安全体系的基石。没有它,上层的一切都是空中楼阁。
1.2 Android应用层的权限演进
Android在Linux之上,又搞了一套自己的权限体系。为什么?因为Linux的权限模型太粗糙了。一个App想用摄像头,难道要给它root权限?显然不行。
Android的权限模型,经历了几个阶段:
- Android 1.0 - 4.4:安装时授权。你装App的时候,它会列出一堆权限,你只能全盘接受。说白了,就是"要么全给,要么别装"。
- Android 6.0(API 23):运行时权限。这是个大变革。App可以在运行时弹窗问你"允许我访问相机吗?"你可以拒绝。我在项目中遇到过,很多老App没适配这个,直接崩溃。
- Android 10:分区存储。App不能随便读你的照片了,只能访问自己创建的文件。嗯,这个改动让很多文件管理器类App直接废了。
- Android 11:一次性权限。你可以让App"仅本次"使用麦克风。下次再用,还得问你。
- Android 13:细粒度媒体权限。以前一个"读取媒体文件"权限就能看所有照片,现在分成了"读取图片"、"读取视频"、"读取音频"三个。
个人经验:我建议你在做App开发时,尽量用最新的权限模型。别偷懒用旧API,否则在Android 14上可能直接闪退。
1.3 权限的分类与分级
Android把权限分成了几类,每一类的授权方式都不一样:
| 权限等级 | 授权方式 | 举例 |
|---|---|---|
| Normal(普通) | 自动授予 | INTERNET、ACCESS_NETWORK_STATE |
| Dangerous(危险) | 运行时弹窗 | CAMERA、READ_CONTACTS |
| Signature(签名) | 同签名自动授予 | BIND_ACCESSIBILITY_SERVICE |
| Privileged(特权) | 系统预置 | INSTALL_PACKAGES |
你可能会问:为什么INTERNET是普通权限?因为如果每个App联网都要弹窗,用户会疯掉的。Android团队在设计时,考虑了用户体验和安全的平衡。
避坑指南:我曾经在做一个系统App时,声明了INSTALL_PACKAGES权限,结果在非系统App上死活不生效。后来才发现,这个权限只有系统签名App才能用。嗯,这个坑我替你们踩过了。
1.4 权限的底层实现机制
权限在底层是怎么工作的?说白了,就是Binder通信时的安全检查。
当一个App调用系统服务(比如打开相机),系统服务会检查调用方的UID和PID。然后查一下这个UID有没有申请CAMERA权限。如果没有,直接返回"Permission Denied"。
我记得有一次调试一个权限问题,发现App明明申请了权限,但系统服务还是拒绝。查了半天,原来是App的UID被篡改了。嗯,这个案例告诉我们,权限检查不能只看UID,还要看签名。
// 系统服务中的权限检查示例
public void openCamera() {
// 检查调用方是否有CAMERA权限
if (checkCallingPermission(Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("需要相机权限");
}
// 执行打开相机的操作
...
}
1.5 权限模型的演进趋势
从Android的发展来看,权限模型越来越严格。我个人觉得,这是好事。用户越来越重视隐私,Google也在不断收紧权限。
未来的趋势是什么?我猜是更细粒度、更透明。比如,App想读取你的位置,系统可以只给一个"大概位置",而不是精确到米。或者,App在后台读取位置时,系统会通知你。
嗯,这里要提醒一下:如果你在做系统开发,一定要关注每个Android版本的权限变更。否则,你的App可能在下一个版本就废了。
总结一下:Android权限模型从Linux内核的粗粒度控制,演进到应用层的细粒度运行时授权。每一步都是为了在用户体验和安全之间找到平衡。作为开发者,理解这个演进过程,能帮你写出更安全、更兼容的代码。
好,这一章就到这里。下一章我们会深入分析权限的申请流程,看看从App发起请求到系统最终授权,中间到底发生了什么。到时候我会带大家看源码,嗯,那才是真正有意思的部分。