The Android Developer Challenge is back! Submit your idea before December 2.

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 seu app, o ID do aplicativo (e o certificado que você assina com ele) precisa ser o mesmo que o do APK original. Se você alterar o ID do aplicativo, a Google Play Store tratará o APK como um app totalmente diferente. Por isso, depois que você publicar seu app, nunca troque o ID do aplicativo.

O ID do aplicativo é definido com a propriedade applicationId no arquivo build.gradle do seu módulo, conforme mostrado aqui:

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 alterar o nome de pacote do seu código (o namespace do código) sem afetar o ID do aplicativo e vice-versa (embora, mais uma vez, 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 conhecer, 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 de pacote como prefixo do ID do aplicativo para evitar problemas, como descrito no problema 211768 (link em inglês).

Alterar o ID do aplicativo para variações de compilação

Quando você cria 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 versão precisa ser definida como uma variação de produto diferente. Para cada variação 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 a compilação para 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 as ferramentas anteriores do SDK, se você não definir a propriedade applicationId no seu 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 do pacote também altera o ID do aplicativo.

Dica: se você 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 real. Para mais informações, consulte 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 APK de teste de instrumentação usando o ID do aplicativo para a variante de compilação fornecida, anexada com .test. Por exemplo, um APK de teste para a variante de compilação com.example.myapp.free tem o ID do aplicativo com.example.myapp.free.test.

Embora não seja necessário, você pode alterar o ID do aplicativo definindo a propriedade testApplicationId no seu bloco defaultConfig ou 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, esse nome (como definido pela estrutura de diretórios do seu projeto) precisa sempre corresponder 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 da 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"> foi resolvida para ser com.example.myapp.MainActivity.

Sendo assim, o nome no atributo package sempre precisa ser igual ao nome do pacote básico do seu projeto, onde você mantém as atividades e o restante do código do app. É claro que você pode ter subpacotes no projeto, mas, se 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.

É necessário sempre especificar o atributo do package no arquivo AndroidManifest.xml principal do seu projeto. Se você tem outros arquivos de manifesto, como um tipo de compilação ou uma variação de produto, saiba que o nome do pacote fornecido pelo arquivo de manifesto de maior prioridade sempre é usado no manifesto mesclado final. Para mais informações, consulte Mesclar vários 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. Portanto, se você inspecionar o arquivo AndroidManifest.xml após uma compilação, não se surpreenda se o atributo do package tiver sido alterado. 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.