اشیا و سرویسهای فایل سیستمی که به ساخت اضافه میشوند اغلب به شناسههای مجزا و منحصربهفرد نیاز دارند که به نام Android ID (AIDs) شناخته میشوند. در حال حاضر، بسیاری از منابع مانند فایلها و سرویسها بهطور غیرضروری از ایدزهای اصلی (تعریف شده توسط اندروید) استفاده میکنند. در بسیاری از موارد می توانید به جای آن از AID های OEM (OEM-Defined) استفاده کنید.
نسخههای قبلی Android (Android 7.x و پایینتر) مکانیسم AIDs را با استفاده از یک فایل android_filesystem_config.h
مخصوص دستگاه برای مشخص کردن قابلیتهای سیستم فایل و/یا AIDهای OEM سفارشی گسترش دادند. با این حال، این سیستم غیرمعمول بود، زیرا از استفاده از نامهای خوب برای AIDهای OEM پشتیبانی نمیکرد، و شما را ملزم میکرد که عدد خام را برای فیلدهای کاربر و گروه بدون هیچ راهی برای مرتبط کردن یک نام دوستانه با AID عددی مشخص کنید.
نسخه های جدیدتر اندروید (اندروید 8.0 و بالاتر) از روش جدیدی برای گسترش قابلیت های سیستم فایل پشتیبانی می کنند. این روش جدید از موارد زیر پشتیبانی می کند:
- چندین مکان منبع برای فایل های پیکربندی (پیکربندی های ساخت قابل توسعه را فعال می کند).
- بررسی سلامت عقل در زمان ساخت مقادیر AID OEM.
- تولید یک هدر سفارشی OEM AID که می تواند در صورت نیاز در فایل های منبع استفاده شود.
- ارتباط یک نام دوستانه با ارزش واقعی OEM AID. از آرگومان های رشته ای غیر عددی برای کاربر و گروه پشتیبانی می کند، یعنی "foo" به جای "2901".
بهبودهای اضافی شامل حذف آرایه android_ids[]
از system/core/libcutils/include/private/android_filesystem_config.h
. این آرایه اکنون در Bionic بهعنوان یک آرایه کاملاً خصوصی تولید شده با دسترسیهایی با getpwnam()
و getgrnam()
وجود دارد. (این اثر جانبی تولید باینری های پایدار را دارد زیرا AID های اصلی اصلاح می شوند.) برای ابزار و فایل README با جزئیات بیشتر، به build/make/tools/fs_config
مراجعه کنید.
افزودن شناسه های اندروید (AIDS)
Android 8.0 آرایه android_ids[]
را از پروژه منبع باز Android (AOSP) حذف کرد. همه نامهای سازگار با AID در عوض از فایل هدر system/core/libcutils/include/private/android_filesystem_config.h
هنگام تولید آرایه Bionic android_ids[]
تولید میشوند. هر define
مطابق با AID_*
توسط ابزار انتخاب می شود و * به نام کوچک تبدیل می شود.
به عنوان مثال، در private/android_filesystem_config.h
:
#define AID_SYSTEM 1000
می شود:
- نام دوستانه: سیستم
- یوید: 1000
- gid: 1000
برای افزودن یک AID هسته AOSP جدید، به سادگی #define
به فایل هدر android_filesystem_config.h
اضافه کنید. AID در زمان ساخت تولید می شود و در دسترس رابط هایی قرار می گیرد که از آرگومان های کاربر و گروه استفاده می کنند. ابزار تأیید می کند که AID جدید در محدوده APP یا OEM نیست. همچنین به تغییرات آن محدودهها احترام میگذارد و باید بهطور خودکار روی تغییرات یا محدودههای جدید رزرو شده توسط OEM پیکربندی مجدد شود.
پیکربندی ایدز
برای فعال کردن مکانیسم AIDs جدید، TARGET_FS_CONFIG_GEN
را در فایل BoardConfig.mk
تنظیم کنید. این متغیر فهرستی از فایل های پیکربندی را در خود جای می دهد که به شما امکان می دهد در صورت نیاز فایل ها را اضافه کنید.
طبق قرارداد، فایل های پیکربندی از نام config.fs
استفاده می کنند، اما در عمل می توانید از هر نامی استفاده کنید. فایلهای config.fs
در قالب Python ConfigParser ini هستند و شامل یک بخش caps (برای پیکربندی قابلیتهای سیستم فایل) و یک بخش AIDs (برای پیکربندی OEM AIDs) هستند.
قسمت caps را پیکربندی کنید
بخش caps از تنظیم قابلیت های سیستم فایل بر روی اشیاء سیستم فایل در ساخت پشتیبانی می کند (خود سیستم فایل نیز باید از این قابلیت پشتیبانی کند).
از آنجایی که اجرای یک سرویس پایدار بهعنوان روت در اندروید باعث خرابی مجموعه تست سازگاری (CTS) میشود، الزامات قبلی برای حفظ یک قابلیت در حین اجرای یک فرآیند یا سرویس مستلزم راهاندازی قابلیتها و سپس استفاده از setuid
/ setgid
به یک AID مناسب برای اجرا بود. با استفاده از caps، میتوانید این الزامات را نادیده بگیرید و از هسته بخواهید این کار را برای شما انجام دهد. هنگامی که کنترل به main()
داده میشود، فرآیند شما از قبل قابلیتهای مورد نیاز خود را دارد، بنابراین سرویس شما میتواند از یک کاربر و گروه nonroot استفاده کند (این روش ترجیحی برای شروع سرویسهای ممتاز است).
بخش caps از نحو زیر استفاده می کند:
بخش | ارزش | تعریف |
---|---|---|
[path] | مسیر فایل سیستم برای پیکربندی. مسیری که به / ختم می شود یک dir در نظر گرفته می شود، در غیر این صورت یک فایل است. تعیین چندین بخش با [path] یکسان در فایل های مختلف یک خطا است. در نسخه های پایتون <= 3.2، همان فایل ممکن است شامل بخش هایی باشد که بخش قبلی را لغو می کند. در پایتون 3.2، روی حالت سخت تنظیم شده است. | |
mode | حالت فایل هشتگانه | حالت فایل هشتگانه معتبر حداقل 3 رقمی. اگر 3 مشخص شده باشد، پیشوند آن 0 است، حالت else همانطور که هست استفاده می شود. |
user | AID_<کاربر> | یا C برای یک AID معتبر define یا نام دوستانه (مثلا AID_RADIO و radio هر دو قابل قبول هستند). برای تعریف یک AID سفارشی، به پیکربندی بخش AID مراجعه کنید. |
group | AID_<گروه> | همان کاربر. |
caps | سرپوش* | نامی که در bionic/libc/kernel/uapi/linux/capability.h بدون CAP_ پیشرو اعلام شده است. مورد مختلط مجاز است. کلاه ها همچنین می توانند خام باشند:
|
برای مثال استفاده، استفاده از قابلیت های سیستم فایل را ببینید.
بخش AID را پیکربندی کنید
بخش AID شامل AID های OEM است و از نحو زیر استفاده می کند:
بخش | ارزش | تعریف |
---|---|---|
[AID_<name>] | <name> می تواند شامل کاراکترهایی با حروف بزرگ، اعداد و زیرخط باشد. نسخه کوچک به عنوان نام دوستانه استفاده می شود. فایل هدر تولید شده برای گنجاندن کد از AID_<name> دقیق استفاده می کند.تعیین چندین بخش با AID_<name> یکسان (بدون حساس به حروف کوچک با محدودیت های یکسان به عنوان [path] ) یک خطا است.<name> باید با نام پارتیشن شروع شود تا اطمینان حاصل شود که با منابع مختلف تضاد ندارد. | |
value | <تعداد> | یک رشته عددی معتبر به سبک C (هگز، اکتال، باینری و اعشاری). این یک خطا است که چندین بخش را با گزینه مقدار یکسان مشخص کنید. گزینه های مقدار باید در محدوده مربوط به پارتیشن مورد استفاده در <name> مشخص شوند. فهرست پارتیشنهای معتبر و محدودههای مربوط به آنها در system/core/libcutils/include/private/android_filesystem_config.h تعریف شده است. گزینه ها عبارتند از:
|
برای مثالهای استفاده، به تعریف نامهای OEM AID و استفاده از OEM AIDs مراجعه کنید.
نمونه های استفاده
مثالهای زیر نحوه تعریف و استفاده از OEM AID و نحوه فعال کردن قابلیتهای سیستم فایل را توضیح میدهند. نامهای OEM AID ( [AID_ name ] ) باید با نام پارتیشنی مانند " vendor_ " شروع شوند تا اطمینان حاصل شود که با نامهای AOSP آینده یا سایر پارتیشنها تضاد ندارند.
نام های OEM AID را تعریف کنید
برای تعریف یک OEM AID، یک فایل config.fs
ایجاد کنید و مقدار AID را تنظیم کنید. به عنوان مثال، در device/x/y/config.fs
، موارد زیر را تنظیم کنید:
[AID_VENDOR_FOO] value: 2900
پس از ایجاد فایل، متغیر TARGET_FS_CONFIG_GEN
را تنظیم کرده و در BoardConfig.mk
به آن اشاره کنید. به عنوان مثال، در device/x/y/BoardConfig.mk
موارد زیر را تنظیم کنید:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
AID سفارشی شما اکنون می تواند توسط سیستم به طور کلی در یک ساخت جدید مصرف شود.
از AID های OEM استفاده کنید
برای استفاده از OEM AID، در کد C خود، oemaids_headers
در Makefile مرتبط خود وارد کنید و #include "generated_oem_aid.h"
را اضافه کنید، سپس شروع به استفاده از شناسه های اعلام شده کنید. به عنوان مثال، در my_file.c
، موارد زیر را اضافه کنید:
#include "generated_oem_aid.h" … If (ipc->uid == AID_VENDOR_FOO) { // Do something ...
در فایل Android.bp
مرتبط خود، موارد زیر را اضافه کنید:
header_libs: ["oemaids_headers"],
اگر از فایل Android.mk
استفاده می کنید، موارد زیر را اضافه کنید:
LOCAL_HEADER_LIBRARIES := oemaids_headers
از اسامی دوستانه استفاده کنید
در اندروید 9 میتوانید از نام دوستانه برای هر رابطی که از نامهای AID پشتیبانی میکند استفاده کنید. به عنوان مثال:
- در یک دستور
chown
درsome/init.rc
:chown vendor_foo /vendor/some/vendor_foo/file
- در یک
service
درsome/init.rc
:service vendor_foo /vendor/bin/foo_service user vendor_foo group vendor_foo
از آنجا که نگاشت داخلی از نام دوستانه به uid توسط /vendor/etc/passwd
و /vendor/etc/group
انجام می شود، پارتیشن فروشنده باید نصب شود.
نام های دوستانه را مرتبط کنید
اندروید 9 شامل پشتیبانی برای مرتبط کردن یک نام دوستانه با مقدار واقعی OEM AID است. میتوانید از آرگومانهای رشته غیرعددی برای کاربر و گروه استفاده کنید، یعنی « vendor_ foo» به جای «2901».
از AID به نام های دوستانه تبدیل کنید
برای OEM AIDs ، Android 8.x به استفاده از oem_####
با getpwnam
و توابع مشابه، و همچنین در مکانهایی که جستجوها را با getpwnam
انجام میدهند (مانند اسکریپتهای init
) نیاز دارد. در اندروید 9 میتوانید از دوستان getpwnam
و getgrnam
در Bionic برای تبدیل از شناسههای اندروید (AIDs) به نامهای دوستانه و بالعکس استفاده کنید.
از قابلیت های سیستم فایل استفاده کنید
برای فعال کردن قابلیت های سیستم فایل، یک بخش caps در فایل config.fs
ایجاد کنید. به عنوان مثال، در device/x/y/config.fs
، بخش زیر را اضافه کنید:
[system/bin/foo_service] mode: 0555 user: AID_VENDOR_FOO group: AID_SYSTEM caps: SYS_ADMIN | SYS_NICE
پس از ایجاد فایل، TARGET_FS_CONFIG_GEN
را تنظیم کنید تا به آن فایل در BoardConfig.mk
اشاره کند. به عنوان مثال، در device/x/y/BoardConfig.mk
موارد زیر را تنظیم کنید:
TARGET_FS_CONFIG_GEN += device/x/y/config.fs
هنگامی که سرویس vendor_ foo
اجرا می شود، با قابلیت های CAP_SYS_ADMIN
و CAP_SYS_NICE
بدون تماس های setuid
و setgid
شروع می شود. علاوه بر این، خط مشی SELinux سرویس vendor_ foo
دیگر نیازی به قابلیت setuid
و setgid
ندارد و قابل حذف است.
پیکربندی موارد لغو (Android 6.x-7.x)
Android 6.0 fs_config
و تعاریف ساختار مرتبط ( system/core/include/private/android_filesystem_config.h
) را به system/core/libcutils/fs_config.c
منتقل کرد، جایی که میتوان آنها را با فایلهای باینری نصب شده در /system/etc/fs_config_dirs
بهروزرسانی یا لغو کرد. /system/etc/fs_config_files
. استفاده از قوانین تطبیق و تجزیه جداگانه برای دایرکتوری ها و فایل ها (که می تواند از عبارات glob اضافی استفاده کند) اندروید را قادر می سازد تا فهرست ها و فایل ها را در دو جدول مختلف مدیریت کند. تعاریف ساختار در system/core/libcutils/fs_config.c
نه تنها خواندن زمان اجرا دایرکتوریها و فایلها را اجازه میدهد، بلکه میزبان میتواند از همان فایلها در طول زمان ساخت برای ساخت تصاویر سیستم فایل مانند ${OUT}/system/etc/fs_config_dirs
و ${OUT}/system/etc/fs_config_files
.
در حالی که روش نادیده گرفتن گسترش سیستم فایل توسط سیستم پیکربندی ماژولار معرفی شده در اندروید 8.0 جایگزین شده است، در صورت تمایل همچنان می توانید از روش قدیمی استفاده کنید. بخشهای زیر نحوه تولید و گنجاندن فایلهای جایگزین و پیکربندی سیستم فایل را توضیح میدهد.
ایجاد فایل های نادیده گرفته شده
می توانید فایل های باینری تراز شده /system/etc/fs_config_dirs
و /system/etc/fs_config_files
با استفاده از ابزار fs_config_generate
در build/tools/fs_config
ایجاد کنید. این ابزار از تابع کتابخانه libcutils
( fs_config_generate()
) برای مدیریت نیازمندی های DAC در بافر استفاده می کند و قوانینی را برای یک فایل include تعریف می کند تا قوانین DAC را نهادینه کند.
برای استفاده، یک فایل شامل در device/ vendor / device /android_filesystem_config.h
ایجاد کنید که به عنوان لغو عمل می کند. فایل باید از فرمت structure fs_path_config
تعریف شده در system/core/include/private/android_filesystem_config.h
با مقداردهی اولیه ساختار زیر برای دایرکتوری و نمادهای فایل استفاده کند:
- برای دایرکتوری ها، از
android _device _dirs[]
استفاده کنید. - برای فایلها، از
android _device _files[]
استفاده کنید.
وقتی از android_device_dirs[]
و android_device_files[]
استفاده نمی کنید، می توانید NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
و NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES
را تعریف کنید (به مثال زیر مراجعه کنید). همچنین میتوانید فایل لغو را با استفاده از TARGET_ANDROID_FILESYSTEM_CONFIG_H
در پیکربندی برد، با نام پایه اجباری android_filesystem_config.h
مشخص کنید.
شامل فایل های نادیده گرفته شود
برای گنجاندن فایلها، مطمئن شوید که PRODUCT_PACKAGES
شامل fs_config_dirs
و/یا fs_config_files
باشد تا بتواند آنها را به ترتیب در /system/etc/fs_config_dirs
و /system/etc/fs_config_files
نصب کند. سیستم ساخت، android_filesystem_config.h
سفارشی را در $(TARGET_DEVICE_DIR)
جستجو می کند، جایی که BoardConfig.mk
وجود دارد. اگر این فایل در جای دیگری وجود دارد، متغیر پیکربندی برد TARGET_ANDROID_FILESYSTEM_CONFIG_H
را تنظیم کنید تا به آن مکان اشاره کند.
فایل سیستم را پیکربندی کنید
برای پیکربندی فایل سیستم در اندروید 6.0 و بالاتر:
- فایل
$(TARGET_DEVICE_DIR)/android_filesystem_config.h
را ایجاد کنید. -
fs_config_dirs
و/یاfs_config_files
را بهPRODUCT_PACKAGES
در فایل پیکربندی برد اضافه کنید (به عنوان مثال،$(TARGET_DEVICE_DIR)/device.mk
).
نادیده گرفتن مثال
این مثال وصلهای برای نادیده گرفتن دیمون system/bin/glgps
برای افزودن پشتیبانی wake lock در دایرکتوری device/ vendor / device
نشان میدهد. موارد زیر را در نظر داشته باشید:
- هر ورودی ساختار حالت، uid، gid، قابلیت ها و نام است.
system/core/include/private/android_filesystem_config.h
به طور خودکار برای ارائه مانیفست #defines گنجانده شده است (AID_ROOT
،AID_SHELL
،CAP_BLOCK_SUSPEND
). - بخش
android_device_files[]
شامل اقدامی برای جلوگیری از دسترسی بهsystem/etc/fs_config_dirs
در صورت نامشخص است، که به عنوان یک حفاظت DAC اضافی برای کمبود محتوا برای لغو فهرستکار عمل میکند. با این حال، این محافظت ضعیف است. اگر کسی بر/system
کنترل داشته باشد، معمولاً می تواند هر کاری را که می خواهد انجام دهد.
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)
سیستم های فایل را از نسخه های قبلی منتقل کنید
هنگام مهاجرت سیستم های فایل از Android 5.x و نسخه های قبلی، به خاطر داشته باشید که Android 6.x
- برخی شامل، ساختارها و تعاریف درون خطی را حذف می کند.
- به جای اجرای مستقیم از
system/core/include/private/android_filesystem_config.h
بهlibcutils
نیاز دارد. فایل های اجرایی خصوصی سازنده دستگاه که برای ساختار فایل یا دایرکتوری بهsystem/code/include/private_filesystem_config.h
یاfs_config
وابسته هستند، باید وابستگی های کتابخانهlibcutils
را اضافه کنند. - برای انتقال به
device/ vendor / device /android_filesystem_config.h
نیاز به نسخههای شاخه خصوصی سازنده دستگاه ازsystem/core/include/private/android_filesystem_config.h
با محتوای اضافی در اهداف موجود دارد. - حق اعمال کنترلهای دسترسی اجباری SELinux (MAC) را برای فایلهای پیکربندی در سیستم هدف محفوظ میدارد، پیادهسازیهایی که شامل فایلهای اجرایی هدف سفارشی با استفاده از
fs_config()
هستند باید دسترسی را تضمین کنند.