Объектам и службам файловой системы, добавляемым в сборку, часто требуются отдельные уникальные идентификаторы, известные как идентификаторы Android (AID). В настоящее время многие ресурсы, такие как файлы и службы, без необходимости используют основные (определяемые Android) AID; во многих случаях вместо этого можно использовать OEM (определенные OEM) AID.
 Более ранние версии Android (Android 7.x и ниже) расширили механизм AID, используя файл android_filesystem_config.h для конкретного устройства, чтобы указать возможности файловой системы и/или пользовательские OEM AID. Однако эта система была неинтуитивной, поскольку не поддерживала использование красивых имен для OEM AID, требуя от вас указывать необработанные числовые значения для полей пользователя и группы без возможности связать понятное имя с числовым AID.
Более новые версии Android (Android 8.0 и выше) поддерживают новый метод расширения возможностей файловой системы. Этот новый метод поддерживает следующее:
- Несколько исходных расположений для файлов конфигурации (позволяет расширять конфигурации сборки).
- Проверка правильности значений OEM AID во время сборки.
- Генерация пользовательского заголовка OEM AID, который можно использовать в исходных файлах по мере необходимости.
- Ассоциация понятного имени с фактическим значением OEM AID. Поддерживает нечисловые строковые аргументы для пользователя и группы, т.е. "foo" вместо "2901".
 Дополнительные улучшения включают удаление массива android_ids[] из system/core/libcutils/include/private/android_filesystem_config.h . Этот массив теперь существует в Bionic как полностью частный сгенерированный массив с доступом через getpwnam() и getgrnam() . (Это имеет побочный эффект создания стабильных двоичных файлов по мере изменения основных AID.) Инструментарий и файл README с более подробной информацией см. в build/make/tools/fs_config .
Добавление идентификаторов Android (AID)
 Android 8.0 удалил массив android_ids[] из Android Open Source Project (AOSP). Вместо этого все имена, удобные для AID, генерируются из файла заголовка system/core/libcutils/include/private/android_filesystem_config.h при создании массива Bionic android_ids[] . Любое define , соответствующее AID_* , подхватывается инструментом, и * становится именем в нижнем регистре.
 Например, в private/android_filesystem_config.h :
#define AID_SYSTEM 1000
Становится:
- Понятное имя: система
- ид: 1000
- гид: 1000
 Чтобы добавить новый AID ядра AOSP, просто добавьте #define в заголовочный файл android_filesystem_config.h . AID будет сгенерирован при сборке и доступен для интерфейсов, использующих пользовательские и групповые аргументы. Инструментарий проверяет, что новый AID не находится в диапазонах APP или OEM; он также учитывает изменения в этих диапазонах и должен автоматически перенастраиваться при изменении или новых диапазонах, зарезервированных OEM.
Настройка AID
 Чтобы включить новый механизм AID, установите TARGET_FS_CONFIG_GEN в файле BoardConfig.mk . Эта переменная содержит список файлов конфигурации, что позволяет добавлять файлы по мере необходимости.
 По соглашению файлы конфигурации используют имя config.fs , но на практике вы можете использовать любое имя. Файлы config.fs имеют формат Python ConfigParser ini и включают раздел заглавных букв (для настройки возможностей файловой системы) и раздел AID (для настройки OEM AID).
Настройка раздела шапки
Раздел caps поддерживает настройку возможностей файловой системы для объектов файловой системы в сборке (сама файловая система также должна поддерживать эту функциональность).
 Поскольку запуск стабильной службы с правами root в Android приводит к сбою набора тестов совместимости (CTS) , предыдущие требования к сохранению возможности при запуске процесса или службы включали настройку возможностей, а затем использование setuid / setgid для правильного запуска AID. С заглавными буквами вы можете пропустить эти требования, и ядро сделает это за вас. Когда управление передается main() , ваш процесс уже имеет необходимые ему возможности, поэтому ваша служба может использовать пользователя и группу без полномочий root (это предпочтительный способ запуска привилегированных служб).
Раздел заглавных букв использует следующий синтаксис:
| Раздел | Стоимость | Определение | 
|---|---|---|
| [path] | Путь файловой системы для настройки. Путь, оканчивающийся на /, считается каталогом, иначе это файл. Ошибка указывать несколько разделов с одним и тем же [path]в разных файлах. В версиях Python <= 3.2 один и тот же файл может содержать разделы, переопределяющие предыдущий раздел; в Python 3.2 установлен строгий режим. | |
| mode | Восьмеричный файловый режим | Действительный восьмеричный режим файла не менее 3 цифр. Если указано 3, перед ним стоит 0, в противном случае режим используется как есть. | 
| user | AID_<пользователь> | Либо defineC для действительного AID, либо понятное имя (например, допустимы иAID_RADIO, иradio). Чтобы определить собственный AID, см. раздел «Настройка AID» . | 
| group | AID_<группа> | То же, что пользователь. | 
| caps | шапка* | Имя, объявленное в bionic/libc/kernel/uapi/linux/capability.hбезCAP_. Допускается смешанный случай. Шапки также могут быть необработанными:
 | 
