Skip to content

Most visited

Recently visited

navigation

Práticas recomendadas para identificadores exclusivos

Embora existam motivos válidos pelos quais seu aplicativo possa precisar identificar um dispositivo em vez de uma instância do aplicativo ou um usuário autenticado no dispositivo, para a grande maioria dos aplicativos, o principal objetivo é identificar uma instalação específica do seu aplicativo (não o dispositivo físico em si).

Felizmente, identificar uma instalação no Android é um processo simples usando um código de instância ou criando seu próprio GUID no momento da instalação. Este documento oferece orientações para selecionar identificadores apropriados para seu aplicativo com base em seu caso de uso.

Para obter uma perspectiva geral sobre as permissões do Android, consulte Permissões e dados do usuário. Para obter práticas recomendadas específicas sobre como trabalhar com as permissões do Android, consulte Práticas recomendadas para permissões de aplicativos.

Princípios de como trabalhar com os identificadores do Android

Recomendamos seguir estes princípios ao trabalhar com os identificadores do Android:

#1: Evite o uso de identificadores de hardware. Identificadores de hardware, como o SSAID (código Android) e o IMEI, podem ser evitados na maioria dos casos de uso sem limitar os recursos necessários.

#2: Use apenas o código de publicidade para criar perfis de usuários ou para casos de uso de anúncios. Ao usar um código de publicidade, sempre respeite o sinalizador Limit Ad Tracking, garanta que o identificador não possa ser conectado a informações de identificação pessoal (PII) e evite a transmissão de redefinições de códigos de publicidade.

#3: Use um código de instância ou um GUID armazenado de forma privada sempre que possível para todos os demais casos de uso, exceto a prevenção de fraude de pagamento e a telefonia. Para a grande maioria dos casos de uso que não incluem anúncios, um código de instância ou GUID deve bastar.

#4: Use APIs que sejam apropriadas para seu caso de uso para minimizar os riscos à privacidade. Use a DRM API para proteger conteúdo de alto valor e a SafetyNet API para evitar abusos. A SafetyNet API é a maneira mais fácil de determinar se um dispositivo é verdadeiro sem causar riscos à privacidade.

As demais seções deste guia detalham essas regras no contexto do desenvolvimento de aplicativos Android.

Identificadores no Android 6.0 e versões posteriores

Os endereços MAC são globalmente exclusivos, não podem ser redefinidos e persistem após uma redefinição de fábrica. Geralmente, não é recomendável usar endereços MAC para qualquer forma de identificação do usuário. Consequentemente, a partir do Android M, os endereços MAC dos dispositivos locais (por exemplo, Wi-Fi e Bluetooth) não serão disponibilizados via APIs de terceiros. Os métodos WifiInfo.getMacAddress() e BluetoothAdapter.getDefaultAdapter().getAddress() retornarão 02:00:00:00:00:00.

Além disso, você deverá ter as seguintes permissões para acessar os endereços MAC de dispositivos externos próximos via verificações de Bluetooth e Wi-Fi:

Método/propriedade Permissões necessárias
WifiManager.getScanResults() ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION
BluetoothDevice.ACTION_FOUND ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION
BluetoothLeScanner.startScan(ScanCallback) ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION

Trabalhar com códigos de publicidade

O código de publicidade é um identificador que pode ser redefinido pelo usuário e que é apropriado para casos de uso com anúncios, mas você deve ter em mente alguns pontos ao usá-lo:

Sempre respeite a intent do usuário ao redefinir o código de publicidade. Não transmita redefinições do usuário usando um identificador de dispositivo mais persistente ou impressões digitais para vincular códigos de publicidade subsequentes sem a permissão do usuário. A Política de Conteúdo do Desenvolvedor do Google Play declara:

... se redefinido, um novo identificador de publicidade não deverá ser vinculado a um identificador anterior ou a dados derivados de um identificador anterior sem a permissão explícita do usuário.

Sempre respeite o sinalizador Personalized Ads associado. Códigos de publicidade são configuráveis de forma que os usuários podem limitar a quantidade de rastreamento associada a ele. Sempre use o método AdvertisingIdClient.Info.isLimitAdTrackingEnabled() para garantir que você não esteja ignorando os desejos dos seus usuários. A Política de Conteúdo do Desenvolvedor do Google Play declara:

