2

我已经下载了安卓源。我想了解如何在后端验证应用程序的权限。

例如,如果一个应用程序尝试访问相机,操作系统如何验证它是否在其清单文件中获得了权限。

更具体地说,我想探索确切的源文件夹。

编辑:在对代码进行了几次挖掘之后,由于 Stephan 的解释,我能够在 framework/base/data/etc/platform.xml 中找到权限列表及其分配的 uid 或 gid。

位置、联系人等似乎已授予对 shell 的访问权限。例如:

<assign-permission name="android.permission.READ_CONTACTS" uid="shell" />

那么这是否意味着,当应用程序在其清单文件中具有 READ_CONTACTS 权限时,默认情况下它有权这样做?我的意思是在哪里进行验证。

4

1 回答 1

2

看看这本书以获得部分答案:嵌入式 Android

我无法确认我从那本书中得到了正确的答案,但这是我自己对这本书的解释,因为它与你的问题有关。请任何人随时纠正我的解释。我不会假装肯定知道答案。希望我自己对这个权限系统的解释能帮助你找到代码执行工作的正确位置,因为我也没有找到那个部分。

我相信这些权限都是在 Linux 文件组 id 权限级别透明处理的。Android本质上是一个操作系统,它位于另一个操作系统上并使用它。

在 Android 中,当第一次安装系统摄像头时,Linux 会为其分配自己的用户 ID,以及自己的主目录,它会列在称为服务管理器的东西中(不要与更高级别的 Android 服务混淆,后者完全是另外一回事),并且它还获得一个组 id(一个组 id 代表可能多个摄像头的入口点:前置摄像头、后置摄像头和第二个后置摄像头,以防您有 3-D 手机)。该组 id (gid) 本质上是一个在安装时映射出来的整数,来自表示相机权限的字符串常量。

在Linux中,每一个app都是一个用户,每一个app也是一个目录,而且在Linux中一切都是一个文件,即使是一个空目录也是一个文件,一个设备也是一个文件,甚至io也可以是一个文件。

这就是我认为事情变得有点反直觉的地方。在 Linux 中,每个用户应用程序都有自己的空白沙箱,供其运行自己的进程。在 Linux 中, Binder使用权限本身来访问相关系统应用程序的句柄并将其与您的应用程序绑定。因此,如果没有系统应用程序的句柄和所有可能的环境变量,您自己的应用程序根本无法知道如何在其沙箱之外运行任何东西。这就像编写一个程序并省略相关的导入语句。

这就是为什么在 Android 中,当您为正在使用的功能省略权限时,系统不会直接告诉您“您无权执行此操作”。系统甚至不知道那么多。系统只知道你试图运行它无法找到/访问的东西(无论出于何种原因,它可能只是你的源文件中的一个拼写错误)。因此,大多数情况下,当您忘记包含权限时,系统只会让您一脸困惑,就像您对它说火星话一样。

直到最近,Android 开发工具的创建者才更好地向我们提示我们可能忘记了包含特定权限。忘记许可是一个很容易犯的错误,尤其是在初学者中。使用正确的 IDE/工具链自动化工具可以使错误永久消失。

于 2013-11-03T02:42:35.240 回答