Предустановленные системные пакеты

Android поддерживает несколько пользователей на одном устройстве. Подробнее о поддержке нескольких пользователей… Поскольку не все системные пакеты полезны для всех типов пользователей Android, вы можете использовать белый список, чтобы указать, какие системные пакеты должны быть предварительно установлены для каждого типа пользователей. Если не предустанавливать ненужные системные пакеты, можно оптимизировать время создания пользователя, время начала и использование памяти.

Используйте XML-файлы конфигурации системы, созданные на основе frameworks/base/data/etc/preinstalled-packages-platform.xml, чтобы указать, какие системные пакеты должны быть изначально установлены для новых пользователей в зависимости от их типа. Все системные пакеты на устройстве должны иметь запись в XML-файле (ключ – название из манифеста), за исключением статических оверлеев, которые обрабатываются автоматически в соответствии с записью для целевого пакета оверлея. То, как устройство должно обрабатывать системные пакеты, не указанные здесь, определяется режимом конфигурации.

Типы пользователей

Базовые типы пользователей (каждый пользователь относится хотя бы к одному из этих типов):

Тип пользователя Описание
SYSTEM Пользователь 0.
FULL Любой пользователь, не связанный с профилем.
PROFILE Профиль пользователя.

Точное значение каждого из них приведено в разделе frameworks/base/core/java/android/content/pm/UserInfo.java.

Более точное управление можно получить, указав отдельные типы пользователей, поскольку каждый пользователь относится к одному из этих типов, включая типы пользователей AOSP, определенные в frameworks/base/core/java/android/os/UserManager.java, и любые пользовательские типы пользователей OEM, определенные в frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.. Дополнительную информацию можно найти на странице Типы пользователей. В настоящее время в AOSP поддерживаются следующие типы пользователей:

  • android.os.usertype.full.SYSTEM
  • android.os.usertype.full.SECONDARY
  • android.os.usertype.full.GUEST
  • android.os.usertype.full.DEMO
  • android.os.usertype.full.RESTRICTED
  • android.os.usertype.profile.MANAGED
  • android.os.usertype.profile.PRIVATE
  • android.os.usertype.system.HEADLESS

Примеры

Ниже приведены примеры для наиболее распространенных случаев использования.

  1. Чтобы системный пакет был предустановлен только для пользователя 0:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. Чтобы системный пакет был предустановлен для всех пользователей-людей (например, веб-браузер), то есть для всех пользователей типа FULL или PROFILE, выполните следующие действия:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  3. Системный пакет должен быть предустановлен для всех пользователей, кроме профилей. Например, это может быть приложение с обоями:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. Некоторые системные пакеты должны быть у всех пользователей независимо от типа устройства. В таких случаях используйте:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  5. Вы также можете указать отдельные типы пользователей. Например, следующий образец кода устанавливает этот пакет для любого пользователя, у которого тип пользователя – управляемый профиль или гость, или относится к базовому типу SYSTEM.
    <install-in-user-type package="com.android.example">
        <install-in user-type="android.os.usertype.profile.MANAGED" />
        <install-in user-type="android.os.usertype.full.GUEST" />
        <install-in user-type="SYSTEM">
    </install-in-user-type>

Тег do-not-install-in

Кроме того, можно запретить предустановку пакетов для определенных типов пользователей с помощью тега do-not-install-in. Обратите внимание, что теги do-not-install-in переопределяют теги install-in в любом файле. Пример:

<install-in-user-type package="com.android.example">
    <install-in user-type="FULL" />
    <do-not-install-in user-type="android.os.usertype.full.GUEST"/>
</install-in-user-type>
Если пользователь относится к типу android.os.usertype.full.GUEST (подтип FULL), этот пакет не устанавливается, поскольку тег do-not-install-in имеет приоритет над тегом install-in.

Как управлять поведением с помощью файла config.xml

Значение ресурса конфигурации config_userTypePackageWhitelistMode управляет этой функцией и определяет, как устройство интерпретирует системные пакеты, у которых нет записи для какого-либо типа пользователя. Дополнительную информацию можно найти по адресу frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.

В frameworks/base/core/res/res/values/config.xml задайте целочисленное значение config_userTypePackageWhitelistMode, используя комбинацию следующих значений: Эти флаги можно комбинировать. Наиболее важные флаги:

Значение Описание
0 (0b0000) Отключить. Установите все системные пакеты.
1 (0b0001) Применить. Устанавливать системные пакеты только из белого списка.
4 (0b0100) Считать, что все пакеты, не указанные в файле белого списка, неявно добавлены в белый список.
8 (0b1000) Считать любой пакет, не упомянутый в файле белого списка, неявно добавленным в белый список только для системного пользователя.

Следующая конфигурация включает функцию (чтобы теги install-in и do-not-install-in учитывались), но обрабатывает все неупомянутые системные пакеты так, как если бы они были install-in для всех пользователей:

<integer name="config_userTypePackageWhitelistMode">5</integer>