Modifications de l'identifiant publicitaire : comment récupérer le GAID Google sous Android 13+ ?

opoinstall
2026-08-24
5 min read

Qu'est-ce que le GAID et comment le récupérer par programmation ? Le Google Advertising ID (GAID) est un identifiant logiciel réinitialisable par l'utilisateur fourni par les services Google Play pour la mesure publicitaire. Il est récupéré par programmation en dehors du thread principal à l'aide de l'API AdvertisingIdClient, après s'être assuré que le manifeste de l'application fusionnée contient l'autorisation AD_ID lorsque cela est requis.

Le Google Advertising ID (GAID), également connu sous le nom d'Android Advertising ID (AAID), est une chaîne unique réinitialisable par l'utilisateur fournie par les services Google Play pour l'attribution publicitaire, le ciblage publicitaire personnalisé et l'analyse sur les appareils Android. Les applications ciblant Android 13 (niveau d'API 33) ou supérieur doivent s'assurer que le manifeste fusionné contient l'autorisation com.google.android.gms.permission.AD_ID lorsqu'elles accèdent à l'identifiant publicitaire des services Google Play ; sinon, l'API renvoie une valeur entièrement composée de zéros.

Terme Définition
GAID Identifiant publicitaire Google fourni par les services Google Play pour la mesure publicitaire.
AdvertisingIdClient L'API des services Google Play utilisée pour interroger les métadonnées de l'identifiant publicitaire.
Autorisation AD_ID L'autorisation du manifeste Android requise pour les applications ciblant le niveau d'API 33+ lors de l'accès à l'identifiant publicitaire des services Google Play.
Identifiant mis à zéro La valeur sentinelle entièrement composée de zéros (00000000-0000-0000-0000-000000000000) renvoyée lorsque l'identifiant publicitaire n'est pas disponible ou est bloqué.

Qu'est-ce que le GAID et comment fonctionne l'identifiant publicitaire Google

L'anatomie technique de l'identifiant publicitaire

Le Google Advertising ID (GAID) est renvoyé par les services Google Play sous la forme d'une chaîne d'identifiant opaque, généralement formatée comme un UUID hexadécimal en minuscules de 128 bits (par exemple, 38400000-8cf0-11bd-b23e-10b96e4ef00d). Les applications doivent traiter la chaîne renvoyée comme un identifiant opaque plutôt que d'inférer une logique métier à partir de son formatage.

Contrairement aux identifiants matériels, le GAID est conçu avec des contrôles de confidentialité explicites :

  • Réinitialisable par l'utilisateur : les utilisateurs peuvent générer un nouvel identifiant aléatoire à tout moment via les paramètres de l'appareil.
  • Supprimable par l'utilisateur : à partir d'Android 12, les utilisateurs peuvent supprimer leur identifiant publicitaire, demandant ainsi aux services Google Play de ne pas communiquer les identifiants publicitaires à l'ensemble des applications.
  • Portée par profil d'appareil : les identifiants publicitaires sont généralement disponibles pour toutes les applications d'un même profil utilisateur sur l'appareil, mais différents profils d'utilisateurs ou invités Android sur le même appareil physique reçoivent des identifiants publicitaires distincts.

Le rôle des services Google Play dans la gestion de l'état de l'identifiant

Le GAID ne fait pas partie du framework open source Android principal. Il s'agit d'un service au niveau de l'application géré et servi dynamiquement par la bibliothèque cliente propriétaire des services Google Play (com.google.android.gms:play-services-ads-identifier).

Lorsqu'une application appelle les services Google Play, le client effectue une communication bloquante avec les services Google Play pour récupérer l'identifiant publicitaire actuel et la préférence de l'utilisateur concernant la limitation du suivi publicitaire.

Pourquoi le GAID a remplacé les identifiants matériels

Dans les premières versions d'Android, les réseaux publicitaires et les développeurs suivaient les événements de conversion à l'aide d'identifiants matériels non réinitialisables :

  • Identifiant international d'équipement mobile (IMEI) : lié au matériel cellulaire de l'appareil.
  • Adresse MAC (Media Access Control) : liée au matériel de l'interface réseau.
  • ANDROID_ID (SSAID) : sur les versions Android 8.0+ récentes, cet identifiant est délimité par combinaison de clé de signature d'application, d'utilisateur et d'appareil, plutôt que de fonctionner comme une clé publicitaire universelle inter-applications.

Pour les cas d'usage publicitaires sur Google Play, les développeurs doivent utiliser l'identifiant publicitaire lorsqu'il est disponible, plutôt de le remplacer par un autre identifiant d'appareil persistant.

Voir aussi : GAID ──> Architecture d'attribution mobile

Exigences d'autorisation d'Android 13 : la déclaration dans le manifeste AD_ID

Le modèle d'application du niveau d'API 33

À partir d'Android 13 (niveau d'API 33), Google a introduit l'autorisation com.google.android.gms.permission.AD_ID :

  • SDK cible 33 et supérieur : les applications ciblant Android 13 ou version ultérieure doivent déclarer l'autorisation AD_ID dans leur manifeste. Si l'autorisation est omise, les services Google Play renvoient une chaîne de zéros (00000000-0000-0000-0000-000000000000).
  • SDK cible 32 et inférieur : l'autorisation AD_ID n'est pas requise dans le manifeste. Cependant, l'identifiant publicitaire peut toujours être indisponible ou mis à zéro en raison des paramètres de confidentialité de l'identifiant publicitaire de l'utilisateur, y compris la limitation du suivi publicitaire ou les états de suppression.
  • Déclarations de politique de la Play Store : lors de la soumission d'une mise à jour ciblant le niveau d'API 33+, les développeurs doivent compléter la déclaration d'identifiant publicitaire actuelle dans la Google Play Console, en indiquant précisément si et comment l'application utilise l'identifiant.

