این مقاله نحوه بهبود عملکرد را با شناسایی و حذف بستههایی که برای کاربر سیستم مورد نیاز نیست، شرح میدهد.
بسته های غیر ضروری را غیرفعال کنید
در Automotive، کاربر سیستم بدون سر است، به این معنی که کاربر سیستم برای استفاده یا دسترسی مستقیم توسط انسان در نظر گرفته نشده است. در نتیجه، بسیاری از برنامهها و سرویسها نیازی به اجرا در کاربر سیستم ندارند و میتوانند برای بهبود عملکرد غیرفعال شوند. بنابراین، گزینه ای برای حذف برنامه های غیر ضروری برای کاربر سیستم (کاربر 0) ارائه شده است.
در این صفحه دو نوع کاربر مورد بحث قرار گرفته است:
- سیستم . همیشه کاربر 0
- کامل . کاربری که قرار است توسط یک انسان (کاربر غیر سیستم)، کاربر 10+ استفاده شود
اندروید 11
در Android 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"
بررسی کنید. - اگر درست است ، لیست مجاز. برای کاربر سیستم مورد نیاز است.
- اگر نادرست است، ادامه دهید. قبل از حذف معیارهای دیگر را بررسی کنید.
2. بررسی کنید که آیا برنامه به دسترسی به فضای ذخیرهسازی محافظت شده نیاز دارد
بسیاری از سرویسهای راهاندازی سیستم اغلب به جای ذخیرهسازی رمزگذاریشده اعتبار (CE) به ذخیرهسازی رمزگذاریشده دستگاه (DE) متکی هستند. همچنین، برنامههای سیستمی که از راهاندازی مستقیم آگاه هستند نیز به ذخیرهسازی رمزگذاریشده دستگاه متکی هستند. برای کسب اطلاعات بیشتر در مورد برنامههای آگاه از راهاندازی مستقیم، به پشتیبانی از راهاندازی مستقیم در برنامههای سیستم مراجعه کنید.
- مانیفست اندروید را برای
android:defaultToDeviceProtectedStorage="true"
بررسی کنید، که برای بسیاری از خدمات بوت سیستم مورد نیاز است. - اگر درست است ، لیست مجاز.
- اگر نادرست است، ادامه دهید.
سطح 2، اجزای برنامه
فعالیت ها
برای کسب اطلاعات بیشتر درباره فعالیتها، به مقدمه فعالیتها مراجعه کنید.
الف بررسی کنید آیا برنامه فقط شامل فعالیتها میشود
فعالیت ها رابط کاربری هستند. از آنجایی که کاربر سیستم در خودرو بدون سر است، هیچ انسانی نباید با کاربر سیستم تعامل داشته باشد. در نتیجه، اگر برنامه فقط شامل فعالیتها باشد، برنامه به احتمال زیاد به کاربر سیستم مربوط نمیشود.
اولویت و امتیاز ویژه را بررسی کنید.
- اگر بله ، شاید برای کاربر سیستم لازم باشد.
- اگر خیر ، برای کاربر سیستم لیست مجاز قرار ندهید.
به عنوان مثال، مجموعه تست سازگاری (CTS) ( com.android.cts.priv.ctsshim
) فقط شامل Activities است و Activities برای آزمایش فیلترهای هدف تعریف شده اند. با این حال، از آنجایی که از امتیاز بالایی برخوردار است، برای اهداف آزمایشی باید برای کاربر سیستم نصب شود.
خدمات
برای کسب اطلاعات بیشتر در مورد خدمات، به نمای کلی خدمات مراجعه کنید.
ب بررسی کنید که آیا سرویس به عنوان خصوصی اعلام شده است و از برنامه های دیگر قابل دسترسی نیست
اگر سرویس به عنوان خصوصی اعلام شود، سایر بسته ها از این سرویس استفاده نخواهند کرد. 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
به android.webkit
برای WebViewFactoryProvider
بستگی دارد، com.android.webview
باید برای کاربر سیستم مجاز باشد، زیرا android.webkit
بارگیری می کند.
نمونه بررسی بسته
مثال زیر نحوه ارزیابی 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>