编译系统与文件系统¶
第 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 的整数值。