در اندروید 10، ConfigStore HAL از پرچمهای ساخت برای ذخیره مقادیر پیکربندی در پارتیشن vendor
استفاده میکند، و یک سرویس در پارتیشن system
با استفاده از HIDL به آن مقادیر دسترسی پیدا میکند (این در اندروید 9 نیز صادق است). با این حال، به دلیل مصرف زیاد حافظه و استفاده دشوار، ConfigStore HAL منسوخ شده است.
ConfigStore HAL برای پشتیبانی از پارتیشن های فروشنده قدیمی در AOSP باقی می ماند. در دستگاههایی که Android 10 یا بالاتر دارند، surfaceflinger
ابتدا ویژگیهای سیستم را میخواند. اگر هیچ ویژگی سیستمی برای یک آیتم پیکربندی در «SurfaceFlingerProperties.sysprop» تعریف نشده باشد، «surfaceflinger» به ConfigStore HAL برمی گردد.
Android 8.0 سیستم عامل اندروید یکپارچه را به پارتیشن های عمومی ( system.img
) و سخت افزاری خاص ( vendor.img
و odm.img
) تقسیم می کند. در نتیجه این تغییر، کامپایل شرطی باید از ماژول های نصب شده در پارتیشن سیستم حذف شود و چنین ماژول هایی باید پیکربندی سیستم را در زمان اجرا تعیین کنند (و بسته به آن پیکربندی متفاوت رفتار کنند).
ConfigStore HAL مجموعهای از APIها را برای دسترسی به موارد پیکربندی فقط خواندنی که برای پیکربندی چارچوب Android استفاده میشوند، ارائه میکند. این صفحه طراحی ConfigStore HAL را توضیح می دهد (و چرا از ویژگی های سیستم برای این منظور استفاده نمی شود). سایر صفحات در این بخش ، رابط HAL ، اجرای سرویس ، و استفاده از سمت سرویس گیرنده را شرح میدهند که همگی از surfaceflinger
به عنوان مثال استفاده میکنند. برای راهنمایی در مورد کلاسهای رابط ConfigStore، به افزودن کلاسها و موارد رابط مراجعه کنید.
چرا از ویژگی های سیستم استفاده نمی کنید؟
ما استفاده از ویژگی های سیستم را در نظر گرفتیم اما چندین مشکل اساسی پیدا کردیم، از جمله:
- محدودیت طول در مقادیر ویژگی های سیستم محدودیت های محدودی در طول مقادیر خود دارند (92 بایت). علاوه بر این، از آنجایی که این محدودیتها مستقیماً در معرض برنامههای Android به عنوان ماکروهای C قرار گرفتهاند، افزایش طول میتواند باعث مشکلات سازگاری با عقبگردی شود.
- بدون پشتیبانی از نوع همه مقادیر در اصل رشته هستند و APIها به سادگی رشته را به یک
int
یاbool
تجزیه می کنند. سایر انواع داده های ترکیبی (به عنوان مثال، آرایه و ساختار) باید توسط کلاینت ها کدگذاری/رمزگشایی شوند (به عنوان مثال،"aaa,bbb,ccc"
را می توان به صورت آرایه ای از سه رشته کدگذاری کرد). - رونویسی می کند. از آنجایی که ویژگیهای سیستم فقط خواندنی بهعنوان ویژگیهای یک بار نوشتن پیادهسازی میشوند، فروشندگان/ODMهایی که میخواهند مقادیر فقط خواندنی تعریفشده توسط AOSP را لغو کنند، باید مقادیر فقط خواندنی خودشان را قبل از مقادیر فقط خواندنی تعریفشده توسط AOSP وارد کنند. این به نوبه خود باعث می شود که مقادیر قابل بازنویسی تعریف شده توسط فروشنده توسط مقادیر تعریف شده توسط AOSP نادیده گرفته شوند.
- آدرس فضای مورد نیاز ویژگی های سیستم در هر فرآیند مقدار نسبتاً زیادی از فضای آدرس را اشغال می کند. ویژگیهای سیستم در واحدهای
prop_area
با اندازه ثابت 128 کیلوبایت گروهبندی میشوند که همه آنها به یک فضای آدرس فرآیند اختصاص داده میشوند، حتی اگر فقط یک ویژگی سیستم در آن دسترسی داشته باشد. این می تواند مشکلاتی را در دستگاه های 32 بیتی که فضای آدرس با ارزش است ایجاد کند.
ما سعی کردیم بر این محدودیتها غلبه کنیم بدون اینکه سازگاری را به خطر بیندازیم، اما همچنان نگران بودیم که ویژگیهای سیستم برای پشتیبانی از دسترسی به موارد پیکربندی فقط خواندنی طراحی نشده است. در نهایت به این نتیجه رسیدیم که ویژگیهای سیستم برای اشتراکگذاری چند مورد بهروزرسانی شده پویا در سراسر Android در زمان واقعی مناسبتر است و نیاز به یک سیستم جدید برای دسترسی به موارد پیکربندی فقط خواندنی وجود دارد.
طراحی HAL ConfigStore
طراحی اولیه ساده است:
شکل 1. طراحی HAL ConfigStore
- پرچم های ساخت (که در حال حاضر برای کامپایل شرطی چارچوب استفاده می شود) را در HIDL توضیح دهید.
- فروشندگان و OEM ها SoC و مقادیر خاص دستگاه را برای پرچم های ساخت با اجرای سرویس HAL ارائه می کنند.
- چارچوب را برای استفاده از سرویس HAL برای یافتن مقدار یک آیتم پیکربندی در زمان اجرا تغییر دهید.
موارد پیکربندی که در حال حاضر توسط چارچوب به آنها ارجاع می شود در بسته HIDL نسخه شده ( android.hardware.configstore@1.0
) گنجانده شده است. فروشندگان/OEM ها با پیاده سازی واسط ها در این بسته، مقادیری را برای آیتم های پیکربندی ارائه می کنند، و چارچوب زمانی که نیاز به دریافت مقداری برای یک آیتم پیکربندی دارد، از رابط ها استفاده می کند.
ملاحظات امنیتی
پرچمهای ساخت تعریفشده در یک رابط، تحت تأثیر همان سیاست SELinux قرار میگیرند. اگر یک یا چند پرچم ساخت باید خطمشیهای SELinux متفاوتی داشته باشند، باید به یک رابط دیگر جدا شوند . این میتواند نیاز به بازنگری عمده در android.hardware.configstore package
داشته باشد، زیرا رابطهای جدا شده دیگر با عقبنشینی سازگار نیستند.