Dateisystemobjekte und -dienste, die dem Build hinzugefügt werden, müssen häufig separat eindeutige IDs, auch als Android-IDs (AIDs) bezeichnet. Derzeit sind viele Ressourcen wie Dateien und Dienste verwenden unnötige (Android-definierte) AIDs. in vielen können Sie stattdessen OEM-definierte AIDs verwenden.
Bei früheren Versionen von Android (Android 7.x und niedriger) wurden die AIDs verlängert.
Mechanismus mit einem gerätespezifischen android_filesystem_config.h
-Datei zur Angabe von Dateisystemfunktionen und/oder benutzerdefinierten OEM-AIDs. Diese
war wenig intuitiv, da es keine schönen Namen für OEM-AIIDs unterstützt.
Sie müssen die numerischen Rohwerte für Nutzer- und Gruppenfelder ohne
um einen Anzeigenamen mit der numerischen AID zu verknüpfen.
Neuere Versionen von Android (Android 8.0 und höher) unterstützen eine neue Methode zur Erweiterung der Dateisystemfunktionen. Diese neue Methode unterstützt die Folgendes:
- Mehrere Quellspeicherorte für Konfigurationsdateien (ermöglicht erweiterbare Anzeigen) Build-Konfigurationen).
- Integritätsprüfung von OEM-AID-Werten während der Build-Erstellung.
- Generierung eines benutzerdefinierten OEM-AID-Headers, der in Quelldateien als erforderlich.
- Verknüpfung eines Anzeigenamens mit dem tatsächlichen OEM-AID-Wert. Wird unterstützt Nicht numerische Zeichenfolgenargumente für Nutzer und Gruppe, z.B. „foo“ anstelle von „2901“.
Zu den weiteren Verbesserungen gehört die Entfernung der android_ids[]
Array von
system/core/libcutils/include/private/android_filesystem_config.h
. Dieses
Das Array ist jetzt in Bionic als vollständig privat generiertes Array vorhanden, wobei
Zugriffsmethoden mit getpwnam()
und getgrnam()
. (Dies hat
der Nebeneffekt der Erzeugung stabiler Binärprogramme, da Kern-AIDs modifiziert werden.) Für
und eine README-Datei mit weiteren Details finden Sie
build/make/tools/fs_config
Android-IDs (AIDs) hinzufügen
Unter Android 8.0 wurde das Array android_ids[]
vom Android-
Open-Source-Projekt (AOSP): Alle AID-freundlichen Namen werden stattdessen aus
system/core/libcutils/include/private/android_filesystem_config.h
Headerdatei beim Generieren des android_ids[]
-Arrays von Bionic. Beliebig
define
, die mit AID_*
übereinstimmen, werden von den Tools übernommen
und * wird kleingeschrieben.
Beispiel in private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Wird zu:
- Anzeigename: system
- UID: 1000
- gid: 1000
Fügen Sie zum Hinzufügen einer neuen AOSP-Core-AID einfach #define
zum
android_filesystem_config.h
-Headerdatei. Die AID lautet
die beim Build generiert und für Schnittstellen zur Verfügung gestellt werden, die Nutzer- und Gruppennutzer
Argumente. Das Tool prüft, ob sich die neue AID nicht in der APP oder dem OEM befindet.
Bereiche Änderungen an diesen Bereichen
berücksichtigt werden und sollte automatisch
bei Änderungen oder neuen vom OEM reservierten Bereichen neu konfigurieren.
AIDs konfigurieren
Um den neuen AIDs-Mechanismus zu aktivieren, lege TARGET_FS_CONFIG_GEN
im
BoardConfig.mk
-Datei. Diese Variable enthält eine Liste der
Dateien, sodass Sie sie bei Bedarf anhängen können.
Konventionsgemäß verwenden Konfigurationsdateien den Namen config.fs
, aber in
können Sie jeden beliebigen Namen verwenden. config.fs
Dateien sind im
Python
ConfigParser-INI-Format und fügen Sie einen Cap-Abschnitt ein (zum Konfigurieren der Datei)
Systemfunktionen) und einen AIDs-Abschnitt (zur Konfiguration von OEM-AIDs).
Bereich für Obergrenzen konfigurieren
<ph type="x-smartling-placeholder">Der Bereich Caps unterstützt die Datei Systemfunktionen für Dateisystemobjekte innerhalb des Builds (das Dateisystem muss diese Funktion ebenfalls unterstützen).
Da ein stabiler Dienst als Root in Android ausgeführt wird,
Kompatibilitätstest-Suite (Compatibility Test Suite, CTS)
Fehler, frühere Anforderungen zum Beibehalten einer Funktionalität beim Ausführen eines
Prozess oder Dienst umfasste die Einrichtung
von Ressourcen und
setuid
/setgid
mit einer geeigneten AID verknüpfen. Mit großgeschriebenen Buchstaben
können Sie diese Anforderungen überspringen
und den Kernel für Sie erledigen lassen. Wenn die Steuerungsoption aktiviert ist:
main()
übergeben hat, verfügt Ihr Prozess bereits über die Funktionen, die er
damit Ihr Dienst einen Nutzer und eine Gruppe ohne Root-Berechtigung verwenden kann (dies ist die bevorzugte
zum Starten privilegierter Dienste).
Der Abschnitt Caps verwendet die folgende Syntax:
Abschnitt | Wert | Definition |
---|---|---|
[path] |
Der zu konfigurierende Dateisystempfad. Ein Pfad, der mit / endet, gilt als dir,
sonst ist es eine Datei.
Es ist ein Fehler, mehrere Abschnitte mit demselben [path] in verschiedenen Dateien. In Python-Versionen <= 3.2
kann dieselbe Datei Abschnitte enthalten, die den vorherigen Abschnitt überschreiben; in Python
3.2 ist der strikte Modus aktiviert. |
|
mode |
Oktal-Dateimodus | Ein gültiger Oktaldateimodus mit mindestens 3 Ziffern. Wird 3 angegeben, gilt dies als 0 vorangestellt ist, sonst wird der Modus unverändert verwendet. |
user |
AID_<Nutzer> | Entweder das C define für eine gültige AID oder den Anzeigenamen
Beispielsweise sind sowohl AID_RADIO als auch radio zulässig. Bis
eine benutzerdefinierte AID zu definieren, siehe Konfigurieren
AID-Abschnitt |
group |
AID_<Gruppe> | Identisch mit Nutzer. |
caps |
Begrenzung* | Der Name, wie angegeben in
bionic/libc/kernel/uapi/linux/capability.h
ohne das vorangestellte CAP_ . Gemischte Groß- und Kleinschreibung zulässig. Sie können auch eine
die Rohfassung:
<ph type="x-smartling-placeholder">
|
Ein Anwendungsbeispiel finden Sie unter Verwenden einer Datei Systemfunktionen.
Abschnitt „AID“ konfigurieren
Der Abschnitt „AID“ enthält OEM-AIDs und verwendet die folgende Syntax:
Abschnitt | Wert | Definition |
---|---|---|
[AID_<name>] |
<name> kann Zeichen im Satz enthalten.
Großbuchstaben, Zahlen und Unterstriche. Die kleingeschriebene Version wird als
angezeigten Namen. Die generierte Headerdatei für den Code-Einschluss verwendet genau
AID_<name>
Es ist ein Fehler, mehrere Abschnitte mit demselben AID_<name> (Groß-/Kleinschreibung nicht berücksichtigend mit denselben Einschränkungen wie
[path] .
<name> muss mit einem Partitionsnamen beginnen, damit
dass sie nicht mit verschiedenen Quellen in Konflikt stehen. |
|
value |
<Zahl> | Ein gültiger Zahlenstring im C-Stil (hexadezimal, oktal, binär und dezimal).
Es ist ein Fehler, mehrere Bereiche mit derselben Wertoption anzugeben. Wertoptionen müssen in dem Bereich angegeben werden, der der Partition entspricht verwendet in <name> . Die Liste der gültigen Partitionen und ihrer zugehörigen
Bereiche sind in system/core/libcutils/include/private/android_filesystem_config.h definiert.
Folgende Optionen sind verfügbar:
<ph type="x-smartling-placeholder">
|
Anwendungsbeispiele finden Sie unter OEM definieren AID-Namen und Verwendung von OEM-AIDs.
Beispiele für die Verwendung
Die folgenden Beispiele beschreiben, wie eine OEM-AID definiert und verwendet wird Funktionen des Dateisystems zu aktivieren. OEM-AID-Namen ([AID_name]) muss mit einem Partitionsname wie "vendor_" damit sie nicht mit zukünftigen AOSP-Namen oder andere Partitionen.
OEM-AID-Namen definieren
Erstellen Sie zum Definieren einer OEM-AID eine config.fs
-Datei und legen Sie
AID-Wert Legen Sie beispielsweise in device/x/y/config.fs
den Parameter
Folgendes:
[AID_VENDOR_FOO] value: 2900
Legen Sie nach dem Erstellen der Datei die Variable TARGET_FS_CONFIG_GEN
fest
und zeigen Sie in BoardConfig.mk
darauf. Beispiel:
Legen Sie für device/x/y/BoardConfig.mk
Folgendes fest:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Ihre benutzerdefinierte AID kann jetzt vom System in einem neuen Build genutzt werden.
OEM-AIDs verwenden
Um eine OEM-AID zu verwenden, füge im C-Code den oemaids_headers
in die zugehörige
Makefile, fügen Sie #include "generated_oem_aid.h"
hinzu und verwenden dann das deklarierte
Kennzeichnungen. Fügen Sie beispielsweise in my_file.c
Folgendes hinzu:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
Fügen Sie der verknüpften Datei Android.bp
Folgendes hinzu:
header_libs: ["oemaids_headers"],
Wenn Sie eine Android.mk
-Datei verwenden, fügen Sie Folgendes hinzu:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Anzeigenamen verwenden
In Android 9 können Sie den Anzeigenamen für alle die AID-Namen unterstützt. Beispiel:
- Führen Sie in einem
chown
-Befehl insome/init.rc
folgende Schritte aus:chown vendor_foo /vendor/some/vendor_foo/file
- In einem
service
insome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Da die interne Zuordnung vom Anzeigenamen zur UID von
Der Anbieter /vendor/etc/passwd
und /vendor/etc/group
Partition muss bereitgestellt werden.
Anzeigenamen zuordnen
Android 9 umfasst auch Unterstützung für die Verknüpfung mit einem Anzeigenname durch den tatsächlichen OEM-AID-Wert. Sie können einen nicht numerischen String verwenden Argumente für Nutzer und Gruppe, z. B. vendor_foo. anstelle von „2901“.
Von AID in Anzeigenamen umwandeln
Für
OEM-AIDs, Android 8.x erforderte die Verwendung von
oem_####
mit getpwnam
und ähnlichen Funktionen wie
an Stellen, an denen Suchanfragen mit getpwnam
verarbeitet werden (z. B.
init
-Scripts). Mit Android 9 können Sie
Verwende die getpwnam
- und getgrnam
-Freunde in Bionic für
von Android-IDs (AIDs) in Anzeigenamen umwandeln und umgekehrt.
Dateisystemfunktionen verwenden
Um die Funktionen des Dateisystems zu aktivieren, erstellen Sie im Abschnitt
config.fs
-Datei. Beispiel:
device/x/y/config.fs
, fügen Sie den folgenden Abschnitt hinzu:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE<ph type="x-smartling-placeholder">
Legen Sie nach dem Erstellen der Datei fest, dass TARGET_FS_CONFIG_GEN
auf
diese Datei in BoardConfig.mk
. Beispiel:
Legen Sie für device/x/y/BoardConfig.mk
Folgendes fest:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Wenn der Dienst vendor_foo
ausgeführt wird, startet er
mit den Funktionen CAP_SYS_ADMIN
und CAP_SYS_NICE
ohne setuid
- und setgid
-Aufrufe. Darüber hinaus enthält der
Die SELinux-Richtlinie des vendor_foo
-Dienstes wurde entfernt
benötigt die Berechtigungen setuid
und setgid
und kann
gelöscht.
Überschreibungen konfigurieren (Android 6.x bis 7.x)
Android 6.0 hat fs_config
und zugehöriges Gebäude verschoben
Definitionen
(system/core/include/private/android_filesystem_config.h
) nach
system/core/libcutils/fs_config.c
, wo sie aktualisiert werden können oder
von Binärdateien überschrieben, die installiert sind in
/system/etc/fs_config_dirs
und
/system/etc/fs_config_files
Getrenntes Abgleichen und Parsen verwenden
Regeln für Verzeichnisse und Dateien (für die zusätzliche glob-Ausdrücke verwendet werden können)
kann Android Verzeichnisse und Dateien in zwei verschiedenen Tabellen verarbeiten.
Strukturdefinitionen in system/core/libcutils/fs_config.c
nicht
hat nur das Lesen von Verzeichnissen und Dateien zur Laufzeit zugelassen, der Host könnte jedoch
während der Build-Erstellung dieselben Dateien,
um Dateisystem-Images zu erstellen,
${OUT}/system/etc/fs_config_dirs
und
${OUT}/system/etc/fs_config_files
Während die Überschreibungsmethode zur Erweiterung des Dateisystems durch das in Android 8.0 eingeführt wurde, können Sie weiterhin die alte -Methode hinzu. In den folgenden Abschnitten wird beschrieben, wie Sie und das Dateisystem konfigurieren.
Überschreibungsdateien generieren
Sie können die ausgerichteten Binärdateien generieren
/system/etc/fs_config_dirs
und
/system/etc/fs_config_files
mit dem
fs_config_generate
-Tool in build/tools/fs_config
. Die
verwendet eine libcutils
-Bibliotheksfunktion.
(fs_config_generate()
) zum Verwalten der DAC-Anforderungen in einem Zwischenspeicher
und definiert Regeln für eine Einschlussdatei, um die DAC-Regeln zu institutionalisieren.
Erstellen Sie für die Verwendung in
device/vendor/device/android_filesystem_config.h
die als Überschreibung dient. Die Datei muss die Methode
structure fs_path_config
-Format definiert in
system/core/include/private/android_filesystem_config.h
mit dem
folgende Strukturinitialisierungen für Verzeichnis- und Dateisymbole:
- Verwenden Sie
android_device_dirs[]
für Verzeichnisse. - Verwenden Sie
android_device_files[]
für Dateien.
Wenn Sie android_device_dirs[]
und
android_device_files[]
definieren, können Sie
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
und
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(siehe
Beispiel unten). Sie können auch die Überschreibung angeben,
Datei mit TARGET_ANDROID_FILESYSTEM_CONFIG_H
im Board
Konfiguration mit dem erzwungenen Basisnamen
android_filesystem_config.h
.
Überschreibungsdateien einschließen
Wenn Sie Dateien einschließen möchten, muss PRODUCT_PACKAGES
Folgendes enthalten:
fs_config_dirs
und/oder fs_config_files
, damit es
installieren Sie sie in /system/etc/fs_config_dirs
und
/system/etc/fs_config_files
. Das Build-System
Suchanfragen nach benutzerdefiniertem android_filesystem_config.h
in
$(TARGET_DEVICE_DIR)
, wobei BoardConfig.mk
vorhanden ist.
Wenn diese Datei an einem anderen Ort vorhanden ist, legen Sie die Board-Konfigurationsvariable fest
TARGET_ANDROID_FILESYSTEM_CONFIG_H
, um auf diesen Standort zu verweisen.
Dateisystem konfigurieren
So konfigurieren Sie das Dateisystem unter Android 6.0 und höher:
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
erstellen -Datei.- Fügen Sie
fs_config_dirs
und/oderfs_config_files
hinzu zuPRODUCT_PACKAGES
in der Board-Konfigurationsdatei (z.B.$(TARGET_DEVICE_DIR)/device.mk
.
Beispiel für Überschreibung
Dieses Beispiel zeigt einen Patch zum Überschreiben von system/bin/glgps
.
-Daemon, um Wakelock-Unterstützung in der
device/vendor/device
-Verzeichnis. Behalten Sie die
im Hinterkopf:
- Jeder Gebäudeeintrag umfasst Modus, UID, gid, Funktionen und Name.
system/core/include/private/android_filesystem_config.h
ist automatisch eingefügt, um das Manifest bereitzustellen #defines (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
. - Der Abschnitt
android_device_files[]
enthält eine Aktion zum unterdrücken den Zugriff aufsystem/etc/fs_config_dirs
, wenn nicht angegeben, Dies dient als zusätzlicher DAC-Schutz für fehlende Inhalte für das Verzeichnis Überschreibungen. Dieser Schutz ist jedoch nur schwach, wenn jemand die Kontrolle/system
, kann sie in der Regel alles tun, was sie wollen.
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 file system +** 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)
Dateisysteme von früheren Releases migrieren
Beachten Sie bei der Migration von Dateisystemen von Android 5.x und niedriger, dass Android 6.x
- Entfernt einige Einbindungen, Strukturen und Inline-Definitionen.
- Erfordert einen Verweis auf
libcutils
statt einer direkten Ausführung vonsystem/core/include/private/android_filesystem_config.h
. Private ausführbare Dateien des Geräteherstellers,system/code/include/private_filesystem_config.h
für die Datei oder Verzeichnisstrukturen oderfs_config
musslibcutils
hinzufügen Bibliotheksabhängigkeiten. - Vom Gerätehersteller sind Kopien der privaten Zweigstellen des
system/core/include/private/android_filesystem_config.h
mit zusätzliche Inhalte für vorhandene Ziele, auf die verschoben werden solldevice/vendor/device/android_filesystem_config.h
. - Behält sich das Recht vor, Mandatory Access Controls (MAC) für SELinux auf folgende Websites anzuwenden
Konfigurationsdateien im Zielsystem, Implementierungen, die benutzerdefinierte
Das Ziel von ausführbaren Dateien, die
fs_config()
verwenden, muss Zugriff gewährleisten.