Paquetes de sistema preinstalados

Android admite tener múltiples usuarios en un solo dispositivo. Para obtener más información, consulte Compatibilidad con varios usuarios . Dado que no todos los paquetes del sistema son útiles para todos los tipos de usuarios de Android, puede usar una lista de permitidos para especificar qué paquetes del sistema deben preinstalarse en cada tipo de usuario. Al no preinstalar paquetes de sistema innecesarios, puede optimizar los tiempos de creación de usuarios, los tiempos de inicio y el uso de la memoria.

Use archivos XML de configuración del sistema, modelados en frameworks/base/data/etc/preinstalled-packages-platform.xml , para declarar qué paquetes del sistema deben instalarse inicialmente para los nuevos usuarios en función de su tipo de usuario. Idealmente, todos los paquetes del sistema en el dispositivo deberían tener una entrada en un archivo XML (codificado por su nombre de manifiesto), excepto las superposiciones estáticas, que en su lugar se tratan automáticamente de acuerdo con la entrada de su paquete de destino de superposición correspondiente. La forma en que el dispositivo debe manejar los paquetes del sistema que no se enumeran aquí está controlada por el modo de configuración .

Tipos de usuarios

Los tipos de usuario base (cada usuario será al menos uno de estos tipos) son:

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

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 granular especificando tipos de usuarios individuales, ya que cada usuario es exactamente uno de estos tipos de usuarios, que incluye los tipos de usuarios AOSP definidos en frameworks/base/core/java/android/os/UserManager.java y cualquier usuario personalizado OEM tipos definidos en frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java. Consulte la página de tipos de usuarios para obtener más información. Actualmente, los tipos de usuarios de AOSP incluyen:

  • 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

Ejemplos

Los siguientes ejemplos abordan los casos de uso más comunes:

  1. Para que un paquete del sistema esté preinstalado en el usuario 0 únicamente :
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
    
  2. Para que un paquete de sistema esté preinstalado en todos los usuarios humanos (como un navegador web), es decir, que se instale en cualquier usuario de tipo FULL o PROFILE , que se dirija a todos los usuarios humanos:
    <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 de sistema esté preinstalado en todos los usuarios humanos, excepto en los usuarios de perfil. Por ejemplo, esto podría aplicarse a una aplicación 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, utilice:
    <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 disponibles opciones más granulares especificando tipos de usuarios individuales. Por ejemplo, el siguiente código de ejemplo instala este paquete en cualquier usuario cuyo tipo de usuario sea un perfil administrado o un invitado o sea del 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 de no instalar

También se puede evitar que los paquetes se preinstalen en tipos de usuarios particulares mediante la etiqueta do-not-install-in . Tenga en cuenta que las etiquetas do-not-install-in 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 se instalará porque la etiqueta do-not-install-in tiene prioridad sobre install-in .

Controlando el comportamiento con config.xml

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

En frameworks/base/core/res/res/values/config.xml , establezca el entero denominado config_userTypePackageWhitelistMode en una combinación de los siguientes valores. Estas banderas se pueden combinar. Las banderas más importantes son:

Valor Descripción
0 (0b0000) Desactivar. Instale todos los paquetes del sistema.
1 (0b0001) Hacer cumplir. Solo instale paquetes del sistema cuando estén en la lista de permitidos.
4 (0b0100) Considere cualquier paquete que no se mencione en el archivo de la lista de permitidos como incluido implícitamente en la lista de permitidos.
8 (0b1000) Considere cualquier paquete que no se mencione en el archivo de la lista de permitidos como implícitamente en la lista de permitidos solo para el usuario del SISTEMA.

La siguiente configuración habilitará la función (para que se obedezcan las etiquetas de install-in do-not-install-in ), pero tratará los paquetes del sistema no mencionados como si estuvieran install-in para todos los usuarios:

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