O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Definir o ID do aplicativo

Todo app 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ê mudar o ID do aplicativo, a Google Play Store tratará o APK como um app completamente diferente. Então, depois de publicar o app, não mude 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"
    }
    ...
}

Quando você cria 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 mudar o nome de pacote do seu código (o namespace do código) sem afetar o ID do aplicativo e vice-versa. No entanto, como já explicamos, não é possível mudar o ID do aplicativo depois de publicar o app. Mudar o nome do pacote tem outras consequências que você precisa considerar, então consulte a seção sobre como fazer essa mudança.

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 "package name" (nome do pacote) nos nomes de métodos e 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, ou você poderá enfrentar problemas, conforme descrito no problema 211768.

Mudar 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, como 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 variação 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 build da seguinte forma:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

Como o Gradle aplica a configuração do tipo de build 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, cada um voltado 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 Suporte a 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, a refatoração do nome de pacote também muda 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.

Mudar 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 mudar o ID do aplicativo definindo a propriedade testApplicationId no bloco defaultConfig ou productFlavor.

Mudar o nome do pacote

Embora o nome de pacote do seu projeto seja igual ao ID do aplicativo por padrão, é possível mudá-lo. Porém, se você quiser mudar o nome do pacote, esse nome, conforme definido pela estrutura de diretórios do projeto, precisa sempre ser igual 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 app.

    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 precisa sempre ser igual ao nome do pacote básico do seu projeto, onde você mantém as atividades e o resto do código do app. É claro que 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 app declarados no manifesto precisam adicionar os nomes de subpacote que faltam, ou usar nomes de pacote totalmente qualificados.

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ê precisa sempre especificar o atributo package no arquivo AndroidManifest.xml principal do projeto. Se você tiver outros arquivos de manifesto, como para uma variação de produto ou um tipo de build, verifique se o nome do pacote fornecido pelo arquivo de manifesto de maior prioridade é sempre usado no manifesto integrado final. Para saber mais, leia Integrar vários arquivos de manifesto.

Mais uma coisa: embora você possa ter um nome diferente para o package de manifesto 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 analisam para identificar seu app. Por isso, depois que o build tiver usado o valor original para atribuir um namespace à classe R e resolver nomes de classe do manifesto, esse valor será descartado e o ID do aplicativo passará a ser usado.