Gli oggetti del file system e i servizi aggiunti alla build spesso richiedono ID univoci, noti come ID Android (AID). Attualmente, molte risorse come file e servizi usano inutilmente AID principali (definiti da Android); in molti in questi casi, puoi usare AID OEM (definiti OEM).
Le versioni precedenti di Android (Android 7.x e versioni precedenti) estendevano gli AID
meccanismo di attenzione utilizzando un parametro android_filesystem_config.h
specifico per dispositivo
per specificare funzionalità del file system e/o AID OEM personalizzati. Tuttavia, questo
non era intuitivo perché non supportava l'uso di nomi accattivanti per gli AID OEM,
richiedere di specificare un valore numerico non elaborato per i campi utente e gruppo senza
per associare un nome semplice all'AID numerico.
Le versioni più recenti di Android (Android 8.0 e versioni successive) supportano un nuovo metodo per l'estensione delle funzionalità del file system. Questo nuovo metodo supporta seguenti:
- Più posizioni di origine per i file di configurazione (abilita l'estensione configurazioni di build).
- Controllo dell'integrità in fase di build dei valori AID OEM.
- Generazione di un'intestazione AID OEM personalizzata che può essere utilizzata nei file di origine come necessaria.
- Associazione di un nome descrittivo con il valore effettivo dell'AID OEM. Supporta argomenti stringa non numerici per utente e gruppo, ad esempio "foo" anziché "2901".
Ulteriori miglioramenti includono la rimozione dell'URL android_ids[]
array da
system/core/libcutils/include/private/android_filesystem_config.h
. Questo
ora esiste in Bionic come array generato completamente privato, con
con getpwnam()
e getgrnam()
. (Ciò ha
l'effetto collaterale della produzione di file binari stabili quando vengono modificati gli AID fondamentali). Per
e un file README con ulteriori dettagli, consulta
build/make/tools/fs_config
.
Aggiungi ID Android (AID)
Android 8.0 ha rimosso l'array android_ids[]
da Android
un progetto open source (AOSP). Tutti i nomi idonei per l'AID vengono invece generati
system/core/libcutils/include/private/android_filesystem_config.h
di intestazione durante la generazione dell'array Bionic android_ids[]
. Qualsiasi
La define
corrispondente a AID_*
viene rilevata dagli strumenti
e * diventa il nome in minuscolo.
Ad esempio, in private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Diventa:
- Nome semplice: system
- UID: 1000
- gid: 1000
Per aggiungere un nuovo AOSP Core AID, aggiungi semplicemente #define
al
File di intestazione android_filesystem_config.h
. L'AID è
generate al momento della creazione e rese disponibili alle interfacce che utilizzano
argomenti. Lo strumento convalida che il nuovo AID non sia presente nell'APP o nell'OEM
intervalli; rispetta anche le modifiche a questi intervalli e dovrebbe
riconfigurarla in caso di modifiche o nuovi intervalli prenotati dall'OEM.
Configura AID
Per abilitare il nuovo meccanismo di AID, imposta TARGET_FS_CONFIG_GEN
nel
BoardConfig.mk
file. Questa variabile contiene un elenco di configurazioni
di file YAML, consentendoti di aggiungerli in base alle tue esigenze.
Per convenzione, i file di configurazione utilizzano il nome config.fs
, ma in
puoi usare qualsiasi nome. config.fs
file si trovano in
Python
Formato ConfigParser e includi una sezione in maiuscolo (per la configurazione
funzionalità di sistema) e una sezione AID (per la configurazione degli AID OEM).
Configurare la sezione delle maiuscole
La sezione delle maiuscole supporta l'impostazione file funzionalità di sistema sugli oggetti di file system all'interno della build (il file system deve supportare anche questa funzionalità).
Poiché l'esecuzione di un servizio stabile come root in Android provoca un
Suite di test di compatibilità (Compatibility Test Suite, CTS)
errore, i precedenti requisiti per conservare una funzionalità durante l'esecuzione di
processo o servizio prevedeva l'impostazione di funzionalità e poi l'utilizzo
setuid
/setgid
a un AID adeguato per la pubblicazione. Con le maiuscole,
puoi saltare questi requisiti e lasciare che il kernel lo faccia al posto tuo. Quando il controllo è
assegnato a main()
, il tuo processo ha già le capacità necessarie
in modo che il servizio possa utilizzare un utente e un gruppo non root (è la soluzione
per avviare i servizi con privilegi).
La sezione sulle maiuscole utilizza la seguente sintassi:
Sezione | Valore | Definizione |
---|---|---|
[path] |
Il percorso del file system da configurare. Un percorso che termina con / è considerato un dir,
altrimenti è un file.
È un errore specificare più sezioni con lo stesso [path] in file diversi. Nelle versioni Python <= 3.2,
lo stesso file può contenere sezioni che sostituiscono la sezione precedente; in Python
3.2, è impostata la modalità con restrizioni. |
|
mode |
Modalità file ottale | Una modalità file ottale valida di almeno 3 cifre. Se viene specificato 3, preceduto da uno 0, altrimenti viene utilizzata la modalità così com'è. |
user |
AID_<utente> | C define per un AID valido o il nome descrittivo
(ad esempio, sono accettati sia AID_RADIO sia radio ). A
un AID personalizzato, consulta la sezione Configurazione
sezione AID. |
group |
AID_<gruppo> | Come l'utente. |
caps |
berretto* | Il nome dichiarato in
bionic/libc/kernel/uapi/linux/capability.h
senza il CAP_ principale. Sono consentiti lettere maiuscole e minuscole. I limiti possono essere
i dati non elaborati:
|
Per un esempio di utilizzo, consulta la sezione Utilizzo di funzionalità di sistema.
Configura la sezione AID
La sezione AID contiene gli AID OEM e utilizza la seguente sintassi:
Sezione | Valore | Definizione |
---|---|---|
[AID_<name>] |
<name> può contenere caratteri nel set
lettere maiuscole, numeri e trattini bassi. La versione in minuscolo viene utilizzata come
nome descrittivo. Il file di intestazione generato per l'inclusione del codice utilizza
AID_<name> .
È un errore specificare più sezioni con lo stesso AID_<name> (senza distinzione tra maiuscole e minuscole con gli stessi vincoli di
[path] ).
<name> deve iniziare con un nome partizione per garantire
che non entri in conflitto con fonti diverse. |
|
value |
<numero> | Una stringa di numeri in stile C valida (esadecimale, ottale, binario e decimale).
Specificare più sezioni con la stessa opzione di valore è un errore. Le opzioni per il valore devono essere specificate nell'intervallo corrispondente alla partizione utilizzata in <name> . L'elenco di partizioni valide e le relative parti
intervalli sono definiti in system/core/libcutils/include/private/android_filesystem_config.h .
Le opzioni sono:
|
Per esempi di utilizzo, consulta la sezione Definizione dell'OEM Nomi AID e Utilizzo di AID OEM.
Esempi di utilizzo
I seguenti esempi illustrano in dettaglio come definire e utilizzare un AID OEM e come abilitare funzionalità del file system. Nomi AID OEM ([AID_name]) deve iniziare con un nome della partizione come "vendor_" per garantire che non entrino in conflitto con Nomi AOSP o altre partizioni.
Definisci i nomi AID OEM
Per definire un AID OEM, crea un file config.fs
e imposta
il valore AID. Ad esempio, in device/x/y/config.fs
, imposta il valore
seguenti:
[AID_VENDOR_FOO] value: 2900
Dopo aver creato il file, imposta la variabile TARGET_FS_CONFIG_GEN
e indicala in BoardConfig.mk
. Ad esempio, nel
device/x/y/BoardConfig.mk
, imposta quanto segue:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Ora il tuo AID personalizzato può essere utilizzato dal sistema in generale su una nuova build.
Utilizza AID OEM
Per utilizzare un AID OEM, nel codice C includi il oemaids_headers
nella documentazione
Makefile e aggiungere #include "generated_oem_aid.h"
, quindi iniziare a utilizzare il file
o identificatori univoci. Ad esempio, in my_file.c
, aggiungi quanto segue:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
Nel file Android.bp
associato, aggiungi quanto segue:
header_libs: ["oemaids_headers"],
Se utilizzi un file Android.mk
, aggiungi quanto segue:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Usa nomi descrittivi
In Android 9, puoi utilizzare il nome descrittivo per che supporta i nomi AID. Ad esempio:
- In un comando
chown
insome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- In
service
asome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Poiché la mappatura interna dal nome semplice allo uid viene eseguita
/vendor/etc/passwd
e /vendor/etc/group
, il fornitore
la partizione <start>.
Associa nomi descrittivi
Android 9 include il supporto per l'associazione di nome descrittivo con il valore effettivo dell'AID OEM. Puoi usare una stringa non numerica argomenti per utente e gruppo, ovvero "vendor_foo" anziché "2901".
Converti da AID a nome descrittivo
Per
AID OEM, Android 8.x richiede l'utilizzo di
oem_####
con getpwnam
e funzioni simili, come
molto bene nelle posizioni che gestiscono le ricerche con getpwnam
(come
init
script). In Android 9, puoi
usa getpwnam
e getgrnam
amici in Bionic per
convertendo gli ID Android (AID) in nomi semplici e viceversa.
Utilizza le funzionalità del file system
Per abilitare le funzionalità del file system, crea una sezione con maiuscole nella
config.fs
. Ad esempio, nel
device/x/y/config.fs
, aggiungi la seguente sezione:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
Dopo aver creato il file, imposta TARGET_FS_CONFIG_GEN
in modo che punti a
quel file in BoardConfig.mk
. Ad esempio, nel
device/x/y/BoardConfig.mk
, imposta quanto segue:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Quando viene eseguito, il servizio vendor_foo
viene avviato
con funzionalità CAP_SYS_ADMIN
e CAP_SYS_NICE
senza chiamate setuid
e setgid
. Inoltre,
Il criterio SELinux del servizio vendor_foo
non è più
richiede le funzionalità setuid
e setgid
e può essere
eliminati.
Configurazione degli override (Android 6.x-7.x)
Android 6.0 ha spostato fs_config
e struttura associata
definizioni
(system/core/include/private/android_filesystem_config.h
) per
system/core/libcutils/fs_config.c
dove potrebbero essere aggiornati
con override dai file binari installati in
/system/etc/fs_config_dirs
e
/system/etc/fs_config_files
. Utilizzo della corrispondenza e dell'analisi separate
regole per directory e file (che potrebbero utilizzare espressioni glob aggiuntive)
consente ad Android di gestire directory e file in due tabelle diverse.
Le definizioni della struttura in system/core/libcutils/fs_config.c
non sono
consentiva solo la lettura in fase di runtime di directory e file, ma l'host poteva utilizzare
gli stessi file in fase di compilazione per creare immagini del file system
${OUT}/system/etc/fs_config_dirs
e
${OUT}/system/etc/fs_config_files
.
Il metodo di override dell'estensione del file system è stato sostituito da il sistema di configurazione modulare introdotto in Android 8.0, è comunque possibile usare , se lo desideri. Le seguenti sezioni descrivono nel dettaglio come generare e includere sovrascrivere i file e configurare il file system.
Genera file di override
Puoi generare file binari allineati
/system/etc/fs_config_dirs
e
/system/etc/fs_config_files
utilizzando
Strumento fs_config_generate
in build/tools/fs_config
. La
utilizza una funzione di libreria libcutils
(fs_config_generate()
) per gestire i requisiti del DAC in un buffer
e definisce le regole per un file di inclusione al fine di istituzionalizzare le regole DAC.
Per utilizzarlo, crea un file di inclusione in
device/vendor/device/android_filesystem_config.h
che funge da override. Il file deve utilizzare la proprietà
Formato structure fs_path_config
definito in
system/core/include/private/android_filesystem_config.h
con
le seguenti inizializzazioni della struttura per i simboli di directory e file:
- Per le directory, usa
android_device_dirs[]
. - Per i file, usa
android_device_files[]
.
Quando non usi android_device_dirs[]
e
android_device_files[]
, puoi definire
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
e
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(vedi il
esempio di seguito). Puoi anche specificare l'override
file utilizzando TARGET_ANDROID_FILESYSTEM_CONFIG_H
nella lavagna
con un basename applicato
android_filesystem_config.h
.
Includi file di override
Per includere i file, assicurati che PRODUCT_PACKAGES
includa
fs_config_dirs
e/o fs_config_files
in modo che possa
installarle in /system/etc/fs_config_dirs
e
/system/etc/fs_config_files
. Il sistema di compilazione
cerca personalizzato android_filesystem_config.h
in
$(TARGET_DEVICE_DIR)
, dove esiste BoardConfig.mk
.
Se questo file esiste altrove, imposta la variabile di configurazione della scheda
TARGET_ANDROID_FILESYSTEM_CONFIG_H
per puntare a quella posizione.
Configurare il file system
Per configurare il file system in Android 6.0 e versioni successive:
- Crea
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
. - Aggiungi
fs_config_dirs
e/ofs_config_files
aPRODUCT_PACKAGES
nel file di configurazione della lavagna (ad es.$(TARGET_DEVICE_DIR)/device.mk
).
Esempio di override
Questo esempio mostra una patch per eseguire l'override di system/bin/glgps
per aggiungere il supporto dei wakelock nella
Directory device/vendor/device
. Mantieni il
tieni presente quanto segue:
- Ogni voce della struttura indica modalità, uid, gid, capacità e il nome.
system/core/include/private/android_filesystem_config.h
è incluso automaticamente per fornire il manifest #defines (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
). - La sezione
android_device_files[]
include un'azione per Se non specifichi l'accesso asystem/etc/fs_config_dirs
, che funge da ulteriore protezione DAC per la mancanza di contenuti per la directory override. Tuttavia, si tratta di una protezione debole; se qualcuno ha il controllo/system
, in genere può fare tutto ciò che vuole.
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)
Esegui la migrazione dei file system da release precedenti
Quando esegui la migrazione dei file system da Android 5.x e versioni precedenti, tieni presente che Android 6.x
- Rimuove alcune include, strutture e definizioni incorporate.
- Richiede un riferimento a
libcutils
anziché essere eseguito direttamente dasystem/core/include/private/android_filesystem_config.h
. Eseguibili privati del produttore del dispositivo che dipendono dasystem/code/include/private_filesystem_config.h
per il file o strutture di directory ofs_config
devono aggiungerelibcutils
delle dipendenze di libreria. - Richiede copie del ramo privato del produttore del dispositivo
system/core/include/private/android_filesystem_config.h
con contenuti aggiuntivi sui target esistenti da spostaredevice/vendor/device/android_filesystem_config.h
. - Si riserva il diritto di applicare i controlli di accesso obbligatori (MAC) di SELinux a
di configurazione automatica sul sistema di destinazione, implementazioni che includono
gli eseguibili target che utilizzano
fs_config()
devono garantire l'accesso.