这个问题之前在How does Android enforce permissions?上被问及过。虽然那里的讨论很好,但该问题仍未得到充分回答。
在开发环境中,当应用程序尝试执行需要在AndroidManifest.xml中未声明的权限时,会抛出异常。那么运行时系统是如何实现运行时检查的呢?
我猜它最可能是在核心框架中完成的,或许需要本地代码支持,但我不知道AOSP中哪些源代码文件与此相关。
这个问题之前在How does Android enforce permissions?上被问及过。虽然那里的讨论很好,但该问题仍未得到充分回答。
在开发环境中,当应用程序尝试执行需要在AndroidManifest.xml中未声明的权限时,会抛出异常。那么运行时系统是如何实现运行时检查的呢?
我猜它最可能是在核心框架中完成的,或许需要本地代码支持,但我不知道AOSP中哪些源代码文件与此相关。
Android在硬件限制方面使用了许多标准的Linux(内核?)机制。
每个应用程序都被分配一个新的唯一(Linux-)用户ID,并且每当应用程序进程被创建时,系统都会使用该用户ID创建它。 除非您删除该应用程序,否则ID将永远不会更改。 这意味着对于访问较低的系统级别,您的应用程序将显示为某个用户,并且与用户一起工作的每个(Linux-)权限系统也将适用于您的应用程序。
如果您在清单中请求WRITE_EXTERNAL_STORAGE
,则您的应用程序还将成为具有写入该存储权限的组(称为sdcard_rw
)的成员。 文件系统上的权限受到强制执行,只允许向system
用户(=所有者)和sdcard_rw
组进行写入,其他任何人(=其他)只能读取。 另请参见Google是否阻止应用程序写入SD卡
通过这样做,Android几乎什么都不需要做,除了在应用程序启动并产生进程时设置正确的UID / GID之外,其余部分都在较低的级别处理。 不是某个组的成员的应用程序将无法访问某些硬件。
权限<>组映射列表:platform.xml
还有一些(Android软件)限制,这些限制基于您的应用程序的签名和/或仅通过查找您的应用程序请求的权限:例如ContextImpl#checkPermission() - 但必须在允许受限制的操作的每个入口点检查这些权限。
不时会有人发现某些缺少此类检查的方式,以便例如程序化地打开GPS。