Dodane do kompilacji obiekty i usługi systemu plików często wymagają oddzielnych czyli w unikalnych identyfikatorach Androida (AID). Obecnie wiele źródeł, takich jak pliki i usługi niepotrzebnie używają podstawowych (zdefiniowanych przez Androida) identyfikatorów AID; w wielu W przypadku tych przypadków możesz korzystać z środków wspomagania wiarygodności OEM (zdefiniowanych przez OEM).
Wcześniejsze wersje Androida (Android 7.x i starsze) rozszerzyły identyfikatory AID
za pomocą mechanizmu android_filesystem_config.h
przeznaczonego na konkretne urządzenie
aby określić możliwości systemu plików lub niestandardowe identyfikatory AID OEM. Jednak
był nieintuicyjny, ponieważ nie obsługiwał używania ładnych nazw dla AID OEM,
wymaga podawania nieprzetworzonej wartości liczbowej w polach użytkownika i grupy bez
Powiązanie przyjaznej nazwy z liczbowym AID.
Nowsze wersje Androida (Android 8.0 i nowsze) obsługują nową metodę rozszerzanie możliwości systemu plików. Ta nowa metoda obsługuje :
- Wiele lokalizacji źródłowych na pliki konfiguracji (umożliwia rozszerzenie konfiguracje kompilacji).
- Kontrola satysfakcji w czasie kompilacji wartości AID OEM.
- wygenerowanie niestandardowego nagłówka AID OEM, którego można używać w plikach źródłowych jako niezbędną.
- Powiązanie przyjaznej nazwy z rzeczywistą wartością AID OEM. Obsługiwane nienumeryczne argumenty ciągu tekstowego dla użytkownika i grupy, np. „foo” zamiast „2901”.
Dodatkowe ulepszenia obejmują android_ids[]
tablica z
system/core/libcutils/include/private/android_filesystem_config.h
Ten
tablica w Bionic jest teraz w pełni generowana
akcesory z atrybutami getpwnam()
i getgrnam()
. (Ta wartość ma
efekt uboczny tworzenia stabilnych plików binarnych w miarę modyfikacji podstawowych identyfikatorów AID). Dla:
narzędzia oraz plik README z dodatkowymi informacjami znajdziesz w
build/make/tools/fs_config
Dodawanie identyfikatorów Androida (AID)
W Androidzie 8.0 usunięto macierz android_ids[]
z Androida
Open Source Project (AOSP). Wszystkie nazwy z myślą o AID są generowane na podstawie
system/core/libcutils/include/private/android_filesystem_config.h
pliku nagłówkowego podczas generowania tablicy Bionic android_ids[]
. Dowolne
define
pasujący do elementu AID_*
jest pobierany przez narzędzie
a * stanie się małą nazwą.
Na przykład w pliku private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Staje się:
- Przyjazna nazwa: system
- UID: 1000
- gid: 1000
Aby dodać nowy podstawowy identyfikator AOSP, wystarczy dodać #define
do
android_filesystem_config.h
. Identyfikator AID to
generowane podczas tworzenia i udostępniane interfejsom opartym na użytkownikach i grupach
. Narzędzie sprawdza, czy nowy AID nie znajduje się w aplikacji ani OEM
zakresy uwzględnia również zmiany tych zakresów i powinien automatycznie
ponowne konfigurowanie w przypadku zmian lub nowych zakresów zarezerwowanych przez OEM.
Skonfiguruj AID
Aby włączyć nowy mechanizm AID, ustaw TARGET_FS_CONFIG_GEN
w
BoardConfig.mk
. Ta zmienna zawiera listę konfiguracji
z plikami, dzięki czemu możesz je dołączać według potrzeb.
Zgodnie z konwencją pliki konfiguracji noszą nazwę config.fs
, ale w
Możesz użyć dowolnej nazwy. config.fs
plików jest w
Python.
Format ini ConfigParser i umieść w nim sekcję z ograniczeniami (do konfigurowania pliku
funkcji systemu) i sekcji dotyczącej AID (do konfigurowania identyfikatorów AID OEM).
Konfigurowanie sekcji dotyczącej limitów
Sekcja dotycząca limitów obsługuje ustawienie plik możliwości systemu w obiektach systemu plików w kompilacji (systemie plików musi również obsługiwać tę funkcję).
Ponieważ uruchomienie na Androidzie stabilnej usługi jako root powoduje
Compatibility Test Suite (CTS)
niepowodzenie, wcześniejsze wymagania dotyczące
zachowania funkcji w trakcie
procesu lub usługi wymaga skonfigurowania funkcji, a następnie
setuid
/setgid
do odpowiedniego AID, aby je uruchomić. Dzięki kapcjom
może pominąć te wymagania i skorzystać z jednego jądra systemu. Gdy element sterujący to
przekazany main()
, Twój proces ma już takie możliwości
aby usługa mogła korzystać z użytkowników i grup innych niż root (jest to
(sposób uruchamiania usług z podwyższonymi uprawnieniami).
Sekcja dotycząca wielkich liter ma taką składnię:
Sekcja | Wartość | Definicja |
---|---|---|
[path] |
Ścieżka systemu plików do skonfigurowania. Ścieżka zakończona na / jest uważana za dir,
W przeciwnym razie jest to plik.
Wskazywanie wielu sekcji zawierających taki sam błąd jest błędem [path] w różnych plikach. W Pythonie w wersji <= 3.2 parametr
ten sam plik może zawierać sekcje, które zastępują poprzednią sekcję; w Pythonie
3.2, tryb jest ścisły. |
|
mode |
Tryb pliku ósemkowego | Prawidłowy tryb pliku ósemkowego z co najmniej 3 cyframi. Jeśli podana jest wartość 3, jest ona poprzedzony znakiem 0, a w przeciwnym razie jest używany tryb bez zmian. |
user |
AID_<użytkownik> | C define dla prawidłowego AID lub przyjazna nazwa
(np. dopuszczalne są zarówno wartości AID_RADIO , jak i radio ). Do
jak zdefiniować niestandardowy identyfikator AID, zapoznaj się z sekcją Konfigurowanie
sekcji AID. |
group |
AID_<grupa> | Takie same jak u użytkownika. |
caps |
czapka* | Nazwa zadeklarowana w
bionic/libc/kernel/uapi/linux/capability.h
bez początkowego CAP_ . Różne wielkości liter są dozwolone. Ograniczenia mogą być też
Nieprzetworzony:
|
Przykład użycia znajdziesz w artykule Korzystanie z pliku możliwości systemu.
Konfigurowanie sekcji AID
Sekcja AID zawiera identyfikatory AID OEM i używa tej składni:
Sekcja | Wartość | Definicja |
---|---|---|
[AID_<name>] |
Pole <name> może zawierać znaki z zestawu
wielkich liter, cyfr i podkreśleń. Wersja pisana małymi literami jest używana jako
przyjazną nazwą. W wygenerowanym pliku nagłówka do uwzględnienia kodu jest
AID_<name>
Wskazywanie wielu sekcji zawierających taki sam błąd jest błędem AID_<name> (wielkość liter nie jest rozróżniana przy tych samych ograniczeniach co
[path] ).
<name> musi zaczynać się od nazwy partycji, aby mieć pewność,
że nie koliduje z różnymi źródłami. |
|
value |
<numer> | Prawidłowy ciąg liczbowy w stylu C (szesnastkowy, ósemkowy, binarny i dziesiętny).
Określanie wielu sekcji z tą samą opcją wartości jest błędem. Opcje wartości muszą być określone w zakresie odpowiadającym partycji używane w projekcie <name> . Lista prawidłowych partycji i odpowiadających im partycji
zakresy są zdefiniowane w funkcji system/core/libcutils/include/private/android_filesystem_config.h .
Dostępne są następujące opcje:
|
Przykłady użycia znajdziesz w artykule Definiowanie, czym jest OEM Nazwy urządzeń AID i Korzystanie z identyfikatorów AID OEM.
Przykłady użycia
Z poniższych przykładów dowiesz się, jak zdefiniować i stosować identyfikator AID OEM oraz jak włączyć funkcje systemu plików. Nazwy AID OEM ([AID_nazwa]) musi zaczynać się od nazwa partycji, na przykład „vendor_” aby nie kolidowały z przyszłymi zmianami. Nazwy AOSP i inne partycje.
Zdefiniuj nazwy AID OEM
Aby zdefiniować identyfikator AID OEM, utwórz plik config.fs
i ustaw
wartość AID. Na przykład w pliku device/x/y/config.fs
ustaw parametr
:
[AID_VENDOR_FOO] value: 2900
Po utworzeniu pliku ustaw zmienną TARGET_FS_CONFIG_GEN
i wskaż go w BoardConfig.mk
. Na przykład w polu
device/x/y/BoardConfig.mk
ustaw te:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Twój niestandardowy identyfikator AID może być teraz wykorzystywany przez cały system w nowej kompilacji.
Używaj identyfikatorów OEM
Aby korzystać z identyfikatora AID OEM, w kodzie C umieść oemaids_headers
w powiązanym
Zrób plik i dodaj #include "generated_oem_aid.h"
, a następnie zacznij używać zadeklarowanego
i identyfikatorów. Na przykład do pliku my_file.c
dodaj:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
W powiązanym pliku Android.bp
dodaj:
header_libs: ["oemaids_headers"],
Jeśli używasz pliku Android.mk
, dodaj te elementy:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Używaj przyjaznych nazw
W Androidzie 9 możesz użyć przyjaznej nazwy dla dowolnego który obsługuje nazwy AID. Na przykład:
- W poleceniu
chown
wsome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- W pokoju
service
wsome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Ponieważ wewnętrzne mapowanie z przyjaznej nazwy na identyfikator UID jest wykonywane przez
/vendor/etc/passwd
i /vendor/etc/group
, dostawcy
musi być podłączona.
Powiąż przyjazne nazwy
Android 9 obsługuje powiązanie przyjazna nazwa z rzeczywistą wartością AID OEM. Możesz użyć ciągu nienumerycznego argumentów dla użytkownika i grupy, czyli „vendor_foo” zamiast „2901”.
Konwertowanie z AID na przyjazne nazwy
Dla:
Systemy pomocy OEM, Android 8.x wymagał użycia:
oem_####
z getpwnam
i podobnymi funkcjami, jak
także w miejscach, które obsługują wyszukiwania z użyciem getpwnam
(na przykład
init
skryptów). W Androidzie 9 możesz:
użyj znajomych z getpwnam
i getgrnam
w Bionic dla
z identyfikatorów Androida (AID) na przyjazne nazwy i odwrotnie.
Korzystanie z funkcji systemu plików
Aby włączyć funkcje systemu plików, utwórz sekcję ograniczeń
config.fs
. Na przykład w polu
device/x/y/config.fs
, dodaj tę sekcję:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
Po utworzeniu pliku ustaw TARGET_FS_CONFIG_GEN
tak, aby wskazywał
ten plik w folderze BoardConfig.mk
. Na przykład w polu
device/x/y/BoardConfig.mk
ustaw te:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Po wykonaniu usługi vendor_foo
uruchamia się
z możliwościami CAP_SYS_ADMIN
i CAP_SYS_NICE
bez połączeń setuid
i setgid
. Dodatkowo
Zasada SELinux usługi vendor_foo
nie jest już dostępna
wymaga funkcji setuid
i setgid
oraz może być
Usunięto.
Konfigurowanie zastąpień (Android 6.x-7.x)
W Androidzie 6.0 przeniesiono folder fs_config
i powiązaną strukturę
definicje
(system/core/include/private/android_filesystem_config.h
) do
system/core/libcutils/fs_config.c
, gdzie można je zaktualizować lub
zastąpione przez pliki binarne zainstalowane w
/system/etc/fs_config_dirs
i
/system/etc/fs_config_files
. Korzystanie z oddzielnego dopasowania i analizy
reguły dla katalogów i plików (które mogą używać dodatkowych wyrażeń glob);
umożliwia obsługę katalogów i plików w dwóch różnych tabelach.
Definicje struktur w tym języku (system/core/libcutils/fs_config.c
) nie są
zezwalał jedynie na odczyt katalogów i plików w środowisku wykonawczym, ale host mógł użyć funkcji
tych samych plików w czasie kompilacji, aby utworzyć obrazy systemu plików
${OUT}/system/etc/fs_config_dirs
i
${OUT}/system/etc/fs_config_files
Mimo że metoda zastąpienia, która polega na rozszerzeniu systemu plików, została zastąpiona przez modułowy system konfiguracji w Androidzie 8.0, nadal możesz używać starego jeśli jest taka potrzeba. W sekcjach poniżej znajdziesz szczegółowe informacje o generowaniu i uwzględnianiu zastąpić pliki i skonfigurować system plików.
Generuj pliki zastąpień
Wyrównane pliki binarne można generować
/system/etc/fs_config_dirs
i
/system/etc/fs_config_files
za pomocą
Narzędzie fs_config_generate
w usłudze build/tools/fs_config
.
narzędzie korzysta z funkcji biblioteki libcutils
(fs_config_generate()
) do zarządzania wymaganiami dotyczącymi DAC w buforze.
i definiuje reguły pliku dołączanego,
by uporządkować reguły DAC.
Aby użyć tej funkcji, utwórz plik dołączany w
device/vendor/device/android_filesystem_config.h
, które pełnią funkcję zastąpienia. Plik musi używać funkcji
Format structure fs_path_config
zdefiniowany w
system/core/include/private/android_filesystem_config.h
z
następujące inicjacje struktury dla katalogów i symboli plików:
- W przypadku katalogów użyj formatu
android_device_dirs[]
. - W przypadku plików użyj formatu
android_device_files[]
.
Gdy nie są używane: android_device_dirs[]
i
android_device_files[]
, możesz zdefiniować
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
i
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(zobacz
przykład poniżej). Możesz też określić zastąpienie
plik, używając funkcji TARGET_ANDROID_FILESYSTEM_CONFIG_H
na tablicy
z wymuszoną nazwą bazową
android_filesystem_config.h
Uwzględnij pliki zastąpień
Aby dołączyć pliki, upewnij się, że PRODUCT_PACKAGES
zawiera
fs_config_dirs
lub fs_config_files
, aby mógł
zainstaluj je w aplikacji /system/etc/fs_config_dirs
i
/system/etc/fs_config_files
. System kompilacji
Liczba wyszukiwań niestandardowych kategorii „android_filesystem_config.h
” w
$(TARGET_DEVICE_DIR)
, gdzie jest BoardConfig.mk
.
Jeśli ten plik istnieje w innym miejscu, ustaw zmienną konfiguracji tablicy
TARGET_ANDROID_FILESYSTEM_CONFIG_H
, aby wskazać tę lokalizację.
Konfigurowanie systemu plików
Aby skonfigurować system plików w Androidzie 6.0 lub nowszym:
- Utwórz
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
. - Dodaj
fs_config_dirs
lubfs_config_files
doPRODUCT_PACKAGES
w pliku konfiguracji płyty (np.$(TARGET_DEVICE_DIR)/device.mk
).
Przykład zastąpienia
Ten przykład przedstawia poprawkę, która zastępuje system/bin/glgps
demon, aby dodać obsługę blokady uśpienia
device/vendor/device
. Zachowaj
o których warto pamiętać:
- Każdy wpis struktury to tryb, uid, gid, możliwości i nazwa.
system/core/include/private/android_filesystem_config.h
to jest dołączany automatycznie, aby udostępnić plik manifestu #defines (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
). - Sekcja
android_device_files[]
zawiera działanie pozwalające na: zablokuj dostęp do usługisystem/etc/fs_config_dirs
, gdy nie jest określony, który stanowi dodatkową ochronę DAC w przypadku braku treści w katalogu. nadpisania. Jest to jednak słaba ochrona. czy ktoś ma kontrolę nad/system
, mogą zwykle robić, co zechcą.
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)
Migracja systemów plików z wcześniejszych wersji
Przy migracji systemów plików z Androida 5.x i starszych pamiętaj, że: Android 6.x
- Usuwa niektóre elementy obejmujące, struktury i wbudowane definicje.
- Wymaga odniesienia do
libcutils
zamiast uruchamiania bezpośrednio odsystem/core/include/private/android_filesystem_config.h
. Prywatne pliki wykonywalne producenta urządzenia, które zależą odsystem/code/include/private_filesystem_config.h
w przypadku pliku lub struktury katalogów lubfs_config
muszą dodaćlibcutils
zależności między bibliotekami. - Wymaga kopii prywatnej gałęzi producenta urządzenia
system/core/include/private/android_filesystem_config.h
z dodatkowa treść do przeniesienia w istniejących celachdevice/vendor/device/android_filesystem_config.h
- Zastrzega sobie prawo do stosowania obowiązkowej kontroli dostępu SELinux (MAC) do
plików konfiguracji w systemie docelowym, implementacji obejmujących niestandardowe
docelowe pliki wykonywalne za pomocą funkcji
fs_config()
muszą zapewniać dostęp.