Удалить пакеты для системного пользователя

В этой статье описывается, как повысить производительность путем выявления и удаления пакетов, которые не нужны Пользователю системы.

Отключите ненужные пакеты

В автомобильной промышленности пользователь системы не имеет головы , что означает, что пользователь системы не предназначен для использования или прямого доступа человека. В результате многие приложения и службы не нужно запускать у системного пользователя, и их можно отключить для повышения производительности. Таким образом, предоставляется возможность удалить ненужные приложения для системного пользователя (пользователь 0).

На этой странице обсуждаются два типа пользователей:

  • СИСТЕМА . Всегда Пользователь 0
  • ПОЛНЫЙ . Пользователь, предназначенный для использования человеком (не пользователем системы), пользователь 10+.

Андроид 11

В Android 11 вы меняете конфигурацию config_userTypePackageWhitelistMode . Флаги можно комбинировать. В данном случае 5 равно 1 плюс 4 (комбинация флагов 1 и 4 ).

Флаг Описание
0 Отключить белый список. Установите все системные пакеты; нет регистрации.
1 Принудить. Устанавливайте системные пакеты только в том случае, если они внесены в белый список.
2 Зарегистрируйте пакеты, не включенные в белый список.
4 Любой пакет, не упомянутый в файле списка разрешений, неявно добавляется в список разрешений для всех пользователей.
8 То же, что и 4 , для пользователя системы.
16 Игнорируйте ОТА. Не устанавливайте системные пакеты во время 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

Чтобы настроить эту функцию в 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. Если ложь , продолжайте.

Уровень 2, компоненты приложения

Деятельность

Дополнительные сведения о действиях см. в разделе Введение в действия .

а. Проверьте, содержит ли приложение только занятия

Действия ориентированы на пользовательский интерфейс. Поскольку в автомобильной промышленности пользователь системы не имеет головы, ни один человек не должен взаимодействовать с пользователем системы. В результате, если приложение содержит только действия, оно, скорее всего, не имеет отношения к пользователю системы.

Проверьте приоритет и особые привилегии.

  1. Если да , возможно, это необходимо для пользователя системы.
  2. Если Нет , не вносить в список разрешенных пользователей системы.

Например, набор тестов совместимости (CTS) ( com.android.cts.priv.ctsshim ) содержит только действия, а действия определены для фильтров намерений тестирования. Однако, поскольку он имеет высокие привилегии, его необходимо установить для пользователя системы в целях тестирования.

Услуга

Дополнительную информацию об услугах см. в разделе Обзор услуг .

б. Проверьте, объявлена ​​ли служба частной и недоступна ли она из других приложений.

Если служба объявлена ​​как частная , другие пакеты не будут ее использовать. Найдите android:exported="false" . Если служба объявлена ​​частной или к ней нельзя получить доступ из других приложений, другие приложения не могут ее связать. Поэтому шаги C и D, приведенные ниже, не имеют значения. В результате этот компонент не будет предоставлять больше подсказок относительно того, нужна ли услуга Пользователю системы.

  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" .

Поставщик услуг

Дополнительные сведения о поставщиках контента см. в разделе Поставщики контента .

ф. Проверьте, зависит ли приложение, установленное в системном пользователе, от этого провайдера.

Проверьте наличие пакетов в разрешенном списке на уровне 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>