我已经下载了android源码。我想了解在后端如何验证应用程序的权限。
例如,如果某个应用程序尝试访问“相机”,操作系统如何验证其是否已获得其清单文件中的权限。
更具体地说,我想探索确切的源文件夹。
编辑: 在对代码进行了一些挖掘后,感谢Stephan的解释,我能够在framework / base / data / etc / platform.xml中找到权限列表及其分配的uid或gid。
位置,联系人等似乎已授予shell访问权限。例如:
<assign-permission name="android.permission.READ_CONTACTS" uid="shell" />
这是否意味着,当应用在其清单文件中具有READ_CONTACTS权限时,默认情况下它有权访问?我的意思是在哪里进行验证。
答案 0 :(得分:2)
请看一下这本书的部分答案:Embedded Android
我无法确认我从那本书中得到了正确的答案,但这是我对该书的解释,因为它与你的问题有关。请任何人随时随时纠正我的解释。我不假装肯定知道答案。希望我自己对此权限系统的解释将帮助您找到代码正在执行工作的正确位置,因为我还没有找到该部分。
我相信这些权限都是在Linux文件组id权限级别透明处理的。 Android本质上是一个操作系统,可以使用其他操作系统。
在Android中,当系统摄像头首次安装时,Linux会为其分配自己的用户ID以及自己的主目录,它会被列为服务管理器(不要混淆)更高级别的Android服务,这是完全不同的东西),它还获得一个组ID(一个组ID代表可能多个摄像机的入口点:前置摄像头,后置摄像头和第二个后置摄像头,以防你有3个-D电话)。该组ID(gid)本质上是一个整数,它在安装时从表示摄像机权限的字符串常量中映射出来。
在Linux中,每个应用程序都是一个用户,每个应用程序也是一个目录,而且在Linux中一切都是文件,即使是空目录也是文件,设备是文件,甚至io都可以是文件。
这就是我认为事情有点违反直觉的地方。使用Linux,每个用户应用程序都有自己的空白沙箱,以便运行自己的进程。在Linux中, Binder 使用权限本身来访问相关系统应用程序的句柄并将其与您的应用程序绑定。因此,如果没有系统应用程序的这个句柄以及随附的所有可能的环境变量,您自己的应用程序将无法知道如何在其沙箱之外运行任何内容。这就像编写程序并省略相关的import语句一样。
这就是为什么在Android中,当您遗漏对您正在使用的功能的许可时,系统不会直接告诉您“您没有权限执行此操作”。系统甚至不知道那么多。系统只知道你试图运行它无法找到/访问的东西(无论出于什么原因,它可能只是源文件中的一个错误,因为它知道的所有内容)。因此,大多数时候,当你忘记包含一个权限时,系统会给你一个很大的困惑,就像你曾经说过火星一样。
直到最近,Android开发工具创建者才更好地向我们提供了我们可能忘记包含特定权限的提示。忘记许可是一个容易犯的错误,特别是在初学者中。使用正确的IDE /工具链自动化工具,这是一个永久消失的错误。