Todo aplicativo Android tem um ID do aplicativo exclusivo que parece com um nome de pacote Java, como com.example.myapp. Esse ID identifica exclusivamente o aplicativo no dispositivo e na Google Play Store. Se quiser atualizar o aplicativo para uma nova versão, o ID do aplicativo (e o certificado que você assina com ele) deverá ser o mesmo que o do APK original — se você alterar o ID do aplicativo, a Google Play Store tratará o APK como um aplicativo totalmente diferente. Então, depois que publicar o seu aplicativo, nunca troque o ID do aplicativo.
Seu ID do aplicativo é definido pela propriedade applicationId no
arquivo build.gradle do módulo, como mostrado abaixo:
android {
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
...
}
Ao criar um novo projeto no Android Studio, o applicationId é
exatamente igual ao nome de pacote estilo Java que você escolheu na etapa de configuração. No entanto, o
ID do aplicativo e o nome do pacote são independentes além desse ponto.
Você pode alterar o nome de pacote do seu código (o namespace do código) sem
afetar o ID do aplicativo e vice-versa (embora, repetindo, não possa alterar
o ID do aplicativo depois de publicá-lo). Porém, alterar o nome
do pacote traz outras consequências de que você deve estar ciente, por isso, leia a seção sobre
como modificar o nome do pacote.
E, embora o ID do aplicativo pareça um nome de pacote Java tradicional, as regras de atribuição de nome dele são um pouco mais restritivas:
- Ele deve ter pelo menos dois segmentos (um ou mais pontos).
- Todo segmento deve começar com uma letra.
- Todos os caracteres devem ser alfanuméricos ou sublinhado [a–z, A–Z, 0–9 e _].
Observação: O ID do aplicativo normalmente está diretamente vinculado ao
nome de pacote do seu código, por isso, algumas Android APIs usam o termo “nome de pacote” no
nome dos métodos e dos parâmetros, mas, na realidade, esse é o ID
do seu aplicativo. Por exemplo, o método Context.getPackageName() retorna o ID do seu aplicativo.
Não é preciso mostrar o nome de pacote verdadeiro do código fora do
código do aplicativo.
Cuidado: se estiver usando WebView,
considere usar o nome de pacote como prefixo do ID do aplicativo para evitar
problemas, como descrito no problema
211768.
Alterar o ID do aplicativo para variantes de compilação
Ao compilar um APK para o aplicativo, as ferramentas de compilação marcam o APK com o
ID do aplicativo definido no bloco defaultConfig do arquivo build.gradle
(como mostrado abaixo). Porém, se você quer criar versões diferentes do aplicativo
para exibi-las em listas separadas da Google Play Store, como versões “gratuitas” e “pagas”,
será necessário criar variantes de compilação separadas, cada uma com um ID do aplicativo diferente.
Nesse caso, cada variante de compilação deve ser definida como um tipo
de produto diferente. Para cada tipo
dentro do bloco productFlavors {}, é possível redefinir a propriedade applicationId
ou anexar um segmento ao ID do aplicativo padrão
usando applicationIdSuffix, como demonstrado abaixo:
android {
defaultConfig {
applicationId "com.example.myapp"
}
productFlavors {
free {
applicationIdSuffix ".free"
}
pro {
applicationIdSuffix ".pro"
}
}
}
Dessa forma, o ID do aplicativo do produto “gratuito” é "com.example.myapp.free".
Você também pode usar applicationIdSuffix para anexar um segmento de acordo
com o tipo de compilação da seguinte forma:
android {
...
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
Como o Gradle aplica a configuração do tipo de compilação depois do tipo de produto, o ID do aplicativo da variante de compilação “sem depuração” agora é "com.example.myapp.free.debug". Isso é útil quando se quer ter a compilação para depuração e para a versão final no mesmo dispositivo porque dois APKs nunca podem ter o mesmo ID do aplicativo.
Lembre-se de que APKs com IDs de aplicativo diferentes são considerados
aplicativos diferentes pela Google Play Store. Por isso, se você quiser usar a mesma lista
de aplicativo para distribuir diversos APKs voltados a diferentes
configurações de dispositivo (como o nível da API), use o mesmo ID do aplicativo
para as variantes de compilação, mas dê a cada APK um versionCode diferente. Para saber
mais, leia sobre Suporte para vários APKs.
Cuidado: para obter compatibilidade com ferramentas do SDK anteriores, se
você não definir a propriedade applicationId no arquivo
build.gradle, as ferramentas de compilação usarão o nome de pacote do arquivo
AndroidManifest.xml como o ID do aplicativo. Nesse caso,
refatorar o nome de pacote também altera o ID do aplicativo.
Dica: Se precisar referenciar o ID do aplicativo no
arquivo de manifesto, use o marcador ${applicationId} em todos
os atributos do manifesto. Durante uma compilação, o Gradle substitui essa tag pelo ID
do aplicativo. Para saber mais, acesse Injetar variáveis de compilação
no manifesto.
Alterar o ID do aplicativo para realizar testes
Por padrão, as ferramentas de compilação aplicam um ID do aplicativo ao seu APK
de testes de instrumentação
usando o ID do aplicativo para a variante de compilação em questão, que contém
.test no nome. Por exemplo, um APK de teste da variante de compilação com.example.myapp.free
tem com.example.myapp.free.test como ID do aplicativo.
Embora não seja necessário, você pode alterar o ID do aplicativo
definindo a propriedade testApplicationId em defaultConfig ou
no bloco productFlavor.
Observação: para evitar reincidências de nome durante o teste do aplicativo, as ferramentas de compilação geram
a classe R para o APK de teste com o namespace baseado no ID do
aplicativo de teste, em vez de no nome de pacote definido no arquivo de manifesto.
Alterar o nome do pacote
Embora o nome de pacote do seu projeto seja igual ao ID do aplicativo por padrão, é
possível alterá-lo. Porém, se você quiser alterar o nome do pacote, certifique-se de que
o nome de pacote (como definido pela estrutura de diretórios do projeto) sempre
corresponda ao atributo package no arquivo AndroidManifest.xml, conforme mostrado
a seguir:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
android:versionCode="1"
android:versionName="1.0" >
As ferramentas de compilação do Android usam o atributo package para duas coisas:
- Aplicar esse nome como o namespace para a classe
R.javagerada pelo aplicativo.Exemplo: Com o manifesto acima, a classe
Rserácom.example.myapp.R. - Usá-lo para resolver nomes de classe relativos declarados no
arquivo de manifesto.
Exemplo: Com o manifesto acima, uma atividade declarada como
<activity android:name=".MainActivity">é resolvida como sendocom.example.myapp.MainActivity.
Sendo assim, o nome no atributo package sempre deve ser igual ao nome
do pacote básico do seu projeto, onde você mantém as atividades e o resto do código do aplicativo. É claro,
você pode ter subpacotes no projeto, mas, se esse for o caso, esses arquivos devem
importar a classe R.java usando o namespace do atributo package e
todos os componentes do aplicativo declarados no manifesto devem adicionar os nomes
de subpacote que faltam (ou usar nomes de pacote não ambíguos).
Se você quiser refatorar o nome do pacote completamente, não deixe de atualizar o atributo
package também. Desde que você use as ferramentas do Android Studio para renomear
e refatorar os pacotes, eles permanecerão sincronizados automaticamente (se não
ficarem sincronizados, o código do aplicativo não poderá resolver a classe R
porque ela não estará mais no mesmo pacote e o manifesto não identificará
as atividades nem outros componentes).
Você sempre deve especificar o atributo package no arquivo
AndroidManifest.xml principal do projeto. Se você tiver arquivos de manifesto adicionais (como para
um tipo de produto ou de compilação), verifique se o nome do pacote fornecido pelo
arquivo de manifesto de maior prioridade é sempre usado no manifesto combinado final.
Para saber mais, leia
Combinar diversos arquivos de manifesto.
Mais uma coisa: Embora você possa ter um nome
diferente para o package do manifesto e para o
applicationId do Gradle, as ferramentas de compilação copiam o ID do aplicativo para o
arquivo de manifesto final do APK no fim da compilação. Então, se você inspecionar o arquivo
AndroidManifest.xml após uma compilação, não se surpreenda se o atributo
package tiver mudado. O atributo package
é o que a Google Play Store e a plataforma Android realmente buscam para identificar
o seu aplicativo, por isso, depois que a compilação usou o valor original (para atribuir um namespace à classe
R e resolver nomes de classe do manifesto), ela descarta esse valor
e passar a usar o ID do aplicativo.