Flux de récupération du GAID sous Android 13 et d'identifiant mis à zéro

Configuration d'AndroidManifest.xml et des dépendances Gradle

Pour déclarer l'autorisation, incluez la balise <uses-permission> dans AndroidManifest.xml. Dans le fichier build.gradle de votre module d'application, ajoutez la dépendance officielle play-services-ads-identifier.

La configuration ci-dessous illustre la syntaxe de l'autorisation du manifeste et la configuration des dépendances Gradle :

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <!-- Required on API 33+ to access non-zero GAID -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.MyApp">
        <!-- Application Components -->
    </application>
</manifest>
// Location: app/build.gradle
// Note: Example dependency versions shown; verify current stable releases in official repositories before production use.

dependencies {
    // Official Google Play services Ads Identifier library
    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'

    // Kotlin Coroutines for off-main-thread asynchronous execution
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}

Comprendre la fusion des manifestes : l'injection de SDKs transitifs

Lors de la compilation d'un fichier APK Android ou d'un bundle d'application Android (AAB), le système de build Gradle fusionne les manifestes de toutes les bibliothèques tierces importées en un seul fichier AndroidManifest.xml final.

Si un SDK de réseau publicitaire, un outil d'analyse ou une bibliothèque d'attribution importé déclare com.google.android.gms.permission.AD_ID dans son manifeste interne, cette autorisation est automatiquement fusionnée dans votre build final. Les développeurs peuvent inspecter app/build/outputs/logs/manifest-merger-release-report.txt pour auditer quelle dépendance a introduit l'autorisation.

Récupération par programmation : extraction du GAID via AdvertisingIdClient en Kotlin

La règle impérative d'exécution en dehors du thread principal

L'appel de AdvertisingIdClient.getAdvertisingIdInfo(context) déclenche un appel synchrone vers les services Google Play. Google interdit explicitement l'exécution de cette méthode sur le thread principal (UI).

L'appel de getAdvertisingIdInfo() sur le thread principal déclenche immédiatement une exception IllegalStateException :

java.lang.IllegalStateException: Calling this from your main thread can lead to deadlock

Pour éviter les erreurs ANR (Application Not Responding) et les plantages à l'exécution, les développeurs doivent déléguer l'appel d'extraction dans un thread d'arrière-plan ou une coroutine Kotlin à l'aide de Dispatchers.IO.

Récupération du GAID par AdvertisingIdClient en dehors du thread principal

Mise en œuvre de tâches d'arrière-plan à l'aide de coroutines Kotlin

L'implémentation Kotlin ci-dessous illustre un AdvertisingIdManager sécurisé pour les threads qui effectue l'extraction en dehors du thread principal, gère les exceptions de disponibilité des services Google Play et valide l'intégrité de l'identifiant :

package com.example.myapp.analytics

import android.content.Context
import android.util.Log
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
import com.google.android.gms.common.GooglePlayServicesRepairableException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.IOException

