Pacotes de sistema pré-instalados

O Android oferece suporte a vários usuários em um único dispositivo. Para saber mais, consulte Como oferecer suporte a vários usuários. Como nem todos os pacotes do sistema são úteis para todos os tipos de usuários do Android, é possível usar uma lista de permissões para especificar quais pacotes do sistema precisam ser pré-instalados em cada tipo de usuário. Ao não pré-instalar pacotes de sistema desnecessários, você pode otimizar os tempos de criação e início de usuários e o uso de memória.

Use arquivos XML de configuração do sistema, modelados em frameworks/base/data/etc/preinstalled-packages-platform.xml, para declarar quais pacotes do sistema devem ser instalados inicialmente para novos usuários com base no tipo de usuário. Todos os pacotes do sistema no dispositivo precisam ter uma entrada em um arquivo XML (chaveada pelo nome do manifesto), exceto sobreposições estáticas, que são tratadas automaticamente de acordo com a entrada do pacote de destino de sobreposição correspondente. A maneira como o dispositivo lida com pacotes do sistema que não estão listados aqui é controlada pelo modo de configuração.

Tipos de usuários

Os tipos de usuários de base (cada usuário é pelo menos um destes tipos) são:

Tipo de usuário Descrição
SYSTEM Usuário 0.
FULL Qualquer usuário humano sem perfil.
PROFILE Um usuário humano de perfil.

O significado exato de cada um é definido em frameworks/base/core/java/android/content/pm/UserInfo.java.

É possível ter um controle mais granular especificando tipos de usuários individuais, já que cada usuário é exatamente um desses tipos, incluindo os tipos de usuários do AOSP definidos em frameworks/base/core/java/android/os/UserManager.java e qualquer tipo de usuário personalizado do OEM definido em frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java. Consulte a página tipos de usuários para mais informações. Atualmente, os tipos de usuários do AOSP incluem:

  • 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

Exemplos

Os exemplos a seguir abordam os casos de uso mais comuns:

  1. Para que um pacote do sistema seja pré-instalado somente no usuário 0:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. Para que um pacote do sistema seja pré-instalado em todos os usuários humanos (como um navegador da Web), ou seja, instalado em qualquer usuário do tipo FULL ou PROFILE, que aborda todos os usuários 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 um pacote do sistema seja pré-instalado em todos os usuários humanos, exceto os usuários de perfil. Por exemplo, isso pode ser aplicado a um app de plano de fundo:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. Alguns pacotes do sistema realmente precisam estar em todos os usuários, independentemente do tipo. Nesses casos, use:
    <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. Opções mais granulares também estão disponíveis ao especificar tipos de usuário individuais. Por exemplo, o código de exemplo a seguir instala esse pacote em qualquer usuário cujo tipo de usuário seja um perfil gerenciado ou um convidado ou seja de um 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>

tag do-not-install-in

Também é possível impedir que pacotes sejam pré-instalados em tipos de usuários específicos usando a tag do-not-install-in. As tags do-not-install-in substituem as tags install-in em qualquer arquivo. Exemplo:

<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>
Se um usuário for do tipo android.os.usertype.full.GUEST (um subtipo de FULL), esse pacote não será instalado porque a tag do-not-install-in tem precedência sobre install-in.

Controlar o comportamento com o config.xml

O valor do recurso de configuração config_userTypePackageWhitelistMode controla esse recurso e determina como um dispositivo interpreta pacotes do sistema que não têm entrada para nenhum tipo de usuário. Para mais informações, consulte frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode.

Em frameworks/base/core/res/res/values/config.xml, defina o número inteiro chamado config_userTypePackageWhitelistMode como uma combinação dos seguintes valores. Essas flags podem ser combinadas. As flags mais importantes são:

Valor Descrição
0 (0b0000) Desativar. Instale todos os pacotes do sistema.
1 (0b0001) Aplicar. Instale pacotes do sistema apenas quando eles estiverem na lista de permissões.
4 (0b0100) Qualquer pacote não mencionado no arquivo de lista de permissões é considerado implicitamente incluído na lista de permissões.
8 (0b1000) Considera qualquer pacote não mencionado no arquivo de lista de permissões como implicitamente incluído na lista de permissões apenas para o usuário SYSTEM.

A configuração a seguir ativa o recurso (para que as tags install-in e do-not-install-in sejam obedecidas), mas trata todos os pacotes de sistema não mencionados como se fossem install-in para todos os usuários:

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