我想知道我是否可以使用系统应用程序获得 root 权限来执行命令。
在这段代码中:
getApplicationInfo().uid
在文档中,我可以读到uid是分配给此应用程序的内核用户 ID;目前这不是唯一的 ID(多个应用程序可以有相同的 uid)。
但这是如何分配的?
还有分配给系统应用的uid,是不是比普通应用有更多的权限来执行命令?
我想知道我是否可以使用系统应用程序获得 root 权限来执行命令。
在这段代码中:
getApplicationInfo().uid
在文档中,我可以读到uid是分配给此应用程序的内核用户 ID;目前这不是唯一的 ID(多个应用程序可以有相同的 uid)。
但这是如何分配的?
还有分配给系统应用的uid,是不是比普通应用有更多的权限来执行命令?
出于所有实际目的,您的应用程序的进程永远不会以 uid=0 或 root 身份执行,因为在您编写的单行代码执行之前,它已不可逆转地更改为普通用户 ID。
当人们制作“root”应用程序时,他们并没有将应用程序进程本身改回root——这根本不可能。相反,他们正在执行一个以 root 身份运行的新辅助进程。在 java 级别下,这最终是通过在设置了 setuid 位的文件上调用 exec() 系列函数来完成的。该文件可能是帮助程序本身,或者更常见的是“root shim”,例如被破解的“su”,它反过来以 root 身份运行指定的帮助程序。这样的帮助程序几乎总是原生代码,并且可能没有在 Android 框架中注册以能够利用 Android 级功能。
系统应用程序也不以 root 身份运行。他们拥有第三方应用程序所没有的是特殊的 Android 级别权限,这会导致以 root 或其他特权用户 ID 身份运行的平台服务代表他们获得特权。一些 android 权限还可以授予具有特殊访问权限的用户组的成员资格——其中一些可用于第三方应用程序(例如 Internet 权限),而有些则不能。
基本上,(我没有深入研究关于 uid 的整个 Linux 解释。如果您有兴趣,可以很容易地找到它)。android中的uid由2个参数组成:
公式是这样的:
uid = app_id+100,000 * user_id
app_id 基本上是一个随机数(不是真正随机的,但因设备而异),分配给每个应用程序,并且在运行 JellyBean 的平板电脑上使用的 user_id 是为设备上的每个用户分配的(用户被分配一个数字启动用户 0 ,用户 1,...用户 n - 对于设备上定义的每个新用户)。
应用程序可以共享一个 ID,如下所述:http: //developer.android.com/guide/topics/manifest/manifest-element.html
当然,一个应用程序不能为两个不同的用户拥有相同的 uid,但同一个应用程序可以与同一用户拥有的另一个应用程序具有相同的 uid。
运行的系统应用程序是唯一可以实际访问其他用户可能无法访问的服务的应用程序。它们位于 /system 下的设备上。为了编写系统应用程序,您需要从 Google 下载 AOSP,并使用包含的应用程序自行编译。