... você deve obedecer às configurações “Opt out of interest-based advertising” ou “Opt out of Ads Personalization” do usuário. Se um usuário ativar essa configuração, você não poderá usar o identificador de publicidade para criar perfis de usuários para fins de publicidade ou para direcionar anúncios personalizados aos usuários. As atividades permitidas incluem publicidade contextual, limitação de frequência, rastreamento de conversões, geração de relatórios e segurança e detecção de fraude.

Esteja ciente das políticas de segurança ou privacidade associadas aos SDKs que utilizar em relação ao uso de códigos de publicidade. Por exemplo, se você estiver usando o método mTracker.enableAdvertisingIdCollection(true) do Google Analytics SDK, não deixe de consultar e obedecer a todas as políticas aplicáveis do Analytics SDK.

Além disso, esteja ciente de que a Política de Conteúdo do Desenvolvedor do Google Play exige que o código de publicidade “não seja conectado a informações de identificação pessoal ou associado a qualquer identificador de dispositivo persistente (por exemplo: SSAID, endereço MAC, IMEI, etc.) sem a permissão explícita do usuário.”

Por exemplo, suponha que você queira coletar informações para preencher tabelas de bancos de dados com as seguintes colunas:

timestamp ad_id account_id clickid

TABELA-01

account_id name dob country

TABELA-02

Nesse exemplo, a coluna ad_id poderia ser vinculada a PII pela coluna account_id nas duas tabelas, o que seria uma violação da Política de Conteúdo do Desenvolvedor do Google Play, caso você não tenha obtido a permissão explícita dos seus usuários.

Lembre-se de que vínculos entre um código de publicidade e PII não são sempre tão explícitos. É possível ter "identificadores parciais" que aparecem nas tabelas de chaves PII e Ad ID, o que também causaria problemas. Por exemplo, suponha que alteremos a TABELA-01 e a TABELA-02 da seguinte forma:

timestamp ad_id clickid dev_model

TABELA-01

timestamp demo account_id dev_model name

TABELA-02

Nesse caso, com eventos de cliques suficientemente raros, ainda é possível vincular o código de publicidade da TABELA-01 com as PII contidas na TABELA-02 usando a marcação de data e hora do evento e o modelo do dispositivo.

Embora normalmente seja difícil garantir que esses identificadores parciais não existam em um conjunto de dados, os riscos de vinculação mais óbvios podem ser evitados ao generalizar os dados exclusivos sempre que possível. No exemplo, isso significaria reduzir a precisão da marcação de data e hora para que vários dispositivos com o mesmo modelo aparecessem para cada marcação de data e hora.

Outras soluções incluem:

Para saber mais sobre como trabalhar de forma responsável com os códigos de publicidade, consulte o artigo de ajuda Código de publicidade da central de ajuda.

Trabalhar com códigos de instância e GUIDs

A solução mais simples para identificar a instância de aplicativo executada em um dispositivo é usar o código de instância. Essa é a solução recomendada na maioria dos casos de uso que não incluem anúncios. Somente a instância do aplicativo para o qual ele foi fornecido pode acessar esse identificador e é (relativamente) fácil de redefini-lo, pois ele persiste ap-enas enquanto o aplicativo estiver instalado.

Consequentemente, códigos de instância têm propriedades de privacidade melhores em comparação a códigos de hardware no escopo no dispositivo, que não podem ser redefinidos. Eles também incluem um par de chaves para assinar mensagens (e ações semelhantes) e estão disponíveis no Android, no iOS e no Chrome. Consulte o documento O que é um código de instância? na central de ajuda para saber mais.

Em casos nos quais um código de instância não é prático, também é possível usar códigos personalizados globalmente exclusivos (GUIDs) para identificar uma instância de aplicativo específica. A maneira mais fácil de fazer isso é gerar seu próprio GUID usando o código a seguir.

String uniqueID = UUID.randomUUID().toString();

Como esse identificador é globalmente exclusivo, ele pode ser usado para identificar uma instância de aplicativo específica. Para evitar preocupações relacionadas à vinculação do identificador entre diferentes aplicativos, os GUIDs devem ser armazenados no armazenamento interno, não em um armazenamento externo (compartilhado). Consulte o guia de Opções de armazenamento para saber mais.

Entender as características do identificador

O sistema operacional Android oferece diversos códigos com diferentes características de comportamento e o código a ser usando depende de como essas características se adequam ao seu caso de uso. No entanto, essas características também são acompanhadas por implicações de privacidade, então é importante entender como elas funcionam em conjunto.