data class GaidResult(
    val gaid: String?,
    val isLimitAdTrackingEnabled: Boolean,
    val isZeroed: Boolean,
    val isAvailable: Boolean
)

object AdvertisingIdManager {

    private const val TAG = "AdvertisingIdManager"
    private const val ZEROED_GAID = "00000000-0000-0000-0000-000000000000"

    /**
     * Programmatically retrieves the Google Advertising ID off the main execution thread.
     * Automatically handles exceptions, zeroed states, and user opt-outs.
     */
    suspend fun fetchGaid(context: Context): GaidResult = withContext(Dispatchers.IO) {
        try {
            // Invokes blocking Google Play services IPC on the IO coroutine dispatcher
            val adInfo: AdvertisingIdClient.Info = AdvertisingIdClient.getAdvertisingIdInfo(context)
            
            val rawId = adInfo.id
            val isLAT = adInfo.isLimitAdTrackingEnabled
            val isZeroed = rawId == null || rawId.equals(ZEROED_GAID, ignoreCase = true)

            if (isZeroed) {
                Log.w(TAG, "Advertising ID is unavailable or zeroed.")
                GaidResult(
                    gaid = null,
                    isLimitAdTrackingEnabled = isLAT,
                    isZeroed = true,
                    isAvailable = false
                )
            } else {
                Log.d(TAG, "Advertising ID successfully retrieved. LAT enabled: $isLAT")
                GaidResult(
                    gaid = rawId,
                    isLimitAdTrackingEnabled = isLAT,
                    isZeroed = false,
                    isAvailable = true
                )
            }
        } catch (e: GooglePlayServicesNotAvailableException) {
            Log.e(TAG, "Google Play services is not installed or unavailable on this device.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: GooglePlayServicesRepairableException) {
            Log.w(TAG, "Google Play services requires an update or user recovery.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: IOException) {
            Log.e(TAG, "Communication error connecting to Google Play services.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: IllegalStateException) {
            Log.e(TAG, "Illegal state while retrieving Advertising ID.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: Exception) {
            Log.e(TAG, "Unexpected error retrieving Google Advertising ID.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        }
    }
}

Analyse de AdvertisingIdClient.Info et gestion de la limitation du suivi publicitaire

La méthode AdvertisingIdClient.getAdvertisingIdInfo() renvoie un objet AdvertisingIdClient.Info contenant deux propriétés clés :

  • getId() (String) : la chaîne alphanumérique représentant l'identifiant publicitaire.
  • isLimitAdTrackingEnabled() (Boolean) : lorsque la limitation du suivi publicitaire est activée, la politique de Google Play interdit l'utilisation des données de l'identifiant publicitaire pour créer des profils publicitaires ou cibler des annonces personnalisées. La politique autorise toujours des activités telles que la publicité contextuelle, la limitation de la fréquence d'affichage, le suivi des conversions, les rapports et la détection de la sécurité/fraude ; cependant, sur les services Google Play actuels, l'identifiant publicitaire lui-même est mis à zéro lorsque ce paramètre est activé, de sorte que les applications ne doivent pas supposer qu'un GAID utilisable reste disponible.

Gestion des identifiants mis à zéro et des états de suppression initiés par l'utilisateur

La chaîne 00000000-0000-0000-0000-000000000000 : quand et pourquoi elle apparaît

Dans les environnements de production, AdvertisingIdClient.Info.getId() renvoie 00000000-0000-0000-0000-000000000000 lorsque :

  1. L'utilisateur a supprimé l'identifiant publicitaire : l'utilisateur s'est rendu dans les paramètres de l'appareil et a supprimé son identifiant publicitaire.
  2. La limitation du suivi publicitaire est activée : l'utilisateur a activé la limitation du suivi publicitaire sur les versions de système d'exploitation prises en charge.
  3. L'autorisation du manifeste est manquante : l'application cible Android 13+ (niveau d'API 33+) et omet de déclarer com.google.android.gms.permission.AD_ID dans son manifeste fusionné.

Gestion de l'identifiant mis à zéro du GAID et de l'état de confidentialité

Flux des paramètres utilisateur : suppression de l'identifiant publicitaire

Sur les versions actuelles d'Android, les utilisateurs peuvent supprimer leur identifiant en accédant à :

Paramètres > Confidentialité > Annonces > Supprimer l'identifiant publicitaire (les libellés exacts peuvent varier selon le fabricant de l'appareil).

Une fois supprimé, les services Google Play effacent la valeur sous-jacente. Les appels d'API ultérieurs effectués par toutes les applications installées renvoient la chaîne mise à zéro.

Exigences de la politique Google Play pour les états de réinitialisation et de suppression

Conformément aux Règles pour les développeurs Google Play concernant l'identifiant publicitaire, les développeurs doivent gérer les actions de confidentialité des utilisateurs conformément à des règles explicites :

  • Exigences de réinitialisation : lorsqu'un utilisateur réinitialise son identifiant publicitaire, les développeurs ne doivent pas relier ou connecter le nouvel identifiant publicitaire à un identifiant publicitaire précédent ou à des données dérivées de celui-ci sans le consentement explicite de l'utilisateur.
  • Exigences de suppression : lorsqu'un utilisateur supprime son identifiant publicitaire, les développeurs ne doivent pas connecter cet appareil aux données liées ou dérivées de son identifiant publicitaire précédent.

Nettoyage des entrées d'identifiants dans les pipelines d'ingestion en aval

Les moteurs d'attribution en arrière-plan doivent implémenter des filtres de validation pour empêcher les chaînes remises à zéro de polluer les bases de données d'attribution :

fun isGaidValid(gaid: String?): Boolean {
    if (gaid.isNullOrBlank()) return false
    val zeroedGaid = "00000000-0000-0000-0000-000000000000"
    return !gaid.equals(zeroedGaid, ignoreCase = true)
}

Si un identifiant mis à zéro est détecté, les systèmes en aval ne doivent pas le traiter comme un GAID utilisable ou une clé de correspondance d'identifiant ; tout traitement d'attribution ou d'analyse ne doit reposer que sur d'autres signaux autorisés de manière indépendante.

Politique Google Play Families et restrictions par catégorie d'application

Pratiques en matière de données dans les applications pour familles

Google Play applique des règles de protection des données strictes pour les applications participant au programme Families ou ciblant les enfants :

  • Interdiction de transmettre l'AAID : les applications ciblant exclusivement les enfants ne doivent pas transmettre l'identifiant publicitaire (AAID). Pour les applications ciblant le niveau d'API 33 ou supérieur, Google recommande d'omettre ou de désactiver l'autorisation AD_ID comme mécanisme de conformité simple.
  • Gestion des publics mixtes : les applications ciblant à la fois les enfants et un public plus âgé ne doivent pas transmettre l'AAID des enfants ou des utilisateurs dont l'âge est inconnu. Par défaut, les applications et les SDK doivent éviter de transmettre l'AAID jusqu'à ce qu'une vérification de l'âge confirme que l'utilisateur n'est pas un enfant.

Utilisation de tools:node=“remove” dans le manifeste

Si votre application cible les enfants, mais qu'un SDK tiers importé injecte automatiquement l'autorisation AD_ID via la fusion des manifestes, ajoutez l'attribut tools:node="remove" dans votre fichier AndroidManifest.xml principal :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.familyapp">

    <!-- Explicitly remove AD_ID injected by transitive dependencies -->
    <uses-permission 
        android:name="com.google.android.gms.permission.AD_ID" 
        tools:node="remove"/>

</manifest>

Alternatives de mesure spécifiques aux cas d'usage lorsque le GAID n'est pas disponible

Lorsque le GAID est mis à zéro, supprimé ou restreint par la politique, les équipes d'ingénierie déploient des alternatives spécifiques aux cas d'usage en fonction de leur objectif fonctionnel :

  • Attribution de campagne : utilisez l'API Google Play Install Referrer pour récupérer les paramètres de campagne intermédiés par le store transmis via l'URL du Play Store (referrer=...). Fonctionne indépendamment de la suppression du GAID.
  • Intégration et intention de l'utilisateur : utilisez le routage de paramètres contextuels de première partie pour restaurer les jetons de parrainage, les codes promotionnels et les destinations de liens profonds transmis à partir des pages de destination Web.
  • Analyses et prévention des fraudes gérées par le développeur : utilisez l'App Set ID (AppSetIdClient) pour générer un identifiant partagé entre les applications publiées sous le même compte de développeur, sans suivi publicitaire inter-applications.
                    GAID Unavailable or Zeroed
                                 │
         ┌───────────────────────┼───────────────────────┐
         │                       │                       │
         ▼                       ▼                       ▼
   Paid Campaign             Onboarding &          Developer-Owned
    Attribution             Referral Intent        Analytics & Fraud
         │                       │                       │
         ▼                       ▼                       ▼
    Google Play             First-Party             App Set ID
  Install Referrer          Contextual              (Developer- or
     (Store URL)             Routing                App-Scoped)

Alternatives au GAID pour l'attribution, l'intégration et l'analyse

Matrice comparative : GAID vs Install Referrer vs App Set ID

Dimension Google Advertising ID (GAID) Google Play Install Referrer App Set ID (AppSet)
Type d'identifiant UUID publicitaire inter-applications réinitialisable Chaîne de paramètres de campagne intermédiée par le store Identifiant lié au développeur ou à l'application, selon l'installation et le contexte des services Play
Autorisation du manifeste com.google.android.gms.permission.AD_ID Aucune Aucune
Impact de la suppression par l'utilisateur Renvoie une chaîne de zéros Indépendant de la suppression du GAID Peut être réinitialisé après 13 mois sans accès à l'API, lorsque la dernière application de l'ensemble est désinstallée ou après une réinitialisation d'usine
Cas d'usage principal Attribution publicitaire inter-applications et reciblage Suivi des performances des campagnes sur le Play Store Détection des fraudes et analyses gérées par le développeur
Compatibilité avec la politique Families Ne doit pas être transmis pour les enfants Non soumis à l'interdiction de transmission spécifique à l'AAID ; l'utilisation doit néanmoins respecter les politiques Families applicables Recommandé par Google pour les analyses dans les applications Families

Foire aux questions (FAQ)

Pourquoi l'appel à AdvertisingIdClient provoque-t-il un plantage avec une IllegalStateException ?
AdvertisingIdClient.getAdvertisingIdInfo(context) exécute une communication bloquante avec les services Google Play. Google interdit explicitement d'appeler cette méthode sur le thread d'exécution principal. Les développeurs doivent l'invoquer dans un thread d'arrière-plan ou une coroutine Kotlin à l'aide de `Dispatchers.IO`.
Que se passe-t-il si une application cible Android 13 et ne déclare pas l'autorisation AD_ID ?
Si une application cible le niveau d'API 33 ou supérieur et ne déclare pas l'autorisation `com.google.android.gms.permission.AD_ID` dans son manifeste fusionné, l'API des services Google Play renvoie automatiquement `00000000-0000-0000-0000-000000000000` au lieu de l'identifiant publicitaire réel.
Comment supprimer l'autorisation AD_ID injectée par des dépendances de SDK tiers ?
Si une bibliothèque tierce injecte automatiquement l'autorisation `com.google.android.gms.permission.AD_ID` via la fusion des manifestes et que votre application doit se conformer aux politiques Google Play Families, ajoutez `<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>` à votre fichier `AndroidManifest.xml` principal.

Résumé et cadre décisionnel

Le Google Advertising ID reste un identifiant réinitialisable important pour les cas d'usage publicitaires et d'analyse des utilisateurs sous Android, mais son exploitation sur Android 13+ nécessite le respect des politiques d'autorisation du manifeste, des normes d'exécution en arrière-plan et une gestion appropriée des états d'identifiants mis à zéro. Lorsque le GAID n'est pas disponible, les équipes d'ingénierie doivent choisir une primitive de mesure en fonction du cas d'usage spécifique : par exemple, Install Referrer pour l'attribution de campagnes sur le Play Store, des paramètres contextuels de première partie pour l'état d'intégration ou l'App Set ID pour les scénarios d'analyse et de prévention des fraudes appartenant au développeur.

Pour explorer les modèles d'implémentation pour l'attribution Android et les pipelines de liens profonds, consultez la documentation OpoInstall.

Documents associés

  • Concepts : Cycle de vie de l'identifiant publicitaire, autorisation de manifeste AD_ID, extraction dans un thread d'arrière-plan, gestion des identifiants mis à zéro

  • Technologies : Services Google Play, API AdvertisingIdClient, API Google Play Install Referrer, SDK Android OpoInstall

  • Normes : Règles pour les développeurs Google Play, modifications de comportement d'Android 13, norme UUID IETF RFC 4122

  • API et classes : AdvertisingIdClient, AdvertisingIdClient.Info, AppSetIdClient, API de contexte OpoInstall

Documentation officielle

Share this article