Pacotes de sistema pré-instalados

O Android suporta ter vários usuários em um único dispositivo. Para saber mais, consulte 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, você pode usar uma lista de permissões para especificar quais pacotes do sistema devem 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 do usuário, os tempos de início 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 em seu tipo de usuário. Idealmente, todos os pacotes do sistema no dispositivo devem ter uma entrada em um arquivo XML (codificado por seu nome de manifesto), exceto para 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 deve lidar com os pacotes do sistema que não estão listados aqui é controlada pelo modo de configuração .

Tipos de usuário

Os tipos de usuário básicos (todo usuário será 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 de perfil.

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

Um controle mais granular pode ser obtido especificando tipos de usuário individuais, pois cada usuário é exatamente um desses tipos de usuário, o que inclui os tipos de usuário AOSP definidos em frameworks/base/core/java/android/os/UserManager.java e qualquer usuário personalizado OEM tipos definidos em frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java. Consulte a página de tipos de usuário para obter mais informações. Atualmente, os tipos de usuário 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 de sistema seja pré-instalado apenas 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, seja instalado em qualquer usuário do tipo FULL ou PROFILE , que aborde 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 para usuários de perfil. Por exemplo, isso pode ser aplicado a um aplicativo de papel de parede:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
    
  4. Alguns pacotes de 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 especificando tipos de usuários individuais. Por exemplo, o código de exemplo a seguir instala este pacote em qualquer usuário cujo tipo de usuário seja um perfil gerenciado ou um convidado ou seja do 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 não instalar

Os pacotes também podem ser impedidos de serem pré-instalados em tipos de usuários específicos usando a tag do-not-install-in . Observe que do-not-install-in substituem as tags install-in em qualquer arquivo. Por 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 será instalado porque a tag do-not-install-in tem precedência sobre install-in .

Controlando o comportamento com config.xml

O valor do recurso de configuração config_userTypePackageWhitelistMode controla esse recurso e determina como um dispositivo interpreta os pacotes do sistema que não têm entrada para nenhum tipo de usuário. Para obter 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 inteiro chamado config_userTypePackageWhitelistMode para uma combinação dos valores a seguir. Esses sinalizadores podem ser combinados. As bandeiras mais importantes são:

Valor Descrição
0 (0b0000) Desativar. Instale todos os pacotes do sistema.
1 (0b0001) Aplicar. Instale apenas pacotes do sistema quando permitidos.
4 (0b0100) Considere qualquer pacote não mencionado no arquivo de lista de permissões como implicitamente permitido.
8 (0b1000) Considere qualquer pacote não mencionado no arquivo de lista de permissões como implicitamente permitido apenas para o usuário SYSTEM.

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

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