Derlemeye eklenen dosya sistemi nesneleri ve hizmetleri için sık sık ayrı, Android kimlikleri (AID'ler) olarak bilinen benzersiz kimlikler. Şu anda, dosyalar ve hizmetler temel (Android tanımlı) AID'leri gereksiz yere kullanıyor; birçok bunun yerine OEM (OEM tarafından tanımlanan) AID'leri kullanabilirsiniz.
Android'in önceki sürümlerinde (Android 7.x ve önceki sürümler) AID'ler genişletildi.
Cihaza özel bir android_filesystem_config.h
kullanan mekanizma
dosyası oluşturun. Ancak bu
sistem, OEM AID'ler için güzel adların kullanılmasını desteklemediğinden
satıldıkları gibi pratik değildir.
olmadan kullanıcı ve grup alanları için işlenmemiş bir
kolay bir adı sayısal AID ile ilişkilendirme yöntemidir.
Android'in daha yeni sürümleri (Android 8.0 ve üstü) dosya sistemi özelliklerini artırır. Bu yeni yöntem takip etmek için:
- Yapılandırma dosyaları için birden fazla kaynak konumu (Genişletilebilir derleme yapılandırmaları).
- OEM AID değerlerinin derleme zamanında sağlıklı olma kontrolü.
- Kaynak dosyalarda şu şekilde kullanılabilecek özel bir OEM AID üstbilgisinin oluşturulması: gerekir.
- Kolay kullanılabilen adın gerçek OEM AID değeriyle ilişkilendirilmesi. Destekler kullanıcı ve grup için sayısal olmayan dize bağımsız değişkenleri, ör. "foo" yerine "2901".
Yapılacak diğer iyileştirmeler arasında android_ids[]
adlı SDK'nın kaldırılması yer alıyor.
dizi kaynağı
system/core/libcutils/include/private/android_filesystem_config.h
. Bu
dizisi artık Bionic'te tamamen özel oluşturulmuş bir dizi olarak mevcuttur.
getpwnam()
ve getgrnam()
erişimcileri. (Bu,
temel AID'ler değiştirildiği için kararlı ikili programlar oluşturmanın yan etkisine neden olabilir.) Örneğin,
aracını kullanın ve daha fazla ayrıntı içeren bir BENİOKU dosyası için
build/make/tools/fs_config
Android kimlikleri (AID'ler) ekleyin
Android 8.0, android_ids[]
dizisini Android'den kaldırdı
Açık Kaynak Projesi (AOSP). AID uyumlu tüm adlar bunun yerine şuradan oluşturulmuştur:
system/core/libcutils/include/private/android_filesystem_config.h
başlık dosyasından oluşan düzenleyiciyi kullanabilirsiniz.android_ids[]
Herhangi biri
Araç, eşleşen define
AID_*
seçildi
ve * küçük harf adı olur.
Örneğin, private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
Şu hale gelir:
- Kolay ad: sistem
- uid: 1000
- gid: 1000
Yeni bir AOSP temel AID eklemek için#define
android_filesystem_config.h
başlık dosyası. AID:
derleme sırasında oluşturulur ve kullanıcı ve grup kullanan arayüzler tarafından kullanılabilir hale getirilir
bağımsız değişkenlerdir. Araç, yeni AID'nin uygulamada veya OEM'de olmadığını doğrular
aralıklar; bu aralıklardaki değişikliklere de uyum sağlar ve otomatik olarak
veya OEM tarafından ayrılmış yeni aralıklarda yeniden yapılandırma yapabilirsiniz.
AID'leri yapılandırın
Yeni AID mekanizmasını etkinleştirmek içinTARGET_FS_CONFIG_GEN
BoardConfig.mk
dosya Bu değişken, bir yapılandırma listesi içerir
dosyaları kullanarak gerektiğinde dosya ekleyebilirsiniz.
Kural olarak, yapılandırma dosyaları config.fs
adını kullanır, ancak
pratik yapmak. config.fs
dosya
Python
ConfigParser ini biçimindedir ve büyük harf bölümü içerir (dosyayı yapılandırmak için
sistem özellikleri) ve AID'ler bölümü (OEM AID'lerini yapılandırmak için).
Sınırlar bölümünü yapılandırma
Sınırlar bölümü, dosya derleme (dosya sistemi) içindeki dosya sistemi nesnelerinde yer alan sistem özellikleri (kendisi de bu işlevi desteklemelidir)].
Çünkü Android'de kök olarak kararlı bir hizmet çalıştırmak
Uyumluluk Test Paketi (CTS)
sırasında, çalışan bir yeteneğin saklanmasında
Süreç veya hizmet, özellikleri ayarlamayı ve ardından
Çalıştırmak için uygun bir AID'ye setuid
/setgid
. Büyük harf kullandığınızda
bu gereksinimleri atlayabilir ve çekirdeğin bunu sizin için yapmasını sağlayabilirsiniz. Kontrol şu durumda olduğunda:
İşleminiz main()
tarafından gerçekleştirilebiliyor. Sürecin gerekli tüm özellikleri zaten mevcut.
hizmetinizin kök olmayan bir kullanıcı ve grup kullanabilmesini sağlayın (bu, tercih edilen
yöntemini kullanmaya devam edebilirsiniz).
Sınırlar bölümünde aşağıdaki söz dizimi kullanılır:
Bölüm | Değer | Tanım |
---|---|---|
[path] |
Yapılandırılacak dosya sistemi yolu. / ile biten bir yol dir olarak kabul edilir,
Aksi takdirde bir dosyadır.
Aynı [path] farklı dosyalarda. Python'un <= 3.2 sürümünde
aynı dosya, önceki bölümü geçersiz kılan bölümler içerebilir; Python'da
Yüksek düzey modunda 3.2'de ayarlanmış olmalıdır. |
|
mode |
Sekizli dosya modu | En az 3 basamaklı geçerli bir sekizlik dosya modu. 3 belirtilirse eklenir, aksi takdirde mod olduğu gibi kullanılır. |
user |
AID_<kullanıcı> | Geçerli bir AID veya kolay ad için C define
(ör. hem AID_RADIO hem de radio kabul edilir). Alıcı:
özel bir AID tanımlayın. Daha fazla bilgi için
girin. |
group |
AID_<grup> | Kullanıcı ile aynı. |
caps |
sınır* | Belirtilen ad
bionic/libc/kernel/uapi/linux/capability.h .
CAP_ olmadan. Karma büyük/küçük harfe izin verilir. Başlıklar da
ham:
|
Bir kullanım örneği için bkz. Dosya kullanarak sistem özellikleri.
AID bölümünü yapılandırın
AID bölümünde, OEM AID'ler yer alır ve şu söz dizimi kullanılır:
Bölüm | Değer | Tanım |
---|---|---|
[AID_<name>] |
<name> , kümedeki karakterleri içerebilir
büyük harf, sayılar ve alt çizgilerden oluşur. Küçük harf sürümü,
kolay bir ad. Kod eklemek için oluşturulan başlık dosyası,
AID_<name>
Aynı AID_<name> (aynı kısıtlamalara sahip büyük/küçük harfe duyarlı değil)
[path] ).
<name> , bir bölüm adıyla başlamalıdır.
farklı kaynaklarla çakışmadığından emin olun. |
|
value |
<sayı> | Geçerli bir C stili sayı dizesi (onaltılık, sekizlik, ikilik ve ondalık).
Aynı değer seçeneğiyle birden fazla bölümün belirtilmesi hatadır. Değer seçenekleri, bölüme karşılık gelen aralıkta belirtilmelidir <name> kullanılıyor. Geçerli bölümlerin listesi ve bunlara karşılık gelen
aralıklar system/core/libcutils/include/private/android_filesystem_config.h cinsinden tanımlanır.
Seçenekler şunlardır:
|
Kullanım örnekleri için bkz. OEM'yi tanımlama AID adları ve OEM AID'lerini kullanma.
Kullanım örnekleri
Aşağıdaki örneklerde, OEM AID'nin nasıl tanımlanıp kullanılacağı ve dosya sistemi özelliklerini etkinleştirin. OEM AID adları ([AID_name]) şununla başlamalıdır: "vendor_" gibi bölüm adı çakışmalarını önlemek için AOSP adları veya diğer bölümler.
OEM AID adlarını tanımlayın
OEM AID tanımlamak için config.fs
dosyası oluşturun ve
AID değerini girin. Örneğin, device/x/y/config.fs
içinde
takip etmek için:
[AID_VENDOR_FOO] value: 2900
Dosyayı oluşturduktan sonra TARGET_FS_CONFIG_GEN
değişkenini ayarlayın
BoardConfig.mk
olarak işaretleyin. Örneğin,
device/x/y/BoardConfig.mk
, aşağıdakileri ayarlayın:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
Özel AID'niz artık yeni bir derlemede sistem tarafından genel olarak kullanılabilir.
OEM AID'leri kullanın
OEM AID kullanmak için C kodunuza ilişkilendirilmiş oemaids_headers
Makefile oluşturup #include "generated_oem_aid.h"
ekleyin, ardından beyan edilen dosyayı kullanmaya başlayın
tanımlayıcılar. Örneğin, my_file.c
için aşağıdakileri ekleyin:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
İlişkilendirilmiş Android.bp
dosyanıza aşağıdakileri ekleyin:
header_libs: ["oemaids_headers"],
Android.mk
dosyası kullanıyorsanız şunları ekleyin:
LOCAL_HEADER_LIBRARIES := oemaids_headers
Kolay anlaşılır adlar kullanın
Android 9'da, istediğiniz herhangi bir cihazın kolay adını AID adlarını destekleyen bir arayüz görürsünüz. Örnek:
some/init.rc
komutundachown
komutunda:chown vendor_foo /vendor/some/vendor_foo/file
some/init.rc
bölgesindeki birservice
içinde:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
Kolay addan uid'ye dahili eşleme,
Tedarikçi firma /vendor/etc/passwd
ve /vendor/etc/group
bölümünün eklenmesi gerekir.
Ortak adları ilişkilendir
Android 9, bir yerine gerçek OEM AID değerini girin. Sayısal olmayan bir dize kullanabilirsiniz kullanıcı ve grup için bağımsız değişkenler, yani "vendor_foo" yerine "2901".
AID'den kolay adlara dönüştür
Örneğin,
OEM AID'leri, Android 8.x sürümü,
getpwnam
ve benzer işlevlerle oem_####
, as
getpwnam
ile aramaları işleyen yerlerde (örneğin,
init
komut dosyası). Android 9'da şunları yapabilirsiniz:
Bionic'teki getpwnam
ve getgrnam
arkadaşlarını şunun için kullan:
uygun adlara (AID'ler) dönüştürmenize yardımcı olabilir.
Dosya sistemi özelliklerini kullan
Dosya sistemi özelliklerini etkinleştirmek için
config.fs
dosyası yükleyin. Örneğin,
device/x/y/config.fs
, aşağıdaki bölümü ekleyin:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE.
Dosyayı oluşturduktan sonra, TARGET_FS_CONFIG_GEN
değerini
söz konusu dosyayı BoardConfig.mk
olarak tanımlar. Örneğin,
device/x/y/BoardConfig.mk
, aşağıdakileri ayarlayın:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
vendor_foo
hizmeti yürütüldüğünde başlar
CAP_SYS_ADMIN
ve CAP_SYS_NICE
özellikleriyle
setuid
ve setgid
araması olmadan. Ayrıca,
vendor_foo
hizmetinin SELinux politikası artık geçerli değil
setuid
ve setgid
kapasitesine ihtiyaç vardır ve
silindi.
Geçersiz kılmaları yapılandırma (Android 6.x-7.x)
Android 6.0, fs_config
yerini ve ilişkili yapıyı değiştirdi
tanımlar
(system/core/include/private/android_filesystem_config.h
) -
system/core/libcutils/fs_config.c
veya
şuna yüklenen ikili program dosyaları tarafından geçersiz kılındı:
/system/etc/fs_config_dirs
ve
/system/etc/fs_config_files
. Ayrı eşleştirme ve ayrıştırma kullanma
dizinler ve dosyalar için kurallar (ek glob ifadeleri kullanabilir)
Android'in dizinleri ve dosyaları iki farklı tabloda işlemesini sağladı.
system/core/libcutils/fs_config.c
dilindeki yapı tanımları
dizinlerin ve dosyaların yalnızca çalışma zamanında okunmasına izin verdi, ancak ana makine
oluşturmak için derleme sırasında aynı dosyaları
${OUT}/system/etc/fs_config_dirs
ve
${OUT}/system/etc/fs_config_files
.
Dosya sistemini genişletmenin geçersiz kılma yönteminin yerini modüler yapılandırma sistemini kullanmaktan sorumlu olduğunuzda, yöntemini de kullanabilirsiniz. Aşağıdaki bölümlerde, reklam öğesinin nasıl oluşturulacağı ve dahil edileceği dosyaları geçersiz kılma ve dosya sistemini yapılandırma.
Geçersiz kılma dosyaları oluşturma
Uyumlu ikili dosyalar oluşturabilirsiniz.
/system/etc/fs_config_dirs
ve
/system/etc/fs_config_files
build/tools/fs_config
aracındaki fs_config_generate
aracı İlgili içeriği oluşturmak için kullanılan
araç bir libcutils
kitaplık işlevi kullanıyor
(fs_config_generate()
) DAC gereksinimlerini tampon olarak yönetmek için
ve DAC kurallarını kurumsalleştirmek için bir dahil etme dosyası kurallarını tanımlar.
Kullanmak için
device/vendor/device/android_filesystem_config.h
.
işlevi görür. Dosya,
structure fs_path_config
biçimi şurada tanımlanıyor:
Şunu içeren: system/core/include/private/android_filesystem_config.h
dizin ve dosya simgeleri için aşağıdaki yapı başlatma işlemleri:
- Dizinler için
android_device_dirs[]
kullanın. - Dosyalar için
android_device_files[]
kullanın.
android_device_dirs[]
ve
android_device_files[]
, anahtar kelime,
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
ve
NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
(bkz.
örnek için geçerlidir). Ayrıca, geçersiz kılmayı da
Jamboard'da TARGET_ANDROID_FILESYSTEM_CONFIG_H
kullanarak dosya
zorunlu kılınan temel adı içeren yapılandırma
android_filesystem_config.h
.
Geçersiz kılma dosyalarını dahil et
Dosya eklemek için PRODUCT_PACKAGES
öğesinin içerdiğinden emin olun
Bunu yapabilmek için fs_config_dirs
ve/veya fs_config_files
/system/etc/fs_config_dirs
ürününe yükleyin ve
Sırasıyla /system/etc/fs_config_files
. Derleme sistemi
içinde özel android_filesystem_config.h
araması
BoardConfig.mk
özelliğinin bulunduğu $(TARGET_DEVICE_DIR)
.
Bu dosya başka bir yerde mevcutsa pano yapılandırması değişkenini ayarlayın
TARGET_ANDROID_FILESYSTEM_CONFIG_H
tuşlarına basarak bu konumu görebilirsiniz.
Dosya sistemini yapılandırma
Android 6.0 ve sonraki sürümlerde dosya sistemini yapılandırmak için:
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
oluşturun dosyası olarak kaydedebilirsiniz.fs_config_dirs
ve/veyafs_config_files
ekleyin:PRODUCT_PACKAGES
anakart yapılandırma dosyasına (ör.$(TARGET_DEVICE_DIR)/device.mk
) bilgileri gösterilir.
Geçersiz kılma örneği
Bu örnekte, system/bin/glgps
politikasını geçersiz kılmak için bir yama gösterilmektedir
uyanık kalma kilidi desteği eklemek için arka plan
device/vendor/device
dizini. Şunu sakla:
şunları göz önünde bulundurun:
- Her yapı girişi; mode, uid, gid, özellikler ve addır.
system/core/include/private/android_filesystem_config.h
#defines manifest dosyasını sağlamak için otomatik olarak eklenir (AID_ROOT
,AID_SHELL
,CAP_BLOCK_SUSPEND
) tıklayın. android_device_files[]
bölümünde şunlara yönelik bir işlem yer alır: Belirtilmediğindesystem/etc/fs_config_dirs
erişimini gizle, Bu, dizin için içerik eksikliğine karşı ek bir DAC koruması işlevi görür geçersiz kılma işlemlerini yapabilirsiniz. Ancak bu, zayıf bir korumadır. herhangi birinin kontrolü sizdeyse/system
, genellikle istedikleri her şeyi yapabilirler.
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)
Önceki sürümlerden dosya sistemlerini taşıma
Android 5.x ve önceki sürümlerden dosya sistemlerini taşırken, Android 6.x
- Bazı özellikleri, yapıları ve satır içi tanımları kaldırır.
- Doğrudan çalıştırmak yerine
libcutils
öğesine referans gerektirirsystem/core/include/private/android_filesystem_config.h
başlangıç fiyatıyla. Dosya içinsystem/code/include/private_filesystem_config.h
veya dizin yapıları veyafs_config
,libcutils
eklemelidir bağımlılıklarını belirleyebilirsiniz. -
system/core/include/private/android_filesystem_config.h
Mevcut hedeflerde taşınacak fazladan içerikdevice/vendor/device/android_filesystem_config.h
. - SELinux Zorunlu Erişim Denetimleri'ni (MAC)
yapılandırma dosyalarını, hedef sistemde bulunan özel yapılandırma dosyalarını
fs_config()
kullanılarak yürütülebilir öğelerin hedeflenmesi, erişimin sağlandığından emin olmalıdır.