Escopo

O escopo do identificador explica quais sistemas podem acessá-lo. O escopo do identificador do Android geralmente tem três tipos:

Quanto mais amplo for o escopo concedido a um identificador, maior será o risco de ele ser usado para fins de rastreamento. Por outro lado, se um identificador só puder ser acessado por uma só instância de aplicativo, ele não poderá ser usado para rastrear um dispositivo em transações entre diferentes aplicativos.

Capacidade de redefinição e persistência

A capacidade de redefinição e a persistência definem a duração do identificador e explicam como ele pode ser redefinido. Acionadores de redefinições comuns são: redefinições dentro do aplicativo, redefinições pelas configurações do sistema, redefinições durante a inicialização e redefinições durante a instalação. Os identificadores do Android podem ter durações variadas, mas a duração geralmente é relacionada a como o código é redefinido:

A capacidade de redefinição dá aos usuários a capacidade de criar um novo código não associado a informações de perfil existentes. Isso é importante pois, quanto mais longa e confiável for a persistência de um identificador (por exemplo, após a redefinição para as configurações de fábrica etc.), maior será o risco de o usuário estar sujeito ao rastreamento de longo prazo. Se o identificador for redefinido após a reinstalação do aplicativo, isso reduz a persistência e fornece uma forma de redefinir o código, mesmo que o usuário não controle explicitamente essa redefinição pelo aplicativo ou pelas configurações do sistema.

Exclusividade

A exclusividade estabelece a probabilidade de identificadores exclusivos existirem no escopo associado. No nível mais alto, um identificador globalmente exclusivo nunca entrará em conflito, mesmo em outros dispositivos/aplicativos. Caso contrário, o nível de exclusividade dependerá do tamanho do identificador e da fonte de aleatoriedade usada para criá-lo. Por exemplo, a chance de conflito é muito maior para identificadores criados com a data de calendário da instalação (por exemplo, 2015-01-05) do que para identificadores criados com a marcação de data e hora do Unix da instalação (por exemplo, 1445530977).

Em geral, identificadores de contas de usuário podem ser considerados exclusivos (ou seja, cada combinação de dispositivo/conta tem um código exclusivo). Por outro lado, quanto menos exclusivo for um identificador em um grupo (por exemplo, de dispositivos), maior será a proteção da privacidade, pois ele será menos útil para rastrear um usuário individual.

Proteção de integridade e não repudiabilidade

Um identificador que é difícil de fraudar ou reproduzir pode ser usado para provar que o dispositivo ou a conta associada tem certas propriedades (por exemplo, que não é um dispositivo virtual usado por um criador de spam). Identificadores difíceis de falsificar também proporcionam a não repudiabilidade. Se um dispositivo assina uma mensagem com uma chave secreta, é difícil afirmar que o dispositivo de outra pessoa enviou a mensagem. A não repudiação pode ser desejada pelo usuário (por exemplo, para autenticar um pagamento) ou não (por exemplo, se o usuário enviou uma mensagem da qual se arrependeu).

Casos de uso comuns e os identificadores a serem usados

Esta seção fornece alternativas para o uso de códigos de hardware, como o IMEI e o SSAID, para a maioria dos casos de uso. A dependência de códigos de hardware não é recomendável, pois o usuário não pode redefini-los e geralmente tem controle limitado sobre sua coleta.

Rastrear as preferências de usuários não conectados

Neste caso, você está salvando o estado por dispositivo no lado do servidor.

Recomendamos: Código de instância ou GUID.

Por que essa recomendação?

Informações que persistem após reinstalações não são recomendadas, pois os usuários podem querer redefinir suas preferências ao reinstalar o aplicativo.

Rastrear o comportamento de usuários não conectados

Neste caso, você criou o perfil de um usuário com base em seu comportamento em diferentes aplicativos/sessões no mesmo dispositivo.

Recomendamos: Código de publicidade.

Por que essa recomendação?

O uso do código de publicidade é obrigatório para casos de uso de publicidade segundo a Política de Conteúdo do Desenvolvedor do Google Play, pois ele pode ser redefinido pelo usuário.

Gerar dados de análises de usuários anônimos/não conectados

Neste caso, você está medindo as estatísticas de uso e os dados de análise para usuários não conectados ou anônimos.

Recomendamos: Código de instância; se um código de instância for insuficiente, você pode usar um GUID.

Por que essa recomendação?

