غالبًا ما تحتاج كائنات وخدمات نظام الملفات المضافة إلى الإصدار منفصلة، المعرّفات الفريدة، المعروفة باسم معرّفات Android (AIDs). في الوقت الحالي، هناك العديد من الموارد مثل الملفات والخدمات التي تستخدم أدوات AID أساسية (محدّدة من خلال نظام التشغيل Android) بدون داعٍ في العديد من الحالات التي يمكنك فيها استخدام معرّفات المُصنّع الأصلي للجهاز (OEM) بدلاً من ذلك.
وسّعت الإصدارات السابقة من نظام التشغيل Android (الإصدار 7.x والإصدارات الأقدم) نطاق AIDs.
آلية تستخدم android_filesystem_config.h
خاصة بالجهاز
لتحديد إمكانات نظام الملفات و/أو المعرّفات المخصصة للمصنّع الأصلي للجهاز. ومع ذلك،
كان غير بديهيّ، إذ إنّه لم يكن يتيح استخدام أسماء لطيفة لأرقام تعريف المصنّعين الأصليين
مما يتطلب منك تحديد الرقم الأولي لحقلي المستخدم والمجموعة بدون
لربط اسم مألوف بالرمز الرقمي AID.
تدعم الإصدارات الأحدث من نظام التشغيل Android (Android 8.0 والإصدارات الأعلى) طريقة جديدة وتوسيع إمكانات نظام الملفات. وتدعم هذه الطريقة الجديدة التالي:
- مواقع مصدر متعددة لملفات الإعداد (تفعيل الامتداد تكوينات التصميم).
- التحقّق من سلامة المصنّع الأصلي للجهاز بعد التحقّق من صحة قيم AID للمصنّع الأصلي للجهاز
- إنشاء عنوان AID مخصّص للمصنّع الأصلي للجهاز يمكن استخدامه في ملفات المصدر احتاجت.
- ارتباط اسم مناسب بقيمة AID الفعلية للمصنّع الأصلي للجهاز يدعم وسيطات سلسلة غير رقمية للمستخدم والمجموعة، أي "foo" بدلاً من "2901".
تشمل التحسينات الإضافية إزالة android_ids[]
صفيف من
system/core/libcutils/include/private/android_filesystem_config.h
هذا النمط
توجد الآن الصفيفة في Bionic كصفيفة تم إنشاؤها بشكل خاص،
الموصّلات مع getpwnam()
وgetgrnam()
. (يتضمن هذا
الأثر الجانبي لإنتاج برامج ثنائية مستقرة فيما يتم تعديل معرّفات AID الأساسية). بالنسبة
وملف README بمزيد من التفاصيل، فراجع
build/make/tools/fs_config
إضافة معرّفات Android (AID)
أزال 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
يصبح:
- اسم سهل الاستخدام: النظام
- uid: 1000
- رقم تعريف النشاط التجاري (gid): 1000
لإضافة معرّف AID أساسي جديد من AOSP، ما عليك سوى إضافة #define
إلى
ملف العنوان android_filesystem_config.h
AID هو
التي تم إنشاؤها في الإصدار وإتاحتها للواجهات التي تستخدم حسابات المستخدمين والمجموعات
الوسيطة. تتأكّد الأدوات من أنّ أداة المساعدة الجديدة ليست داخل التطبيق أو المصنّع الأصلي للجهاز.
النطاقات كما أنها تراعي التغييرات التي تطرأ على هذه النطاقات ويجب أن
إعادة الضبط حسب التغييرات أو النطاقات الجديدة المحجوزة من قِبل المصنّع الأصلي للجهاز.
إعداد معرّفات AID
لتفعيل آلية AID الجديدة، يمكنك ضبط TARGET_FS_CONFIG_GEN
في
ملف BoardConfig.mk
. يحتوي هذا المتغير على قائمة بالضبط
الملفات، مما يتيح لك إلحاق الملفات حسب الحاجة.
حسب الاصطلاح، تستخدم ملفات الإعداد الاسم config.fs
، ولكن في
والممارسة يمكنك استخدام أي اسم. هناك ملفان (config.fs
) في
Python
تنسيق ConfigParser ini وتضمين قسم أحرف كبيرة (لإعداد الملف)
إمكانات النظام) وقسم AID (لإعداد معرّفات المصنّعين الأصليين للأجهزة).
إعداد قسم الأحرف الكبيرة
يتيح قسم الأحرف الكبيرة إعداد ملف إمكانات النظام على كائنات نظام الملفات في الإصدار (نظام الملفات) نفسها أيضًا أن تدعم هذه الوظيفة).
نظرًا لأن تشغيل خدمة مستقرة كجذر في Android يؤدي إلى
مجموعة أدوات اختبار التوافق (CTS)
فشل؛ أي متطلبات سابقة للاحتفاظ بإمكانية أثناء تشغيل
عملية أو خدمة تتضمن إعداد الإمكانات ثم استخدام
setuid
/setgid
إلى معرّف AID مناسب للتشغيل مع الأحرف الكبيرة، يمكنك
تخطي هذه المتطلبات وجعل النواة تجري ذلك نيابةً عنك. عندما يكون عنصر التحكم
تم تسليمه إلى main()
، فإن العملية تتضمن الإمكانات اللازمة
حتى تتمكن خدمتك من استخدام مستخدم ومجموعة غير جذرية (هذا هو الخيار المفضل
لبدء الخدمات المميزة).
يستخدم قسم الأحرف الكبيرة الصيغة التالية:
القسم | القيمة | التعريف |
---|---|---|
[path] |
مسار نظام الملفات المطلوب ضبطه. المسار الذي ينتهي بـ / يعتبر ديرًا،
وإلا فالملف.
حدث خطأ أثناء تحديد عدة أقسام تتضمن العنصر نفسه. [path] في ملفات مختلفة. في إصدارات بايثون <= 3.2، يعتبر
قد يحتوي الملف نفسه على أقسام تتجاوز القسم السابق. في Python
3.2، يتم تعيينه على الوضع المتشدد. |
|
mode |
وضع الملف الثماني | وضع ملف ثماني صالح مكوّن من 3 أرقام على الأقل. إذا تم تحديد 3، تبدأ بـ 0، ويتم استخدام وضع else كما هي. |
user |
AID_<user> | إما C define للحصول على معرّف AID صالح أو الاسم المألوف
(مثلاً، يمكن استخدام كلّ من AID_RADIO وradio ). إلى
تحديد معرّف AID مخصّص، راجع ضبط
قسم AID. |
group |
AID_<group> | تمامًا مثل المستخدم. |
caps |
غطاء رأس* | الاسم كما هو موضح في
bionic/libc/kernel/uapi/linux/capability.h
بدون CAP_ البادئة. يُسمح باستخدام حالة مختلطة. يمكن أيضًا أن تكون الأحرف
البيانات الأولية:
|
للاطلاع على مثال حول الاستخدام، راجع استخدام ملف إمكانات النظام
ضبط قسم AID
يحتوي قسم AID على معرّفات المُصنّع الأصلي للجهاز ويستخدم الصيغة التالية:
القسم | القيمة | التعريف |
---|---|---|
[AID_<name>] |
يمكن أن يحتوي <name> على أحرف في المجموعة
والأحرف الكبيرة والأرقام والشرطات السفلية. تُستخدم النسخة الصغيرة
اسم لطيف جدًا. يستخدم ملف الرأس الذي تم إنشاؤه لتضمين الرمز البرمجي البيانات الدقيقة
AID_<name>
حدث خطأ أثناء تحديد عدة أقسام تتضمن العنصر نفسه. AID_<name> (غير حساس لحالة الأحرف مع القيود نفسها مثل
[path] ).
يجب أن يبدأ <name> باسم قسم لضمان
وأنّها لا تتعارض مع مصادر مختلفة |
|
value |
<العدد> | سلسلة صالحة لرقم نمط C (ست عشري، ثماني، وثنائي، وعشري).
حدث خطأ عند تحديد عدة أقسام تستخدم خيار القيمة نفسه. يجب تحديد خيارات القيمة في النطاق المقابل للقسم. مُستخدَمة في <name> . قائمة الأقسام الصالحة والأقسام
يتم تحديد النطاقات في system/core/libcutils/include/private/android_filesystem_config.h .
الخيارات هي:
|
للاطّلاع على أمثلة على الاستخدام، راجِع تعريف المصنّع الأصلي للجهاز. أسماء AID واستخدام AIDs من قِبل المصنّعين الأصليين
أمثلة على استخدام هذه الكلمة في جملة
توضّح الأمثلة التالية بالتفصيل كيفية تحديد معرّف المصنّع الأصلي للجهاز واستخدامه وكيفية لتمكين إمكانيات نظام الملفات. أسماء AID للمصنّعين الأصليين ([AID_name]) يجب أن يبدأ بـ اسم القسم مثل "vendor_" لضمان عدم تضاربها مع أسماء بروتوكول AOSP أو الأقسام الأخرى
تحديد أسماء AID للمصنّع الأصلي للجهاز
لتحديد معرّف 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 من مُصنّع أصلي، يجب تضمين oemaids_headers
في الرمز C في رمز C
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
استخدام أسماء مألوفة
في نظام Android 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
، المورّد
يجب تثبيت الجزء العلوي.
أسماء المعارف المقترنة
يتيح نظام التشغيل Android 9 إمكانية ربط اسم مناسب مع قيمة AID الفعلية للمصنّع الأصلي للجهاز. يمكنك استخدام سلسلة غير رقمية وسيطات للمستخدم والمجموعة، وهي "vendor_foo" بدلاً من "2901".
التحويل من AID إلى أسماء مألوفة
بالنسبة
مساعدات المصنّعين الأصليين للأجهزة، يتطلب الإصدار Android 8.x استخدام
الدالة oem_####
مع getpwnam
ودوال مشابهة، مثل
أيضًا في الأماكن التي تعالج عمليات البحث باستخدام getpwnam
(مثل
نص برمجي واحد (init
)). في Android 9، يمكنك
استخدام الأصدقاء getpwnam
وgetgrnam
في Bionic
التحويل من معرّفات Android (AID) إلى أسماء مألوفة والعكس صحيح.
استخدام إمكانيات نظام الملفات
لتمكين إمكانات نظام الملفات، أنشئ قسمًا للأحرف الكبيرة في
ملف 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 إضافية)
تم تفعيل Android من التعامل مع الأدلّة والملفات في جدولَين مختلفَين.
ليست تعريفات البنية باللغة system/core/libcutils/fs_config.c
السماح بقراءة الأدلة والملفات فقط في وقت التشغيل، ولكن يمكن للمضيف استخدام
الملفات نفسها أثناء وقت الإصدار لإنشاء صور نظام الملفات
${OUT}/system/etc/fs_config_dirs
و
${OUT}/system/etc/fs_config_files
بينما حلت طريقة إلغاء تمديد نظام الملفات محل وهو نظام التهيئة المعيارية الذي تم تقديمه في Android 8.0، فلا يزال بإمكانكم استخدام إذا رغبت في ذلك. توضح الأقسام التالية بالتفصيل كيفية إنشاء ملفات تعريف الارتباط وتضمينها في الملفات أكثر وتهيئة نظام الملفات.
إنشاء ملفات إلغاء
يمكنك إنشاء ملفات ثنائية تمت محاذاتها
/system/etc/fs_config_dirs
و
/system/etc/fs_config_files
باستخدام
أداة fs_config_generate
في build/tools/fs_config
. تشير رسالة الأشكال البيانية
تستخدم أداة مكتبة libcutils
(fs_config_generate()
) لإدارة متطلبات DAC في مورد احتياطي
وتحدد قواعد ملف التضمين لإضفاء الطابع المؤسسي على قواعد 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
للإشارة إلى هذا الموقع.
إعداد نظام الملفات
لضبط نظام الملفات في Android 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
برنامج خفي لإضافة إتاحة قفل التنشيط في
دليل device/vendor/device
. إبقاء
مع وضع ما يلي في الاعتبار:
- كل إدخال في البنية هو الوضع والمعرِّف الفريد والمعرِّف المميز والإمكانيات والاسم.
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 والإصدارات الأقدم، ضَع في اعتبارك ما يلي: الإصدار 6.x من نظام التشغيل Android
- إزالة بعض التعريفات والبنى والتعريفات المضمَّنة.
- يجب الإشارة إلى
libcutils
بدلاً من أن تكون قيد التشغيل مباشرةً. ابتداءً منsystem/core/include/private/android_filesystem_config.h
الملفات التنفيذية الخاصة بالشركة المصنّعة للجهاز والتي تعتمد علىsystem/code/include/private_filesystem_config.h
للملف أو بنيات الأدلة أو يجب علىfs_config
إضافةlibcutils
وتبعيات المكتبة. - تتطلب نُسخًا فرعية خاصة من الشركة المصنّعة للجهاز
system/core/include/private/android_filesystem_config.h
باستخدام محتوى إضافي على الأهداف الحالية للانتقال إليهdevice/vendor/device/android_filesystem_config.h
- يحتفظ بالحق في تطبيق عناصر التحكم في الوصول الإلزامية (MAC) في SELinux على
على النظام الهدف، وعمليات التنفيذ التي تتضمن
الملفات التنفيذية المستهدفة التي تستخدم
fs_config()
يجب أن تضمن إمكانية الوصول.