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

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

تعطيل الحزم غير الضرورية

في السيارات، يكون مستخدم النظام بلا رأس ، مما يعني أن مستخدم النظام ليس مخصصًا للاستخدام أو الوصول إليه مباشرة من قبل الإنسان. ونتيجة لذلك، لا يلزم تشغيل العديد من التطبيقات والخدمات في مستخدم النظام ويمكن تعطيلها لتحسين الأداء. ولذلك، يتم توفير خيار لإزالة التطبيقات غير الضرورية لمستخدم النظام (المستخدم 0).

في هذه الصفحة، تتم مناقشة نوعين من المستخدمين:

  • نظام . المستخدم دائمًا 0
  • ممتلىء . المستخدم المخصص للاستخدام من قبل الإنسان (مستخدم غير النظام)، المستخدم 10+

أندرويد 11

في Android 11، يمكنك تغيير التكوين، config_userTypePackageWhitelistMode . يمكن الجمع بين الأعلام. في هذه الحالة، 5 يساوي 1 زائد 4 (مجموعة من الأعلام 1 و 4 ).

علَم وصف
0 تعطيل القائمة المسموح بها. تثبيت كافة حزم النظام. لا يوجد تسجيل.
1 فرض. قم بتثبيت حزم النظام فقط عندما تكون مدرجة في القائمة المسموح بها.
2 تسجيل الحزم غير المدرجة في القائمة المسموح بها.
4 أي حزمة غير مذكورة في ملف القائمة المسموح بها يتم إدراجها ضمن القائمة المسموح بها لجميع المستخدمين.
8 نفس 4 لمستخدم النظام.
16 تجاهل وكالات السفر عبر الإنترنت. لا تقم بتثبيت حزم النظام أثناء OTAs.
النظر في هذه السيناريوهات الشائعة.
  • لتمكين ميزة القائمة المسموح بها كاملة، 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

لتكوين هذه الميزة في Android 9 وAndroid 10:

  1. قم بتراكب التكوين config_systemUserPackagesBlacklistSupported من frameworks/base/core/res/res/values/config.xml وقم بتعيينه على true . عند تشغيل الميزة، بشكل افتراضي، يجب تثبيت كافة الحزم لكل من مستخدم النظام والمستخدم الكامل.
  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. إذا كان هذا صحيحا ، القائمة المسموح بها. مطلوب لمستخدم النظام.
  3. إذا كاذبة ، استمر. تحقق من المعايير الأخرى قبل الإزالة.

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

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

  1. تحقق من بيان Android لنظام android:defaultToDeviceProtectedStorage="true" ، وهو مطلوب للعديد من خدمات تمهيد النظام.
  2. إذا كان هذا صحيحا ، القائمة المسموح بها.
  3. إذا كاذبة ، استمر.

المستوى الثاني، مكونات التطبيق

أنشطة

لمعرفة المزيد حول الأنشطة، راجع مقدمة الأنشطة .

أ. تحقق مما إذا كان التطبيق يحتوي على أنشطة فقط

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

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

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

على سبيل المثال، تحتوي مجموعة اختبار التوافق (CTS) ( com.android.cts.priv.ctsshim ) على الأنشطة فقط، ويتم تحديد الأنشطة لاختبار مرشحات النوايا. ومع ذلك، نظرًا لأنه يتمتع بامتيازات عالية، فيجب تثبيته لمستخدم النظام لأغراض الاختبار.

خدمة

لمعرفة المزيد حول الخدمات، راجع نظرة عامة على الخدمات .

ب. تحقق مما إذا تم إعلان الخدمة على أنها خاصة ولا يمكن الوصول إليها من تطبيقات أخرى

إذا تم الإعلان عن الخدمة كخدمة خاصة ، فلن تستخدم الحزم الأخرى الخدمة. ابحث عن android:exported="false" . إذا تم الإعلان عن الخدمة كخدمة خاصة أو لا يمكن الوصول إليها من تطبيقات أخرى، فلا يمكن ربطها بتطبيقات أخرى. ولذلك، فإن الخطوة "ج" والخطوة "د" أدناه ليست ذات صلة. ونتيجة لذلك، لن يوفر هذا المكون المزيد من التلميحات حول ما إذا كانت الخدمة مطلوبة لمستخدم النظام أم لا.

  1. إذا كانت الإجابة بنعم ، فتحقق من المكون التالي.
  2. إذا كانت الإجابة لا ، فاستمر في التحقق من هذا المكون.

ج. تحقق مما إذا كانت التطبيقات المثبتة في مستخدم النظام قد ترتبط بهذه الخدمة

تحقق من وجود الحزم المدرجة في القائمة المسموح بها في المستوى 1 وحدد الخدمات المرتبطة بها. تتبع من مرشح النوايا في هذه الخدمة startService في الحزم الأخرى.

إذا كانت هذه الخدمة مرتبطة بالتطبيقات المثبتة في مستخدم النظام (على سبيل المثال، com.android.car.companiondevicesupport مدرج في القائمة المسموح بها للتشغيل في مستخدم النظام)، فقم بوضع الخدمة في القائمة المسموح بها.

  1. إذا كانت الإجابة بنعم ، فاختر القائمة المسموح بها.
  2. إذا كانت الإجابة لا ، فاستمر في التحقق من هذا المكون.

د. تحقق مما إذا كانت الخدمة مرتبطة بتطبيقات أخرى وتم الإعلان عنها للتشغيل في المقدمة

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

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

ه. تحقق مما إذا تم تعريف الخدمة للتشغيل في عملية النظام

في AndroidManifest، ابحث عن android:process="system" .
إذا تم تعريف الخدمة عمدًا للتشغيل في عملية النظام، فهذا يعني أنها ستعمل بشكل صريح في نفس العملية مثل خدمة النظام ويجب إدراجها في القائمة المسموح بها للتشغيل في مستخدم النظام. كجزء من تصميم تخصيص الذاكرة في Android، تعد خدمات النظام من آخر العمليات التي سيتم إيقافها، مما يعني أهمية الخدمات المحددة بمثل هذه السمة. لمعرفة المزيد حول تصميم تخصيص الذاكرة في Android، راجع قاتل الذاكرة المنخفضة .

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

على سبيل المثال، يجب إدراج الحزمة com.android.networkstack.inprocess في القائمة المسموح بها نظرًا لأنها تحتوي على RegularMaintenanceJobService ، الذي يحتوي على العلامة android:process="system" .

مزود المحتوى

لمعرفة المزيد حول موفري المحتوى، راجع موفري المحتوى .

F. تحقق مما إذا كان التطبيق المثبت في مستخدم النظام يعتمد على هذا الموفر

تحقق من الحزم المدرجة في القائمة المسموح بها في المستوى 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>