Diferença entre applicationId e Nome do Pacote em Aplicativos Android

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

Tags: android applicationId nome do pacote build.gradle AndroidManifest.xml

Publicado em 7-10 19:10