在安装Android应用程序时,如何确定应用程序的UID?

8
以下链接提供了关于安装android应用程序包的简要说明。

http://java.dzone.com/articles/depth-android-package-manager

我想知道应用程序的UID如何在安装过程中基于其清单文件中存在的权限来确定。

此外,还有一个platform.xml(4.0 ICS源代码目录下的/frameworks/base/data/etc)文件,其中包含一组权限和与之相关联的GID列表。描述如下:

以下标记将低级组ID与权限名称相关联。通过指定这样的映射,您正在表明任何被授予给定权限的应用程序进程也将运行具有附加到其进程的给定组ID,以便它可以执行允许该组进行的任何文件系统(读取、写入、执行)操作。

类似地,还有一个指定给特定uid的高级别权限列表。

我的问题是:当使用权限X、Y、Z安装应用程序时,它的访问权限如何指定?是从platform.xml的映射中获取的吗?

另外,每次运行应用程序时,映射是否会立即发生(这不符合Android最初的设计,因为应用程序权限不能更改,除非进行更新)。因此,如果是这种情况,它在哪里存储,表示该应用程序应以某种访问权限或某个uid运行。

希望我的问题表述清楚了。如果您需要更多信息,请告诉我。我只是想了解Android操作系统内部工作的更多信息。

谢谢


问题中的链接已经失效,我认为这是实际链接:https://dzone.com/articles/depth-android-package-manager - S Raghav
是的,该链接中提到了一个步骤“确定应用程序的UID”。那么这个步骤发生的代码在哪里?也就是说,如何为给定的包分配UID? - windchime
2个回答

9
应用程序的UID不取决于请求权限的集合。通常情况下,在安装期间,PackageManager从[FIRST_APPLICATION_UID; LAST_APPLICATION_UID]集中为应用程序分配唯一的UID(实际上,随着多用户支持的引入,这个过程已经略微改变)。

Android系统为每个Android应用程序分配一个唯一的用户ID(UID),并作为该用户在单独的进程中运行。

您所谈论的是基于权限分配给应用程序的有限的GID(组ID)集合。例如,为了限制应用程序对网络接口的访问,已经向Linux内核添加了一个特殊的补丁,只允许进程创建网络套接字,如果此进程具有特殊硬编码的GID。因此,在安装应用程序时,如果用户接受"android.permission.INTERNET"权限,则PackageManager会将一个特殊的GID分配给该应用程序(基于platform.xml文件中的值)。在启动此应用程序时,该应用程序的进程被设置为相应的GID。因此,应用程序的进程获得了创建套接字的权限。
其他权限在Android框架级别上执行。

1
非常感谢,现在更有意义了。那么一旦gid被分配给一个应用程序,它们会被存储在任何地方以便在调用应用程序时更快地检索吗?还是根据应用程序在其清单文件中拥有的权限再次动态计算?我只是试图弄清楚在调用应用程序时gid映射到哪里。再次感谢Yury。 - Adi GuN
2
据我记得,PackageManager 中有一个缓存,用于存储关于 gids 的信息。因此,当调用时,这些信息会从缓存中获取,并用于为 Zygote 进程设置 gid。 - Yury

0

应用程序请求的权限仅影响应用程序的GID,而不影响UID。您可能会对检查本文中的所有uid和gid内容感兴趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接