این صفحه نحوه بهبود عملکرد را با شناسایی و حذف بستههایی که برای کاربر سیستم مورد نیاز نیستند، شرح میدهد.
بسته های غیر ضروری را غیرفعال کنید
در Automotive، کاربر سیستم بدون سر است، به این معنی که کاربر سیستم برای استفاده یا دسترسی مستقیم توسط انسان در نظر گرفته نشده است. در نتیجه، بسیاری از برنامهها و سرویسها نیازی به اجرا در کاربر سیستم ندارند و میتوانند برای بهبود عملکرد غیرفعال شوند. بنابراین، گزینه ای برای حذف برنامه های غیر ضروری برای کاربر سیستم (کاربر 0) ارائه شده است.
در این صفحه دو نوع کاربر مورد بحث قرار گرفته است:
- سیستم . همیشه کاربر 0
- کامل . کاربری که قرار است توسط یک انسان (کاربر غیر سیستم)، کاربر 10+ استفاده شود
اندروید 11
در اندروید 11، پیکربندی config_userTypePackageWhitelistMode
را تغییر دهید. پرچم ها را می توان ترکیب کرد. در این مورد، 5
برابر است با 1
به علاوه 4
(ترکیبی از پرچم های 1
و 4
).
پرچم | توضیحات |
---|---|
0 | غیرفعال کردن لیست مجاز نصب تمام بسته های سیستم؛ بدون ورود به سیستم |
1 | اجرا کنید. بسته های سیستم را فقط زمانی نصب کنید که در لیست مجاز باشند. |
2 | بسته های غیر مجاز را ثبت کنید. |
4 | هر بسته ای که در فایل لیست مجاز ذکر نشده باشد به طور ضمنی برای همه کاربران در لیست مجاز قرار می گیرد. |
8 | همانند 4 ، برای کاربر سیستم. |
16 | OTA ها را نادیده بگیرید. در طول OTA بسته های سیستمی را نصب نکنید. |
این سناریوهای رایج را در نظر بگیرید:
- برای فعال کردن یک ویژگی برای یک لیست مجاز کامل،
1
( به طور کامل اجرا شده است ) - برای فعال کردن یک ویژگی برای لیست مجاز ناقص،
5
- برای فعال کردن یک ویژگی برای کاربر
SYSTEM
برای تسهیل توسعه محلی،9
( فهرست مجاز ضمنی ) - برای غیرفعال کردن یک ویژگی که انگار هرگز فعال نشده است،
16
- برای غیرفعال کردن یک ویژگی و لغو تمام جلوه های قبلی،
0
فایل XML را در پوشه sysconfig
دستگاه نصب کنید (این همان دایرکتوری است که حاوی makefile ( .mk
) است که برای ساختن تصویر سیستم برای دستگاه استفاده می شود). هنگامی که نام فایل XML را میگذارید، مکانی را که بسته در آن تعریف شده است، اضافه کنید، به عنوان مثال، preinstalled-packages-product-car-CAR_PRODUCT_NAME.xml
.
<!- this package will be installed for both FULL and SYSTEM user --> <install-in-user-type package="com.android.bluetooth"-> <install-in user-type="FULL" /-> <install-in user-type="SYSTEM" /-> </install-in-user-type-> <!- this package will only be installed for both FULL user --> <install-in-user-type package="com.android.car.calendar"-> <install-in user-type="FULL" > </install-in-user-type->
اندروید 9 و اندروید 10
برای پیکربندی این ویژگی در اندروید 9 و اندروید 10:
- پیکربندی
config_systemUserPackagesBlacklistSupported
را ازframeworks/base/core/res/res/values/config.xml
بپوشانید و آن را رویtrue
تنظیم کنید. وقتی این ویژگی روشن است، به طور پیشفرض، همه بستهها باید هم برای کاربر سیستم و هم برای کاربر FULL نصب شوند. - یک فایل
config.xml
ایجاد کنید که در آن بسته هایی که باید برای کاربر سیستم غیرفعال شوند، به عنوان مثال:<config> <!-- This package will be uninstalled for the system user --> <system-user-blacklisted-app package="com.google.car.calendar" /> </config>
- یک خط به
device.mk
اضافه کنید تا فایل را در پوشه هدف دستگاهsystem/etc/sysconfig/
کپی کنید، به عنوان مثال:PRODUCT_COPY_FILES += <full path to the config file>:system/etc/sysconfig/<new denylist config file>.xml
نتیجه را تأیید کنید
برای تأیید نتیجه، اجرا کنید:
$ adb shell dumpsys user | grep PACKAGE_SUBSTRING $ adb shell pm list packages --user USER_ID PACKAGE_SUBSTRING $ adb shell cmd user report-system-user-package-whitelist-problems
پیش فرض
برای تعیین اینکه آیا بسته ای باید در کاربر سیستم نصب شود، فایل AndroidManifest.xml
بسته را که در ریشه منبع پروژه قرار دارد، شامل ویژگی های برنامه و اجزای برنامه، که شامل تمام فعالیت ها، خدمات، گیرنده های پخش، و ارائه دهندگان محتوا برای کسب اطلاعات بیشتر، به نمای کلی مانیفست برنامه مراجعه کنید.
شکل 1. گردش کار بسته ها را غیرفعال کنید.
سطح 1، سطح برنامه
1. بررسی کنید که آیا برنامه (یا اجزای برنامه) بهعنوان تکتن اعلام شده است یا خیر
اگر برنامه تکتنه باشد، سیستم برنامه را فقط در کاربر سیستم نمونهسازی میکند. احتمالاً این برنامه یک برنامه آگاه از چند کاربر بوده است. برای کسب اطلاعات بیشتر در مورد برنامههای چندکاربره آگاه، به ساخت برنامههای آگاه از چند کاربر مراجعه کنید.
- مانیفست اندروید را برای
android:singleUser="true"
بررسی کنید. - اگر
true
، لیست مجاز. برای کاربر سیستم مورد نیاز است. - اگر
false
، ادامه دهید. قبل از حذف معیارهای دیگر را بررسی کنید.
2. بررسی کنید که آیا برنامه به دسترسی به فضای ذخیرهسازی محافظت شده نیاز دارد
بسیاری از سرویسهای راهاندازی سیستم اغلب به جای ذخیرهسازی رمزگذاریشده اعتبار (CE) به ذخیرهسازی رمزگذاریشده دستگاه (DE) متکی هستند. همچنین، برنامههای سیستمی که از راهاندازی مستقیم آگاه هستند نیز به ذخیرهسازی رمزگذاریشده دستگاه متکی هستند. برای اطلاعات بیشتر در مورد برنامههای آگاه از راهاندازی مستقیم، به پشتیبانی از راهاندازی مستقیم در برنامههای سیستم مراجعه کنید.
- مانیفست اندروید را برای
android:defaultToDeviceProtectedStorage="true"
بررسی کنید، که برای بسیاری از خدمات بوت سیستم مورد نیاز است. - اگر
true
، لیست مجاز. - اگر
false
، ادامه دهید.
سطح 2، اجزای برنامه
فعالیت ها
برای کسب اطلاعات بیشتر در مورد فعالیت ها، به مقدمه فعالیت ها مراجعه کنید.
الف بررسی کنید آیا برنامه فقط شامل فعالیتها میشود
فعالیت ها رابط کاربری هستند. از آنجایی که کاربر سیستم در Automotive بدون سر است، هیچ انسانی نباید با کاربر سیستم تعامل داشته باشد. در نتیجه، اگر برنامه فقط شامل فعالیت باشد، برنامه به احتمال زیاد به کاربر سیستم بی ربط است.
اولویت و امتیاز ویژه را بررسی کنید:
- اگر بله ، ممکن است برای کاربر سیستم مورد نیاز باشد.
- اگر خیر ، لیست مجاز برای کاربر سیستم نباشد.
برای مثال، مجموعه تست سازگاری (CTS) ( com.android.cts.priv.ctsshim
) فقط شامل فعالیتها است و فعالیتها برای آزمایش فیلترهای هدف تعریف شدهاند. با این حال، از آنجا که CTS دارای امتیاز بالایی است، برای اهداف آزمایشی باید برای کاربر سیستم نصب شود.
خدمات
برای کسب اطلاعات بیشتر در مورد خدمات، به نمای کلی خدمات مراجعه کنید.
ب بررسی کنید که آیا سرویس به عنوان خصوصی اعلام شده است و از برنامه های دیگر قابل دسترسی نیست
اگر سرویس به عنوان خصوصی اعلام شود، سایر بسته ها از این سرویس استفاده نخواهند کرد. android:exported="false"
را جستجو کنید. اگر سرویس بهعنوان خصوصی اعلام شود یا از برنامههای دیگر قابل دسترسی نباشد، دیگر نمیتوان آن را محدود کرد. بنابراین، مرحله c و مرحله d زیر بی ربط هستند. در نتیجه، این مؤلفه نکات بیشتری در مورد اینکه آیا این سرویس برای کاربر سیستم مورد نیاز است، ارائه نمی دهد.
- اگر بله ، جزء بعدی را بررسی کنید.
- اگر خیر ، به بررسی این مؤلفه ادامه دهید.
ج. بررسی کنید که آیا برنامه های نصب شده در کاربر سیستم ممکن است به این سرویس متصل شوند
بسته های مجاز در سطح 1 را بررسی کنید و خدماتی را که به آنها ملزم هستند شناسایی کنید. ردیابی از فیلتر قصد در این سرویس و startService
در بسته های دیگر.
اگر این سرویس به برنامههای نصب شده در کاربر سیستم متصل است (به عنوان مثال، com.android.car.companiondevicesupport
برای اجرا در کاربر سیستم مجاز است)، سپس این سرویس را در لیست مجاز قرار دهید:
- اگر بله ، لیست مجاز.
- اگر خیر ، به بررسی این مؤلفه ادامه دهید.
د بررسی کنید که آیا سرویس از برنامه های دیگر محدود شده است و اعلام شده است که در پیش زمینه اجرا می شود
به دنبال startForeground
بگردید. این بدان معنی است که افراد در پیش زمینه با برنامه تعامل خواهند داشت. به احتمال زیاد، این سرویس برای کاربر سیستم مورد نیاز نخواهد بود و لازم نیست در لیست مجاز قرار گیرد:
- اگر بله ، لیست مجاز نباشد.
- اگر خیر ، به بررسی مؤلفه بعدی ادامه دهید.
ه. بررسی کنید که آیا سرویس برای اجرا در فرآیند سیستم تعریف شده است یا خیر
در فایل AndroidManifest به دنبال android:process="system"
بگردید. اگر سرویس به طور عمدی برای اجرا در فرآیند سیستم تعریف شده باشد، آنگاه در همان فرآیند سرویس سیستم اجرا می شود و باید در لیست مجاز برای اجرا در کاربر سیستم قرار گیرد. به عنوان بخشی از طراحی تخصیص حافظه اندروید، سرویسهای سیستم برخی از آخرین فرآیندهایی هستند که از بین میروند، که حاکی از بحرانی بودن سرویسهایی است که با چنین ویژگی تعریف شدهاند. برای کسب اطلاعات بیشتر در مورد طراحی تخصیص حافظه اندروید، به قاتل کم حافظه مراجعه کنید.
- اگر بله ، لیست مجاز نباشد.
- اگر خیر ، به بررسی سایر اجزاء ادامه دهید.
به عنوان مثال، بسته com.android.networkstack.inprocess
باید در لیست مجاز باشد زیرا حاوی RegularMaintenanceJobService
است که دارای برچسب android:process="system"
است.
ارائه دهنده محتوا
برای کسب اطلاعات بیشتر در مورد ارائه دهندگان محتوا، به ارائه دهندگان محتوا مراجعه کنید.
f. بررسی کنید که آیا برنامه نصب شده در کاربر سیستم به این ارائه دهنده بستگی دارد یا خیر
بسته های مجاز در سطح 1 را بررسی کنید و بررسی کنید که به کدام ارائه دهندگان وابسته هستند. اگر برنامهای که در کاربر سیستم اجرا میشود (مثلاً com.android.car.companiondevicesupport
برای اجرا در کاربر سیستم در لیست مجاز است) و به این ارائهدهنده محتوا بستگی دارد، مطمئن شوید که این ارائهدهنده محتوا نیز در لیست مجاز است.
- اگر بله ، لیست مجاز.
- اگر نه ، لیست مجاز نیست.
به عنوان مثال، اگر com.android.car.EXAMPLE
حاوی ارائه دهندگان تکی ( SystemActionsContentProvider
و ManagedProvisioningActionsContentProvider
) باشد، باید برای کاربر سیستم در لیست مجاز قرار گیرد. سپس، اگر com.android.car.EXAMPLE
برای WebViewFactoryProvider
به android.webkit
بستگی دارد، با توجه به اینکه android.webkit
بارگیری می کند، com.android.webview
باید برای کاربر سیستم مجاز باشد.
نمونه بررسی بسته
مثال زیر نحوه ارزیابی AndroidManifest.xml
یک بسته را نشان می دهد:
<?xml version="1.0" encoding="utf-8"?> <!-- 1. Search in the entire manifest for singleUser attribute. No. Move to step 2 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.providers.calendar" android:sharedUserId="android.uid.calendar"> We can ignore the entire permission section <uses-permission android:name="android.permission.READ_CALENDAR" /> ... <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> <!-- 2. Look for defaultToDeviceProtectedStorage in application's attribute. No. Continue evaluating app components. --> <application android:label="@string/calendar_storage" android:allowBackup="false" android:icon="@drawable/app_icon" android:usesCleartextTraffic="false"> <!-- a. Contain only activities? No. Continue to evaluate components other than activities. --> <provider android:name="CalendarProvider2" android:authorities="com.android.calendar" <!-- b. Is this component exported? Yes. Continue evaluating this component. f. App on u0 might depend on this? Search for CalendarProvider2 in dumpsys, shows ContentProviderRecord{b710923 u0 com.android.providers.calendar/.CalendarProvider2} Yes. Whitelist for system user. --> android:label="@string/provider_label" android:multiprocess="false" android:exported="true" android:readPermission="android.permission.READ_CALENDAR" android:writePermission="android.permission.WRITE_CALENDAR" />
<activity android:name="CalendarContentProviderTests" android:label="Calendar Content Provider" android:exported="false"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.UNIT_TEST" /> </intent-filter> </activity> <!-- Not service/content provider. Ignore. --> <receiver android:name="CalendarProviderBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.android.providers.calendar.intent.CalendarProvider2"/> <category android:name="com.android.providers.calendar"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.EVENT_REMINDER"/> <data android:scheme="content" /> </intent-filter> </receiver> <service android:name="CalendarProviderIntentService"/> </application> </manifest>