Objek dan layanan sistem file yang ditambahkan ke build sering kali memerlukan ID unik, yang dikenal sebagai ID Android (AID). Saat ini, banyak sumber daya seperti file dan layanan menggunakan AID inti (ditentukan oleh Android) secara tidak perlu; di banyak kasus, Anda dapat menggunakan AID OEM (ditentukan oleh OEM).
Versi Android sebelumnya (Android 7.x dan yang lebih lama) memperluas AID
mekanisme yang menggunakan android_filesystem_config.h
khusus perangkat
untuk menentukan kemampuan sistem file dan/atau AID OEM kustom. Namun,
sistem ini tidak intuitif karena tidak mendukung
penggunaan nama yang bagus untuk AID OEM,
mengharuskan Anda menentukan angka mentah untuk bidang pengguna dan grup tanpa
cara untuk mengaitkan nama yang
lebih dikenal dengan AID numerik.
Versi Android yang lebih baru (Android 8.0 dan yang lebih tinggi) mendukung metode baru untuk memperluas kemampuan sistem file. Metode baru ini memiliki dukungan untuk berikut ini:
- Beberapa lokasi sumber untuk file konfigurasi (memungkinkan ekstensif konfigurasi build yang berbeda).
- Pemeriksaan kesehatan waktu build nilai AID OEM.
- Pembuatan header AID OEM kustom yang dapat digunakan dalam file sumber sebagai diperlukan.
- Pengaitan nama yang mudah dipahami dengan nilai AID OEM yang sebenarnya. Mendukung argumen string nonnumerik untuk pengguna dan grup, yaitu "foo" bukannya "2901".
Peningkatan tambahan mencakup penghapusan android_ids[]
array dari
system/core/libcutils/include/private/android_filesystem_config.h
. Ini
sekarang ada di Bionic sebagai himpunan yang dihasilkan sepenuhnya pribadi, dengan
pengakses dengan getpwnam()
dan getgrnam()
. (Hal ini memiliki
efek samping dari menghasilkan biner stabil saat AID inti dimodifikasi.) Sebagai
dan file README dengan
detail selengkapnya, lihat
build/make/tools/fs_config
.
Menambahkan ID Android (AID)
Android 8.0 menghapus array android_ids[]
dari Android
Proyek Open Source (AOSP). Semua nama yang cocok untuk AID
dibuat dari nama
system/core/libcutils/include/private/android_filesystem_config.h
file header saat membuat array android_ids[]
Bionic. Apa saja
define
yang cocok dengan AID_*
diambil oleh alat
dan * menjadi nama huruf kecil.
Misalnya, dalam private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Menjadi:
- Nama yang mudah digunakan: sistem
- uid: 1000
- gid: 1000
Untuk menambahkan AID inti AOSP baru, cukup tambahkan #define
ke
File header android_filesystem_config.h
. AID-nya adalah
dihasilkan pada build dan disediakan untuk antarmuka
yang menggunakan pengguna dan grup
argumen. Alat ini memvalidasi AID baru yang tidak berada dalam APP atau OEM
rentang; rentang itu juga mengikuti perubahan
pada rentang tersebut dan secara otomatis
mengonfigurasi ulang berdasarkan perubahan
atau rentang yang dicadangkan OEM baru.
Konfigurasi AID
Untuk mengaktifkan mekanisme AID baru, tetapkan TARGET_FS_CONFIG_GEN
di
File BoardConfig.mk
. Variabel ini menyimpan daftar konfigurasi
{i>file<i}, yang memungkinkan Anda untuk
menambahkan file sesuai kebutuhan.
Berdasarkan konvensi, file konfigurasi menggunakan nama config.fs
, tetapi dalam
Anda dapat menggunakan nama apa pun. config.fs
file ada di
Python
Format ConfigParser ini dan menyertakan bagian huruf besar (untuk mengonfigurasi file
kemampuan sistem) dan bagian AID (untuk mengonfigurasi AID OEM).
Mengonfigurasi bagian huruf besar
Bagian huruf besar mendukung pengaturan berkas kemampuan sistem pada objek sistem file dalam build (sistem file sendiri juga harus mendukung fungsi ini).
Karena menjalankan layanan yang stabil sebagai {i>root<i} di Android akan menyebabkan
Compatibility Test Suite (CTS)
kegagalan, persyaratan sebelumnya untuk mempertahankan kemampuan saat menjalankan
proses atau layanan melibatkan pengaturan
kemampuan kemudian menggunakan
setuid
/setgid
untuk bantuan yang tepat agar dapat dijalankan. Dengan huruf besar, Anda
dapat melewatkan persyaratan ini dan
meminta {i>kernel<i} melakukannya untuk Anda. Saat kontrol
diserahkan kepada main()
, proses Anda sudah memiliki kemampuan yang
sehingga layanan Anda bisa menggunakan
pengguna dan grup non-root (ini lebih disarankan
untuk memulai layanan dengan hak istimewa).
Bagian huruf besar menggunakan sintaks berikut:
Bagian | Nilai | Definisi |
---|---|---|
[path] |
Jalur sistem file yang akan dikonfigurasi. Jalur yang diakhiri dengan / dianggap sebagai {i>dir<i},
jika tidak, itu adalah file.
Menentukan beberapa bagian dengan judul yang sama adalah sebuah kesalahan [path] dalam file yang berbeda. Di Python versi <= 3.2,
file yang sama dapat berisi bagian yang menggantikan bagian sebelumnya; di Python
3.2, ini diatur ke mode ketat. |
|
mode |
Mode file oktal | Mode file oktal yang valid minimal 3 digit. Jika 3 ditentukan, maka diawali dengan 0, mode {i>else<i} akan digunakan sebagaimana adanya. |
user |
AID_<pengguna> | C define untuk AID yang valid atau nama yang mudah dipahami
(misalnya, AID_RADIO dan radio dapat diterima). Kepada
menentukan AID khusus, lihat Mengonfigurasi
bagian AID. |
group |
AID_<grup> | Sama seperti pengguna. |
caps |
batas* | Nama seperti yang dideklarasikan di
bionic/libc/kernel/uapi/linux/capability.h
tanpa CAP_ di awal. Huruf besar dan kecil diizinkan. {i>Caps<i} juga bisa
mentah:
|
Untuk contoh penggunaan, lihat Menggunakan file kemampuan sistem kami.
Mengonfigurasi bagian AID
Bagian AID berisi AID OEM dan menggunakan sintaksis berikut:
Bagian | Nilai | Definisi |
---|---|---|
[AID_<name>] |
<name> dapat berisi karakter dalam kumpulan
huruf besar, angka, dan garis bawah. Versi huruf kecil
digunakan sebagai
nama yang dikenal. File header yang dihasilkan untuk penyertaan kode menggunakan
AID_<name> .
Menentukan beberapa bagian dengan judul yang sama adalah sebuah kesalahan AID_<name> (tidak peka huruf besar/kecil dengan batasan yang sama seperti
[path] ).
<name> harus diawali dengan nama partisi untuk memastikan
bahwa data itu tidak bertentangan
dengan sumber yang berbeda. |
|
value |
<angka> | String angka gaya C yang valid (hex, oktal, biner, dan desimal).
Menentukan beberapa bagian dengan opsi nilai yang sama merupakan suatu kesalahan. Opsi nilai harus ditentukan dalam rentang yang sesuai dengan partisi digunakan di <name> . Daftar partisi yang valid dan yang sesuai
rentang ditentukan dalam system/core/libcutils/include/private/android_filesystem_config.h .
Opsinya adalah:
|
Untuk contoh penggunaan, lihat Menentukan OEM Nama AID dan Menggunakan AID OEM.
Contoh penggunaan
Contoh berikut menjelaskan cara menetapkan dan menggunakan AID OEM serta cara mengaktifkan kemampuan sistem file. Nama AID OEM ([AID_name]) harus diawali dengan nama partisi seperti "vendor_" untuk memastikan agar tidak terjadi konflik dengan masa depan Nama AOSP atau partisi lainnya.
Menentukan nama AID OEM
Untuk menentukan AID OEM, buat file config.fs
dan tetapkan
nilai AID. Misalnya, dalam device/x/y/config.fs
, setel atribut
berikut ini:
[AID_VENDOR_FOO] value: 2900
Setelah membuat file, tetapkan variabel TARGET_FS_CONFIG_GEN
dan arahkan ke nilai tersebut di BoardConfig.mk
. Misalnya, di
device/x/y/BoardConfig.mk
, tetapkan nilai berikut ini:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
AID kustom Anda kini dapat digunakan oleh sistem secara keseluruhan pada build baru.
Gunakan AID OEM
Untuk menggunakan AID OEM, dalam kode C, sertakan oemaids_headers
dalam
Makefile, dan tambahkan #include "generated_oem_aid.h"
, lalu mulai gunakan file yang dideklarasikan
pengenal. Misalnya, di my_file.c
, tambahkan kode berikut:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
Dalam file Android.bp
terkait, tambahkan hal berikut:
header_libs: ["oemaids_headers"],
Jika Anda menggunakan file Android.mk
, tambahkan berikut ini:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Gunakan nama yang mudah dikenali
Di Android 9, Anda dapat menggunakan nama yang ramah untuk semua yang mendukung nama AID. Contoh:
- Dalam perintah
chown
disome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- Dalam
service
disome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Karena pemetaan internal dari {i>
friendly<i} ke UID dilakukan oleh
/vendor/etc/passwd
dan /vendor/etc/group
, vendor
partisi harus dipasang.
Nama yang mudah dikenali
Android 9 menyertakan dukungan untuk mengaitkan nama yang ramah dengan nilai AID OEM yang sebenarnya. Anda dapat menggunakan string nonnumerik argumen untuk pengguna dan grup, yaitu "vendor_foo" bukannya "2901".
Konversi dari AID ke nama yang ramah
Sebagai
OEM AID, Android 8.x mewajibkan penggunaan
oem_####
dengan getpwnam
dan fungsi serupa, seperti
dengan baik di tempat yang menangani pencarian dengan getpwnam
(seperti
skrip init
). Di Android 9, Anda dapat
gunakan teman getpwnam
dan getgrnam
di Bionic untuk
mengonversi dari ID Android (AID) menjadi nama yang cocok dan sebaliknya.
Menggunakan kemampuan sistem file
Untuk mengaktifkan kemampuan sistem file, buat bagian huruf besar pada
File config.fs
. Misalnya, di
device/x/y/config.fs
, tambahkan bagian berikut:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
Setelah membuat file, tetapkan TARGET_FS_CONFIG_GEN
agar mengarah ke
file tersebut dalam BoardConfig.mk
. Misalnya, di
device/x/y/BoardConfig.mk
, tetapkan nilai berikut ini:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Ketika dijalankan, layanan vendor_foo
akan dimulai
dengan kemampuan CAP_SYS_ADMIN
dan CAP_SYS_NICE
tanpa panggilan setuid
dan setgid
. Selain itu,
Kebijakan SELinux layanan vendor_foo
tidak lagi
memerlukan kemampuan setuid
dan setgid
, serta dapat
dihapus.
Mengonfigurasi penggantian (Android 6.x-7.x)
Android 6.0 memindahkan fs_config
dan struktur terkait
definisi
(system/core/include/private/android_filesystem_config.h
) ke
system/core/libcutils/fs_config.c
di mana mereka dapat diperbarui atau
diganti oleh file biner
yang diinstal di
/system/etc/fs_config_dirs
dan
/system/etc/fs_config_files
. Menggunakan pencocokan dan penguraian terpisah
aturan untuk direktori dan file (yang dapat menggunakan ekspresi glob tambahan)
memungkinkan Android menangani direktori dan file dalam dua tabel yang berbeda.
Definisi struktur di system/core/libcutils/fs_config.c
tidak
hanya mengizinkan pembacaan {i>runtime<i}
direktori dan file, tetapi {i>host<i} dapat menggunakan
file yang sama selama waktu {i>build<i} untuk
membangun {i>image<i} sistem file sebagai
${OUT}/system/etc/fs_config_dirs
dan
${OUT}/system/etc/fs_config_files
.
Walaupun metode penggantian untuk memperluas sistem file telah digantikan oleh sistem konfigurasi modular yang diperkenalkan di Android 8.0, Anda masih dapat menggunakan jika diinginkan. Bagian berikut menjelaskan cara membuat dan menyertakan mengganti file dan mengkonfigurasi sistem file.
Membuat file pengganti
Anda dapat membuat file biner yang selaras
/system/etc/fs_config_dirs
dan
/system/etc/fs_config_files
menggunakan
Alat fs_config_generate
di build/tools/fs_config
. Tujuan
alat ini menggunakan fungsi library libcutils
(fs_config_generate()
) untuk mengelola persyaratan DAC ke buffer
dan mendefinisikan aturan untuk file yang disertakan
untuk melembagakan aturan DAC.
Untuk menggunakannya, buat file yang disertakan di
device/vendor/device/android_filesystem_config.h
yang berfungsi sebagai penggantian. File tersebut harus menggunakan atribut
Format structure fs_path_config
ditentukan dalam
system/core/include/private/android_filesystem_config.h
dengan
inisialisasi struktur berikut untuk simbol direktori dan file:
- Untuk direktori, gunakan
android_device_dirs[]
. - Untuk file, gunakan
android_device_files[]
.
Saat tidak menggunakan android_device_dirs[]
dan
android_device_files[]
, Anda dapat menentukan
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
dan
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(lihat
contoh di bawah). Anda juga dapat menentukan penggantian
file menggunakan TARGET_ANDROID_FILESYSTEM_CONFIG_H
di board
dengan nama dasar yang diterapkan,
android_filesystem_config.h
.
Sertakan file penggantian
Untuk menyertakan file, pastikan PRODUCT_PACKAGES
menyertakan
fs_config_dirs
dan/atau fs_config_files
sehingga dapat
menginstalnya ke /system/etc/fs_config_dirs
dan
/system/etc/fs_config_files
. Sistem build
menelusuri android_filesystem_config.h
kustom di
$(TARGET_DEVICE_DIR)
, dengan BoardConfig.mk
.
Jika file ini ada di tempat lain, setel variabel konfigurasi board
TARGET_ANDROID_FILESYSTEM_CONFIG_H
untuk menunjuk ke lokasi tersebut.
Mengonfigurasi sistem file
Untuk mengonfigurasi sistem file di Android 6.0 dan versi yang lebih tinggi:
- Membuat
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
. - Tambahkan
fs_config_dirs
dan/ataufs_config_files
kePRODUCT_PACKAGES
di file konfigurasi board (mis.,$(TARGET_DEVICE_DIR)/device.mk
).
Contoh penggantian
Contoh ini menunjukkan patch untuk mengganti system/bin/glgps
untuk menambahkan dukungan penguncian layar saat aktif di
Direktori device/vendor/device
. Tetap
berikut ini:
- Setiap entri struktur adalah mode, UID, gid, kemampuan, dan nama.
system/core/include/private/android_filesystem_config.h
sama dengan disertakan secara otomatis untuk menyediakan manifes #defines (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
). - Bagian
android_device_files[]
menyertakan tindakan untuk menyembunyikan akses kesystem/etc/fs_config_dirs
jika tidak ditentukan, yang berfungsi sebagai perlindungan DAC tambahan untuk kurangnya konten untuk direktori untuk setiap penggantian. Namun, ini adalah perlindungan yang lemah; jika seseorang memiliki kendali atas/system
, dia biasanya bisa melakukan apa pun yang diinginkan.
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)
Memigrasikan sistem file dari rilis sebelumnya
Saat memigrasikan sistem file dari Android 5.x dan versi sebelumnya, perlu diingat bahwa Android 6.x
- Menghapus beberapa penyertaan, struktur, dan definisi inline.
- Memerlukan referensi ke
libcutils
, bukan berjalan secara langsung darisystem/core/include/private/android_filesystem_config.h
. File {i>executable<i} pribadi produsen perangkat yang bergantung padasystem/code/include/private_filesystem_config.h
untuk file atau struktur direktori ataufs_config
harus menambahkanlibcutils
dependensi library. - Memerlukan salinan cabang pribadi produsen perangkat
system/core/include/private/android_filesystem_config.h
dengan konten tambahan pada target yang ada untuk dipindahkandevice/vendor/device/android_filesystem_config.h
. - Memiliki hak untuk menerapkan Mandatory Access Controls (MAC) SELinux untuk
file konfigurasi pada sistem target, implementasi yang mencakup
file target yang dapat dieksekusi yang menggunakan
fs_config()
harus memastikan akses.