Пример использования см. в разделе Использование возможностей файловой системы .
Настройка раздела AID
Раздел AID содержит OEM AID и использует следующий синтаксис:
| Раздел | Стоимость | Определение | 
|---|---|---|
| [AID_<name>] | <name>может содержать символы в установленном верхнем регистре, цифры и символы подчеркивания. Версия в нижнем регистре используется в качестве понятного имени. Сгенерированный файл заголовка для включения кода использует точныйAID_<name>.Ошибка указывать несколько разделов с одним и тем же AID_<name>(без учета регистра с теми же ограничениями, что и[path]).<name>должно начинаться с имени раздела, чтобы оно не конфликтовало с другими источниками. | |
| value | <число> | Допустимая числовая строка стиля C (шестнадцатеричная, восьмеричная, двоичная и десятичная). Указание нескольких разделов с одним и тем же параметром значения является ошибкой. Значения параметров должны быть указаны в диапазоне, соответствующем разделу, используемому в <name>. Список допустимых разделов и соответствующих им диапазонов определен вsystem/core/libcutils/include/private/android_filesystem_config.h. Варианты:
 | 
Примеры использования см. в разделах Определение имен OEM AID и Использование OEM AID .
Примеры использования
В следующих примерах подробно описано, как определить и использовать OEM AID и как включить возможности файловой системы. Имена OEM AID ( [ имя AID_ ] ) должны начинаться с имени раздела, например « vendor_ », чтобы гарантировать, что они не конфликтуют с будущими именами AOSP или другими разделами.
Определение имен OEM AID
 Чтобы определить OEM AID, создайте файл config.fs и задайте значение AID. Например, в device/x/y/config.fs установите следующее:
[AID_VENDOR_FOO] value: 2900
 После создания файла установите переменную TARGET_FS_CONFIG_GEN и укажите на нее в BoardConfig.mk . Например, в device/x/y/BoardConfig.mk установите следующее:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Ваш пользовательский AID теперь может использоваться системой в целом при новой сборке.
Использование OEM AID
 Чтобы использовать OEM AID, в свой код C oemaids_headers в связанный с ним файл Makefile и добавьте #include "generated_oem_aid.h" , а затем начните использовать объявленные идентификаторы. Например, в my_file.c добавьте следующее:
