إزالة الحِزم لمستخدم النظام

توضّح هذه الصفحة كيفية تحسين الأداء من خلال تحديد وإزالة الحِزم غير الضرورية لمستخدم النظام.

إيقاف الحِزم غير الضرورية

في 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:

  1. عليك تركيب إعدادات config_systemUserPackagesBlacklistSupported من frameworks/base/core/res/res/values/config.xml وضبطها على true. عند تفعيل الميزة، يجب تلقائيًا تثبيت جميع الحِزم لكل من مستخدم النظام ومستخدم FULL.
  2. أنشئ ملف config.xml يسرد الحِزم التي يجب إيقافها لمستخدم النظام، على سبيل المثال:
    <config>
        <!-- This package will be uninstalled for the system user -->
        <system-user-blacklisted-app package="com.google.car.calendar" />
    </config>
  3. أضِف سطرًا إلى 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. التحقّق مما إذا كان قد تم تصنيف التطبيق (أو مكوّنات التطبيق) على أنّه سينغلتون

إذا كان التطبيق في سينغتون، ينشئ النظام مثيلاً للتطبيق في مستخدم النظام فقط. من المرجّح أنّه كان من المفترض أن يكون التطبيق متوافقًا مع ميزة "الوصول المتعدّد". لمزيد من المعلومات عن التطبيقات المتوافقة مع ميزة "الوصول المتعدّد"، يُرجى الاطّلاع على مقالة إنشاء تطبيقات متوافقة مع ميزة "الوصول المتعدّد".

  1. تحقَّق من ملف بيان Android بحثًا عن android:singleUser="true".
  2. إذا كان true، أضِفه إلى القائمة المسموح بها. هذا الإعداد مطلوب لمستخدم النظام.
  3. في حال false، يمكنك المتابعة. يُرجى مراجعة المعايير الأخرى قبل الإزالة.

‫2- التحقّق مما إذا كان التطبيق يتطلب الوصول إلى مساحة تخزين محمية

غالبًا ما تعتمد العديد من خدمات تمهيد النظام على مساحة التخزين المشفرة على الجهاز (DE) بدلاً من التخزين المشفّر باستخدام بيانات الاعتماد (CE). تعتمد أيضًا تطبيقات النظام التي تبدأ مباشرةً عند التمهيد على مساحة التخزين المشفَّرة على الجهاز. للاطّلاع على مزيد من المعلومات عن التطبيقات المتوافقة مع ميزة "التشغيل المباشر"، يُرجى الاطّلاع على مقالة إتاحة ميزة "التشغيل المباشر" في تطبيقات النظام.

  1. تحقَّق من ملف بيان Android بحثًا عن android:defaultToDeviceProtectedStorage="true"، وهو مطلوب ل العديد من خدمات تشغيل النظام.
  2. إذا كان true، أضِفه إلى القائمة المسموح بها.
  3. إذا كان الأمر كذلك، يمكنك المتابعة.

المستوى 2: مكونات التطبيق

الأنشطة

لمزيد من المعلومات عن الأنشطة، اطّلِع على مقدّمة عن الأنشطة.

أ- التحقّق مما إذا كان التطبيق يتضمّن أنشطة فقط

الأنشطة موجّهة إلى واجهة المستخدم. وبما أنّ مستخدم النظام بلا واجهة مستخدم رسومية في السيارات، يجب ألا يتفاعل أي شخص مع مستخدم النظام. نتيجةً لذلك، إذا كان التطبيق يتضمّن أنشطة فقط، من المرجّح أنّه ليس ذا صلة بمستخدِم النظام.

التحقّق من الأولوية والامتياز الخاص:

  1. إذا كانت الإجابة نعم، قد يكون ذلك مطلوبًا لمستخدم النظام.
  2. إذا كانت الإجابة لا، لا تضِف المستخدم إلى القائمة المسموح بها.

على سبيل المثال، تحتوي حزمة اختبار التوافق (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 إلى القائمة المسموح بها لتشغيله في مستخدم النظام) وكان هذا التطبيق يعتمد على موفّر المحتوى هذا، تأكَّد من أنّ موفّر المحتوى هذا مُدرَج أيضًا في القائمة المسموح بها.

  1. إذا كانت نعم، أضِف القائمة المسموح بها.
  2. إذا كانت الإجابة لا، لا تضِف النطاق إلى القائمة المسموح بها.

على سبيل المثال، إذا كانت السمة 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>