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:
- 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>
- 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
ouPROFILE
, 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>
- 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>
- 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>
- 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>
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>