Pacotes do sistema pré-instalados

O Android permite ter 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 do usuário e o uso da memória.

Use arquivos XML de configuração do sistema, modelados 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. O ideal é que todos os pacotes do sistema no dispositivo tenham uma entrada em um arquivo XML (codificada pelo nome do manifesto), exceto para sobreposições estáticas, que são tratados automaticamente de acordo com a entrada do conjunto o pacote de destino da sobreposição. A maneira como o dispositivo deve lidar com pacotes de sistema que não estão listados aqui é controlado pelo modo de configuração.

Tipos de usuários

Os tipos de usuário base (cada usuário é pelo menos um desses 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 do perfil.

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

É possível ter um controle mais granular ao especificar tipos de usuários individuais, cada usuário é exatamente um desses tipos, o que inclui os tipos de usuário do AOSP definido em frameworks/base/core/java/android/os/UserManager.java e todos os tipos de usuários personalizados OEM definidos no frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java. Consulte a página Tipos de usuário para mais informações imprecisas ou inadequadas. 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.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, instalada 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 um pacote do sistema ser pré-instalado em todos os usuários humanos, exceto para 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. Também há opções mais granulares disponíveis com a especificação tipos Por exemplo, o exemplo de código a seguir instala esse pacote em qualquer usuário com um tipo de usuário que é um perfil gerenciado, um convidado ou pertence a um SYSTEM. tipo base.
    <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"

Os pacotes também podem ser impedidos de serem pré-instalados em tipos de usuário específicos usando a tag do-not-install-in. Observe que do-not-install-in as tags 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): este pacote não está instalado porque 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. Instalar pacotes do sistema apenas quando estiverem na lista de permissões.
4 (0b0100) Considere que todos os pacotes não mencionados no arquivo da lista de permissões estão implicitamente 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>