Definir o ID do aplicativo

Todo app para Android tem um ID do aplicativo exclusivo que se parece com um nome de pacote Java, como com.example.myapp. Esse ID identifica o app de modo exclusivo no dispositivo e na Google Play Store. Se você quiser fazer upload de uma nova versão do app, o ID do aplicativo (e o certificado de assinatura) precisará ser o mesmo do APK original. Se você alterar o ID do aplicativo, a Google Play Store tratará o APK como um aplicativo completamente diferente. Assim, depois de publicar o app, você nunca deve alterar o ID do aplicativo.

O 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, como já explicamos, não possa alterar o ID do aplicativo depois de publicar o app). No entanto, alterar o nome do pacote tem outras consequências que você precisa considerar, então consulte a seção sobre como alterar 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 precisa ter pelo menos dois segmentos (um ou mais pontos).
  • Cada segmento precisa começar com uma letra.
  • Todos os caracteres precisam ser alfanuméricos ou um sublinhado [a-zA-Z0-9_].

Observação: o ID do aplicativo costumava ser diretamente vinculado ao nome do pacote do código. Por isso, algumas APIs Android usam o termo "nome do pacote" nos nomes de métodos e nomes de parâmetros delas, mas esse é, na verdade, o ID do aplicativo. Por exemplo, o método Context.getPackageName() retorna o ID do aplicativo. Não é necessário compartilhar o verdadeiro nome do pacote do código fora do código do app.

Cuidado: se você estiver usando WebView, considere usar o nome do pacote como um prefixo no ID do aplicativo; caso contrário, você poderá encontrar problemas conforme descrito no problema número 211768.

Alterar o ID do aplicativo para variantes de compilação

Ao criar um APK para o app, as ferramentas de compilação marcam o APK com o ID do aplicativo definido no bloco defaultConfig do arquivo build.gradle (como mostrado abaixo). No entanto, se você quiser criar versões diferentes do app para aparecerem como listagens separadas na Google Play Store, por exemplo, uma versão "free" (grátis) e uma "pro" (avançada), será necessário criar variantes de compilação separadas, cada uma com um ID do aplicativo diferente.

Nesse caso, cada variante de compilação precisa ser definida como uma variação 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 para uma variação de produto "free" é "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 de acordo com a variação do produto, o ID do aplicativo para a variante de compilação "free debug" (depuração grátis) agora é "com.example.myapp.free.debug". Isso é útil quando se quer ter o build de depuração e de lançamento no mesmo dispositivo, porque dois APKs nunca podem ter o mesmo ID do aplicativo.

Lembre-se de que APKs com IDs do aplicativo diferentes são considerados apps diferentes pela Google Play Store. Por isso, se você quiser usar os mesmos detalhes do app 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 mais informações, leia sobre Compatibilidade com vários APKs.

Cuidado: para 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 do 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 você precisar fazer referência ao ID do aplicativo no arquivo de manifesto, use o marcador ${applicationId} em qualquer atributo 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 testes

Por padrão, as ferramentas de compilação aplicam um ID do aplicativo ao seu APK de teste 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.

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.java gerada pelo aplicativo.

    Exemplo: com o manifesto acima, a classe R será 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 com.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 precisam 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 eles não permanecerem sincronizados, o código do app não poderá resolver a classe R, porque ela não estará mais no mesmo pacote, e o manifesto não identificará suas atividades ou 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 manifesto de package e o applicationId do Gradle, as ferramentas de compilação copiam o ID do aplicativo para o arquivo de manifesto final do APK ao término 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 seu app, por isso, depois que a compilação tiver usado o valor original (para atribuir um namespace à classe R e resolver nomes de classe do manifesto), ela descartará esse valor e passará a usar o ID do aplicativo.