跳转至

编译系统与文件系统

第 4 章涵盖了编译系统如何生成文件系统的各个部分。现在让我们深入了解如何控制编译系统的文件系统生成。

构建模板和文件位置

表 4-2 列出了可用的构建模板。表 6-8 详细说明了使用每个目标构建模板构建的模块的默认安装位置。注意所有内容如何被安装到 /system 的某个子目录中。

表 6-8. 构建模板及对应的输出位置

模板 默认输出位置
BUILD_EXECUTABLE /system/bin
BUILD_JAVA_LIBRARY /system/framework
BUILD_SHARED_LIBRARY /system/lib
BUILD_PREBUILT 无默认值。请确保明确指定 LOCAL_MODULE_CLASS 或 LOCAL_MODULE_PATH
BUILD_MULTI_PREBUILT 取决于被复制模块的类型
BUILD_PACKAGE /system/app
BUILD_KEY_CHAR_MAP /system/usr/keychars

内部地,编译系统为每个构建的模块生成一个 LOCAL_MODULE_PATH,取决于模块的构建模板。这就是编译产物的安装位置。你可以通过在 Android.mk 中更改 LOCAL_MODULE_PATH 的值来覆盖默认值。

显式复制文件

在某些文件的情况下,你不需要编译系统以任何方式构建它们,只需要它将文件复制到它生成的文件系统组件中。这就是 PRODUCT_COPY_FILES 宏的用途,你可以在产品的 .mk 文件中使用它。

默认权限和所有权

我们尚未讨论的一个方面是:Android 文件系统中每个目录和文件的文件系统权限和所有权是如何分配和的。如果你愿意动手,我强烈建议你看看 system/core/include/private/android_filesystem_config.h 文件。它没有受到太多关注,也没有在任何地方有文档。但它非常重要,因为它提供了预定义系统用户列表,以及系统中所有内容的权限和所有权定义。

默认用户

android_filesystem_config.h 定义了 AID_ROOT、AID_SYSTEM、AID_RADIO 等预定义 UID/GID。例如:

#define AID_ROOT             0  /* traditional unix root user */
#define AID_SYSTEM        1000  /* system server */
#define AID_RADIO         1001  /* telephony subsystem, RIL */
#define AID_BLUETOOTH     1002  /* bluetooth subsystem */
#define AID_GRAPHICS      1003  /* graphics devices */
#define AID_INPUT         1004  /* input devices */
...
#define AID_SHELL         2000  /* adb and debug shell user */
#define AID_CACHE         2001  /* cache access */
#define AID_APP          10000 /* first app user */

每个应用安装时都被分配一个单独的用户 ID(从 10000 开始),因此应用用户名称都以 app_ 开头,后跟一个匹配实际分配给应用的 UID/GID 减 10000 的整数值。