Paquetes de sistema preinstalados

Android admite tener varios usuarios en un solo dispositivo. Para obtener más información, consulte Soporte para múltiples usuarios . Dado que no todos los paquetes del sistema son útiles para todos los tipos de usuarios de Android, puede utilizar 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.

Utilice 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 según su tipo de usuario. Idealmente, todos los paquetes del sistema en el dispositivo deberían tener una entrada en un archivo XML (con la clave de su nombre de manifiesto), excepto las superposiciones estáticas, que en cambio 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 usuarios básicos (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 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 granular especificando tipos de usuarios individuales, ya que cada usuario es exactamente uno de estos tipos de usuarios, lo 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 del sistema esté preinstalado en todos los usuarios humanos (como un navegador web), es decir, para que se instale en cualquier usuario de tipo FULL o PROFILE , que se dirige 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 del 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. Es realmente necesario que algunos paquetes del sistema estén disponibles para 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 muestra instala este paquete en cualquier usuario cuyo tipo de usuario sea un perfil administrado o un invitado o sea de un tipo 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 do-not-install-in anulan 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 se instalará porque la etiqueta do-not-install-in tiene prioridad sobre install-in .

Controlar 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 número 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. Instale solo paquetes del sistema cuando estén en la lista permitida.
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 incluido en la lista de permitidos solo para el usuario del SISTEMA.

La siguiente configuración habilitará la función (para que se respeten las etiquetas install-in y do-not-install-in ), pero tratará cualquier paquete del sistema no mencionado como si estuviera install-in para todos los usuarios:

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