Diferença entre applicationId e Nome do Pacote em Aplicativos Android
Cada aplicativo Android possui um identificador único. Em dispositivos Android e na loja de aplicativos, este ID serve como identificador exclusivo do seu aplicativo. Para atualizar um aplicativo na loja, o novo ID deve ser idêntico ao do APK original. Portanto, após o lançamento do aplicativo, não é possível alterar seu ID.
No Eclipse, não existia o conceito de applicationId, pois o nome do pacote era utilizado como identificador. No entanto, no Android Studio, esses conceitos foram diferenciados. O nome do pacote é definido no arquivo de manifesto AndroidManifest.xml:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.meuprojeto.teste" >
......
</manifest>
O applicationId é definido no arquivo build.gradle do módulo, conforme demonstrado abaixo:
android {
defaultConfig {
// Identificador do aplicativo
applicationId "com.meuprojeto.demonstracao"
minSdkVersion 19
targetSdkVersion 28
// Configuração do ndk
ndk{abiFilters "armeabi-v7a"}
}
}
Ao criar um novo projeto no Android Studio, o applicationId é definido como igual ao nome do pacote por padrão. Por essa razão, muitos desenvolvedores confundem os dois conceitos, tratando-os como se fossem a mesma coisa. Na verdade, applicationId e nome do pacote são conceitos independentes. Alterar o nome do pacote não afeta o applicationId e vice-versa.
Normalmente, o applicationId do aplicativo Android está vinculado ao nome do pacote, portanto, em algumas APIs Android, métodos e parâmetros que parecem retornar o nome do pacote, na verdade retornam o valor do applicationId. Por exemplo, o método Context.getPackageName() retorna o applicationId, não o nome do pacote. Em uma Activity específica, ao imprimir o packageName:
String identificadorApp = this.getPackageName();
Log.i("informacao","applicationId:" + identificadorApp);
A nomenclatura do applicationId não é arbitrária e deve seguir pelo menos as seguintes restrições:
- O applicationId deve conter pelo menos duas partes (ou seja, pelo menos um ponto, como com.exemplo);
- Cada parte deve começar com uma letra;
- Todos os caracteres devem ser alfanuméricos ou sublinhados [a-zA-Z0-9_];
- É o identificador do aplicativo e, uma vez definido, não pode ser alterado casualmente
PS: Se você utiliza webview, utilize o nome do pacote como prefixo do applicationId, caso contrário, pode ocorrer erro.
Função do applicationId
- Identificar exclusivamente o aplicativo;
- Permitir disfarçar o aplicativo: durante o desenvolvimento e depuração, é possível modificar o applicationId para o ID de produção, permitindo instalar múltiplas versões do mesmo aplicativo para teste. Na versão final, basta alterar o applicationId para o ID de produção;
- Permitir publicar diferentes versões do mesmo aplicativo na loja, como versão gratuita e paga. Isso requer a criação de diferentes variantes de aplicativo, que podem ser configuradas no productFlavors, conforme demonstrado no código a seguir:
// No productFlavors, configurando applicationIds diferentes para gerar diferentes aplicativos.
// Essas duas variantes de aplicativo podem coexistir na loja.
android {
defaultConfig {
applicationId "com.meuprojeto.versaobase"
}
productFlavors {
gratuito {
// Adiciona sufixo ao applicationId para a versão gratuita
applicationIdSuffix ".gratuito"
}
pago {
// Adiciona sufixo ao applicationId para a versão paga
applicationIdSuffix ".pago"
}
}
buildTypes {
debug {
// Adiciona sufixo ao applicationId para a versão de depuração
applicationIdSuffix ".depuracao"
}
}
Função do nome do pacote (package)
Por padrão, o nome do pacote é igual ao applicationId. No entanto, o desenvolvedor pode modificar o nome do pacote. Se desejar alterar o nome do pacote, é essencial garantir que a estrutura do diretório do projeto corresponda ao valor do atributo package no AndroidManifest.xml.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.meuprojeto.versaobase"
android:versionCode="1"
android:versionName="1.0" >
......
</manifest>
O valor do atributo package tem duas funções principais:
- Fornece o namespace para o arquivo R.java, por exemplo, a classe R terá o pacote com.meuprojeto.versaobase.R;
- Determina o nome relativo das classes declaradas no manifesto. Por exemplo, a declaração <activity android:name=".MainActivity"> no manifesto corresponde ao caminho completo: com.meuprojeto.versaobase.MainActivity
PS: Ao modificar o nome do pacote, é obrigatório atualizar o valor do atributo package no manifesto de forma sincronizada.
Referências