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

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.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 переопределяют теги 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>