O escopo de um código de instância ou de um GUID é o aplicativo que o cria, o que impede que ele seja usado para rastrear usuários entre diferentes aplicativos. Ele também pode ser facilmente redefinido ao limpar os dados do aplicativo ou reinstalá-lo. É fácil criar códigos de instância e GUIDs:

Esteja ciente de que, se você informou o usuário de que os dados que você está coletando são anônimos, é necessário garantir que você não vincule o identificador a PII ou a outros identificadores que possam estar vinculados a PII.

Você também pode usar o Google Analytics for Mobile Apps, que oferece uma solução de análise por aplicativo.

Rastrear conversões de usuários não conectados

Neste caso, você está rastreando as conversões para verificar se sua estratégia de marketing teve sucesso.

Recomendamos: Código de publicidade.

Por que essa recomendação?

Este é um caso de uso relacionado a anúncios, o que pode exigir um código que esteja disponível em diferentes aplicativos, portanto, o uso de um código de publicidade é a solução mais apropriada.

Gerenciar várias instalações

Neste caso, você precisa identificar a instância correta do aplicativo quando ele é instalado em vários dispositivos para o mesmo usuário.

Recomendamos: Código de instância ou GUID.

Por que essa recomendação?

O código de instância foi criado explicitamente para esse fim; seu escopo é limitado ao aplicativo, portanto, ele não pode ser usado para rastrear usuários em diferentes aplicativos e ele é redefinido quando o aplicativo é reinstalado. Nos raros casos em que um código de instância é insuficiente, você pode usar um GUID.

Antifraude: Aplicar limites de conteúdo livre / detectar ataques Sybil

Neste caso, você quer limitar o número de conteúdos livres (como artigos) que um usuário pode visualizar em um dispositivo.

Recomendamos: Código de instância ou GUID.

Por que essa recomendação?

O uso de um GUID ou código de instalação força o usuário a reinstalar o aplicativo para superar os limites de conteúdo, o que geralmente é um empecilho suficiente para a maioria das pessoas. Caso isso não seja uma proteção suficiente, o Android fornece uma DRM API que pode ser usada para limitar o acesso ao conteúdo.

Gerenciar os recursos de telefonia e da operadora

Neste caso, seu aplicativo está interagindo com os recursos de telefone e mensagens de texto do dispositivo.

Recomendamos: IMEI, IMSI e Line1 (exige o grupo de permissões PHONE no Android 6.0 (nível de API 23) e superiores).

Por que essa recomendação?

O uso de identificadores de hardware é aceitável se isso for necessário para recursos relacionados à telefonia/operadora; por exemplo, para alternar entre os slots de chips/operadoras de celular ou para enviar mensagens SMS por IP (para Line1) - contas de usuários baseadas em chips. No entanto, é importante observar que, no Android 6.0 e superiores, esses identificadores só podem ser usados por meio de uma permissão de tempo de execução e que os usuários podem desativar essa permissão, portanto, seu aplicativo deve lidar com essas exceções de forma apropriada.

Detecção de abuso: Identificar bots e ataques DDoS

Neste caso, você está tentando detectar vários dispositivos falsos atacando seus serviços de back-end.

Recomendamos: A SafetyNet API.

Por que essa recomendação?

Um identificador isolado não ajuda a identificar se um dispositivo é verdadeiro. Você pode identificar se uma solicitação foi enviada por um dispositivo Android verdadeiro (em vez de um emulador ou outro dispositivo de falsificação de código) usando o método SafetyNet.SafetyNetApi.attest(mGoogleApiClient, nonce) da SafetyNet API para verificar a integridade do dispositivo que fez a solicitação. Para obter informações mais detalhadas, consulte a documentação da SafetyNet API.

Detecção de abuso: Detectar o roubo de identidades de alto valor

Neste caso, você está tentando detectar se um único dispositivo está sendo usado várias vezes com credenciais de alto valor roubadas (por exemplo, para fazer pagamentos fraudulentos).

Recomendamos: IMEI/IMSI (exige o grupo de permissões PHONE no Android 6.0 (nível de API 23) e superiores).

Por que essa recomendação?

Com credenciais roubadas, dispositivos podem ser usados para monetizar várias credenciais de alto valor roubadas (como cartões de crédito com token). Nesses cenários, códigos de software podem ser redefinidos para evitar a detecção, portanto, é permitido o uso de identificadores de hardware.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Siga o Google Developers no WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)