توضِّح هذه الصفحة كيفية تحسين الأداء من خلال تحديد وإزالة الحِزم غير الضرورية لمستخدم النظام.
إيقاف الحِزم غير الضرورية
في تطبيقات Automotive، يكون مستخدم النظام بدون واجهة مستخدم، ما يعني أنّه ليس مخصّصًا لاستخدامه أو الوصول إليه مباشرةً من قِبل أحد الأشخاص. نتيجةً لذلك، لا تحتاج العديد من التطبيقات والخدمات إلى التشغيل في حساب مستخدم النظام، ويمكن إيقافها لتحسين الأداء. لذلك، يتوفّر خيار لإزالة التطبيقات غير الضرورية لمستخدم النظام (المستخدم 0).
في هذه الصفحة، تتم مناقشة نوعَين من المستخدمين:
- SYSTEM: المستخدم 0 دائمًا
- كامل: المستخدم الذي يُفترض أن يستخدمه شخص (مستخدم غير تابع للنظام)، المستخدم 10 والإصدارات الأحدث
Android 11
في Android 11، غيِّر إعدادات config_userTypePackageWhitelistMode
. يمكن دمج الإشارات. في هذه الحالة، يساوي 5
1
بالإضافة إلى 4
(مجموعة من العلامات 1
و4
).
إبلاغ | الوصف |
---|---|
0 |
أوقِف القائمة المسموح بها. تثبيت جميع حِزم النظام بدون تسجيل |
1 |
فرض. لا تُثبِّت حِزم النظام إلا عندما تكون مُدرَجة في القائمة المسموح بها. |
2 |
تسجيل الحِزم غير المُدرَجة في القائمة المسموح بها |
4 |
أي حزمة غير مذكورة في ملف القائمة المسموح بها تُضاف تلقائيًا إلى القائمة المسموح بها لجميع المستخدمين. |
8 |
القيمة نفسها التي تم ضبطها في 4 لمستخدم النظام. |
16 |
تجاهل عمليات النقل الجوي لا تثبِّت حِزم النظام أثناء عمليات التحديث عبر الهواء. |
راجِع السيناريوهات الشائعة التالية:
- لتفعيل ميزة لقائمة مسموح بها كاملة،
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->
Android 9 وAndroid 10
لضبط هذه الميزة في Android 9 وAndroid 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 بحثًا عن
android:singleUser="true"
. - إذا كان
true
، أضِفه إلى القائمة المسموح بها. مطلوب لمستخدم النظام. - إذا كان الأمر كذلك، يمكنك المتابعة.
false
تحقَّق من المعايير الأخرى قبل الإزالة.
2- التحقّق مما إذا كان التطبيق يتطلّب الوصول إلى مساحة التخزين المحمية
غالبًا ما تعتمد العديد من خدمات تشغيل النظام على مساحة تخزين مشفَّرة على الجهاز (DE) بدلاً من مساحة التخزين المشفَّرة للمعلومات المُعتمَدة (CE). تعتمد أيضًا تطبيقات النظام التي تبدأ مباشرةً عند التمهيد على مساحة التخزين المشفَّرة على الجهاز. للاطّلاع على مزيد من المعلومات عن التطبيقات المتوافقة مع ميزة "التشغيل المباشر"، يُرجى الاطّلاع على مقالة إتاحة ميزة "التشغيل المباشر" في تطبيقات النظام.
- تحقَّق من ملف بيان Android بحثًا عن
android:defaultToDeviceProtectedStorage="true"
، وهو مطلوب ل العديد من خدمات تشغيل النظام. - إذا كان
true
، أضِفه إلى القائمة المسموح بها. - إذا كان الأمر كذلك، يمكنك المتابعة.
false
المستوى 2: مكونات التطبيق
الأنشطة
لمزيد من المعلومات عن الأنشطة، اطّلِع على مقدّمة عن الأنشطة.
أ- التحقّق مما إذا كان التطبيق يتضمّن الأنشطة فقط
الأنشطة موجّهة إلى واجهة المستخدم. بما أنّ مستخدم النظام غير مرئي في Automotive، يجب ألا يتفاعل أيّ مستخدِم مع مستخدم النظام. نتيجةً لذلك، إذا كان التطبيق يتضمّن أنشطة فقط، من المرجّح أنّه ليس ذا صلة بمستخدِم النظام.
التحقّق من الأولوية والامتياز الخاص:
- إذا كانت الإجابة نعم، قد يكون ذلك مطلوبًا لمستخدم النظام.
- إذا كانت الإجابة لا، لا تضِف المستخدم إلى القائمة المسموح بها.
على سبيل المثال، لا تحتوي مجموعة أدوات اختبار التوافق (CTS)
(com.android.cts.priv.ctsshim
) إلا على الأنشطة، ويُحدَّد
الأنشطة لاختبار فلاتر الأهداف. ومع ذلك، بما أنّ CTS لديه امتياز
مرتفع، يجب تثبيته لمستخدم النظام لأغراض الاختبار.
الخدمة
للاطّلاع على مزيد من المعلومات عن الخدمات، يمكنك الاطّلاع على نظرة عامة على الخدمات.
ب- التحقّق مما إذا تم تصنيف الخدمة على أنّها خاصة ولا يمكن الوصول إليها من تطبيقات أخرى
إذا تم تصنيف الخدمة على أنّها خاصة، لن تستخدم الحِزم الأخرى
الخدمة. ابحث عن android:exported="false"
. إذا تم تصنيف الخدمة
على أنّها خاصة أو إذا تعذّر الوصول إليها من تطبيقات أخرى، لا يمكن ربطها
بتطبيقات أخرى. وبالتالي، فإنّ الخطوة ج والخطوة د أدناه غير ذات صلة. نتيجةً لذلك،
لن يقدّم هذا المكوّن المزيد من الإشارات حول ما إذا كانت الخدمة مطلوبة
لمستخدم النظام.
- إذا كان الجواب نعم، تحقّق من المكوّن التالي.
- إذا كانت الإجابة لا، يُرجى مواصلة التحقّق من هذا المكوّن.
ج. التحقّق مما إذا كانت التطبيقات المثبَّتة في حساب مستخدم النظام يمكن أن ترتبط بهذه الخدمة
ابحث عن الحِزم المُدرَجة في القائمة المسموح بها في المستوى 1 وحدِّد الخدمات
المرتبطة بها. تتبُّع من فلتر الأهداف في هذه الخدمة وstartService
في الحِزم الأخرى
إذا كانت هذه الخدمة مرتبطة بالتطبيقات المثبَّتة في حساب مستخدم النظام (على سبيل المثال،
تم إدراج com.android.car.companiondevicesupport
في القائمة المسموح بها لتشغيله في حساب
مستخدم النظام)، أضِف الخدمة إلى القائمة المسموح بها:
- إذا كانت الإجابة نعم، أضِف التطبيق إلى القائمة المسموح بها.
- إذا كانت الإجابة لا، يُرجى مواصلة التحقّق من هذا المكوّن.
د. التحقّق مما إذا كانت الخدمة مرتبطة بتطبيقات أخرى وهل تم تحديدها للتشغيل في المقدّمة
ابحث عن startForeground
. وهذا يعني أنّ المستخدمين سيتفاعلون مع
التطبيق في المقدّمة. من المرجّح ألا تكون هذه الخدمة مطلوبة لمستخدم
النظام ولا يلزم إدراجها في القائمة المسموح بها:
- إذا كانت الإجابة نعم، لا تضِف التطبيق إلى القائمة المسموح بها.
- إذا كان الجواب لا، انتقِل إلى التحقّق من المكوّن التالي.
هـ. التحقّق مما إذا كانت الخدمة محدّدة لتشغيلها في عملية النظام
في ملف AndroidManifest، ابحث عن android:process="system"
.
إذا تم تحديد الخدمة عن قصد لتشغيلها في عملية النظام، تتم معالجتها في العملية نفسها التي تتم فيها معالجة خدمة النظام، ويجب إدراجها في القائمة المسموح بها لتشغيلها في حساب مستخدم النظام. كجزء من تصميم تخصيص ذاكرة Android،
تكون خدمات النظام من بين العمليات الأخيرة التي يتم إغلاقها،
ما يشير إلى أهمية الخدمات المحدَّدة بهذه السمة. لمزيد من المعلومات حول تصميم تخصيص الذاكرة في Android، يُرجى الاطّلاع على أداة قتل التطبيقات التي تستهلك ذاكرة منخفضة.
- إذا كانت الإجابة نعم، لا تضِف التطبيق إلى القائمة المسموح بها.
- إذا كان الجواب لا، واصِل التحقّق من المكوّنات الأخرى.
على سبيل المثال، يجب أن تكون الحزمة com.android.networkstack.inprocess
مُدرَجة في القائمة المسموح بها لأنّها تحتوي على RegularMaintenanceJobService
، والتي
تتضمّن العلامة android:process="system"
.
موفّر المحتوى
للاطّلاع على مزيد من المعلومات عن مقدّمي المحتوى، يُرجى الاطّلاع على مقالة مقدّمو المحتوى.
و. التحقّق مما إذا كان التطبيق المثبَّت في حساب مستخدم النظام يعتمد على هذا الموفِّر
تحقّق من الحِزم المدرَجة في القائمة المسموح بها في "المستوى 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>