#include "generated_oem_aid.h"
…
If (ipc->uid == AID_VENDOR_FOO) {
  // Do something
...
 В связанный файл Android.bp добавьте следующее:
header_libs: ["oemaids_headers"],
 Если вы используете файл Android.mk , добавьте следующее:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Использование понятных имен
В Android 9 вы можете использовать понятное имя для любого интерфейса, который поддерживает имена AID. Например:
-  В команде chownвsome/init.rc:chown vendor_foo /vendor/some/vendor_foo/file 
-  В serviceвsome/init.rc:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
 Поскольку внутреннее сопоставление понятного имени с uid выполняется с помощью /vendor/etc/passwd и /vendor/etc/group , раздел поставщика должен быть смонтирован.
Ассоциирование дружественных имен
Android 9 включает поддержку связывания понятного имени с фактическим значением OEM AID. Вы можете использовать нечисловые строковые аргументы для пользователя и группы, т.е. " vendor_foo " вместо "2901".
Преобразование из AID в понятные имена
 Для OEM AID в Android 8.x требовалось использование oem_#### с getpwnam и подобными функциями, а также в местах, которые обрабатывают поиск через getpwnam (например, сценарии init ). В Android 9 вы можете использовать друзей getpwnam и getgrnam в Bionic для преобразования идентификаторов Android (AID) в понятные имена и наоборот.
Использование возможностей файловой системы
 Чтобы включить возможности файловой системы, создайте раздел caps в файле config.fs . Например, в device/x/y/config.fs добавьте следующий раздел:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
 После создания файла установите TARGET_FS_CONFIG_GEN , чтобы он указывал на этот файл в BoardConfig.mk . Например, в device/x/y/BoardConfig.mk установите следующее:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
 Когда сервис vendor_ foo выполняется, он запускается с возможностями CAP_SYS_ADMIN и CAP_SYS_NICE без вызовов setuid и setgid . Кроме того, политике SELinux службы vendor_ foo больше не нужны возможности setuid и setgid , и ее можно удалить.
Настройка переопределений (Android 6.x-7.x)
 Android 6.0 переместил fs_config и определения связанных структур ( system/core/include/private/android_filesystem_config.h ) в system/core/libcutils/fs_config.c где они могли быть обновлены или переопределены двоичными файлами, установленными в /system/etc/fs_config_dirs и /system/etc/fs_config_files . Использование отдельных правил сопоставления и синтаксического анализа для каталогов и файлов (которые могут использовать дополнительные выражения glob) позволило Android обрабатывать каталоги и файлы в двух разных таблицах. Определения структуры в system/core/libcutils/fs_config.c не только позволяли читать каталоги и файлы во время выполнения, но хост мог использовать те же файлы во время сборки для создания образов файловой системы, как ${OUT}/system/etc/fs_config_dirs и ${OUT}/system/etc/fs_config_files .
Хотя метод переопределения расширения файловой системы был заменен модульной системой конфигурации, представленной в Android 8.0, при желании вы все равно можете использовать старый метод. В следующих разделах подробно описано, как создавать и включать файлы переопределения и настраивать файловую систему.
Создание файлов переопределения
 Вы можете сгенерировать выровненные двоичные файлы /system/etc/fs_config_dirs и /system/etc/fs_config_files с помощью инструмента fs_config_generate в build/tools/fs_config . Инструмент использует библиотечную функцию libcutils ( fs_config_generate() ) для управления требованиями DAC в буфере и определяет правила для включаемого файла для институционализации правил DAC.
 Для использования создайте включаемый файл в device/ vendor / device /android_filesystem_config.h , который действует как переопределение. Файл должен использовать формат structure fs_path_config , определенный в system/core/include/private/android_filesystem_config.h со следующими инициализациями структуры для символов каталогов и файлов:
-  Для каталогов используйте android _device _dirs[].
-  Для файлов используйте android _device _files[].
 Если вы не используете android_device_dirs[] и android_device_files[] , вы можете определить NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS и NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (см. пример ниже). Вы также можете указать файл переопределения, используя TARGET_ANDROID_FILESYSTEM_CONFIG_H в конфигурации платы с android_filesystem_config.h .
Включая файлы переопределения
 Чтобы включить файлы, убедитесь, что PRODUCT_PACKAGES включает fs_config_dirs и/или fs_config_files , чтобы их можно было установить в /system/etc/fs_config_dirs и /system/etc/fs_config_files соответственно. Система сборки ищет пользовательский android_filesystem_config.h в $(TARGET_DEVICE_DIR) , где существует BoardConfig.mk . Если этот файл существует в другом месте, установите переменную конфигурации платы TARGET_ANDROID_FILESYSTEM_CONFIG_H , чтобы она указывала на это место.
Настройка файловой системы
Чтобы настроить файловую систему в Android 6.0 и выше:
-  Создайте файл $(TARGET_DEVICE_DIR)/android_filesystem_config.h.
-  Добавьте fs_config_dirsи/илиfs_config_filesвPRODUCT_PACKAGESв файле конфигурации платы (например,$(TARGET_DEVICE_DIR)/device.mk).
Пример переопределения
 В этом примере показано исправление для переопределения демона system/bin/glgps для добавления поддержки блокировки пробуждения в каталоге device/ vendor / device . Имейте в виду следующее:
-  Каждая запись структуры — это режим, uid, gid, возможности и имя. system/core/include/private/android_filesystem_config.hвключается автоматически для предоставления манифеста #define (AID_ROOT,AID_SHELL,CAP_BLOCK_SUSPEND).
-  Раздел android_device_files[]включает действие для подавления доступа кsystem/etc/fs_config_dirs, если оно не указано, что служит дополнительной защитой DAC от отсутствия содержимого для переопределения каталога. Однако это слабая защита; если кто-то контролирует/system, он обычно может делать все, что захочет.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h
new file mode 100644
index 0000000..874195f
--- /dev/null
+++ b/android_filesystem_config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/* This file is used to define the properties of the filesystem
+** images generated by build tools (eg: mkbootfs) and
+** by the device side of adb.
+*/
+
+#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+/* static const struct fs_path_config android_device_dirs[] = { }; */
+
+/* Rules for files.
+** These rules are applied based on "first match", so they
+** should start with the most specific path and work their
+** way up to the root. Prefixes ending in * denotes wildcard
+** and will allow partial matches.
+*/
+static const struct fs_path_config android_device_files[] = {
+  { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND),
"system/bin/glgps" },
+#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+  { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" },
+#endif
+};
diff --git a/device.mk b/device.mk
index 0c71d21..235c1a7 100644
--- a/device.mk
+++ b/device.mk
@@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \
     libwpa_client \
     hostapd \
     wpa_supplicant \
-    wpa_supplicant.conf
+    wpa_supplicant.conf \
+    fs_config_files
 ifeq ($(TARGET_PREBUILT_KERNEL),)
 ifeq ($(USE_SVELTE_KERNEL), true)
Миграция файловых систем из более ранних выпусков
При переносе файловых систем с Android 5.x и более ранних версий помните, что Android 6.x
- Удаляет некоторые включения, структуры и встроенные определения.
-  Требуется ссылка на libcutilsвместо прямого запуска изsystem/core/include/private/android_filesystem_config.h. Частные исполняемые файлы производителя устройства, которые зависят отsystem/code/include/private_filesystem_config.hдля структур файлов или каталогов илиfs_configдолжны добавлять зависимости библиотекиlibcutils.
-  Требуется, чтобы копии system/core/include/private/android_filesystem_config.hс дополнительным содержимым существующих целей были перемещены вdevice/ vendor / device /android_filesystem_config.h.
-  Оставляет за собой право применять обязательное управление доступом (MAC) SELinux к файлам конфигурации в целевой системе, реализации, включающие настраиваемые целевые исполняемые файлы с использованием fs_config(), должны обеспечивать доступ.
