Paquetes del sistema preinstalados

Android admite varios usuarios en un solo dispositivo. Para obtener más información, consulta Cómo admitir varios usuarios. Como no todos los paquetes del sistema son útiles para todos los tipos de usuarios de Android, puedes usar una lista de entidades permitidas para especificar qué paquetes del sistema deben estar preinstalados en cada tipo de usuario. Si no preinstalas paquetes del sistema innecesarios, puedes optimizar los tiempos de creación y de inicio de los usuarios, así como el uso de la memoria.

Usa archivos en formato XML de configuración del sistema, modelados en frameworks/base/data/etc/preinstalled-packages-platform.xml, para declarar qué paquetes del sistema se deben instalar inicialmente para los usuarios nuevos según su tipo de usuario. Idealmente, todos los paquetes del sistema del dispositivo deben tener una entrada en un archivo XML (con clave según su nombre de manifiesto), excepto las superposiciones estáticas, que se tratan automáticamente según la entrada de su paquete de destino de superposición correspondiente. El modo de configuración controla la forma en que el dispositivo debe controlar los paquetes del sistema que no se mencionan aquí.

Tipos de usuarios

Los tipos de usuarios básicos (cada usuario es, al menos, uno de estos tipos) son los siguientes:

Tipo de usuario Descripción
SYSTEM Usuario 0.
FULL Cualquier usuario humano que no sea de perfil.
PROFILE Un usuario humano de perfil.

El significado preciso de cada uno se define en frameworks/base/core/java/android/content/pm/UserInfo.java.

Se puede obtener un control más detallado si se especifican tipos de usuarios individuales, ya que cada usuario es exactamente uno de estos tipos, lo que incluye los tipos de usuarios de AOSP definidos en frameworks/base/core/java/android/os/UserManager.java y cualquier tipo de usuario personalizado del OEM definido en frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.. Consulta la página Tipos de usuarios para obtener más información. Actualmente, los tipos de usuarios de AOSP incluyen los siguientes:

  • 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

Ejemplos

En los siguientes ejemplos, se abordan los casos de uso más comunes:

  1. Para que un paquete del sistema se preinstale solo en el usuario 0, haz lo siguiente:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. Para que un paquete del sistema se instale de forma predeterminada en todos los usuarios humanos (como un navegador web), es decir, en cualquier usuario de tipo FULL o PROFILE, que se dirija a todos los usuarios humanos, haz lo siguiente:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  3. Para que un paquete del sistema se preinstale en todos los usuarios humanos, excepto en los usuarios de perfil. Por ejemplo, esto se podría aplicar a una app de fondo de pantalla:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. Algunos paquetes del sistema realmente deben estar en todos los usuarios, independientemente del tipo. En estos casos, usa lo siguiente:
    <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. También hay opciones más detalladas disponibles si especificas tipos de usuarios individuales. Por ejemplo, el siguiente código de muestra instala este paquete en cualquier usuario cuyo tipo de usuario sea un perfil administrado, un invitado o un tipo de base 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>

etiqueta do-not-install-in

También se puede evitar que los paquetes se instalen previamente en tipos de usuarios específicos con la etiqueta do-not-install-in. Ten en cuenta que las etiquetas do-not-install-in anula las etiquetas install-in en cualquier archivo. Por ejemplo:

<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>
Si un usuario es del tipo android.os.usertype.full.GUEST (un subtipo de FULL), este paquete no está instalado porque la etiqueta do-not-install-in tiene prioridad sobre install-in.

Controla el comportamiento con config.xml

El valor del recurso de configuración config_userTypePackageWhitelistMode controla esta función y determina cómo un dispositivo interpreta los paquetes del sistema que no tienen entradas para ningún tipo de usuario. Para obtener más información, consulta frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.

En frameworks/base/core/res/res/values/config.xml, establece el número entero llamado config_userTypePackageWhitelistMode en una combinación de los siguientes valores. Estas marcas se pueden combinar. Las marcas más importantes son las siguientes:

Valor Descripción
0 (0b0000) Inhabilitar. Instala todos los paquetes del sistema.
1 (0b0001) Aplicar. Instala solo paquetes del sistema cuando estén en la lista de entidades permitidas.
4 (0b0100) Considera que cualquier paquete que no se mencione en el archivo de la lista de entidades permitidas se incluye de forma implícita en ella.
8 (0b1000) Considera que cualquier paquete que no se mencione en el archivo de la lista de entidades permitidas está incluido de forma implícita solo para el usuario del SISTEMA.

La siguiente configuración habilita la función (para que se cumplan las etiquetas install-in y do-not-install-in), pero trata los paquetes del sistema que no se mencionan como si fueran install-in para todos los usuarios:

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