Изменения рекламного идентификатора: как получить Google GAID в Android 13+?

opoinstall
2026-08-24
5 min read

Что такое GAID и как получить его программным путем? Google Advertising ID (GAID) — это сбрасываемый пользователем программный идентификатор, предоставляемый службами Google Play для измерения эффективности продвижения. Он извлекается программно вне основного потока с помощью API AdvertisingIdClient после предварительной проверки на наличие разрешения AD_ID в объединенном манифесте приложения, когда это требуется.

Google Advertising ID (GAID), также известный как Android Advertising ID (AAID), представляет собой сбрасываемую пользователем уникальную строку, предоставляемую службами Google Play для атрибуции продвижения, персонализированного таргетинга и аналитики на устройствах Android. Приложения, ориентированные на Android 13 (уровень API 33) или выше, должны гарантировать, что объединенный манифест содержит разрешение com.google.android.gms.permission.AD_ID при доступе к идентификатору рекламы Google Play services; в противном случае API возвращает значение, состоящее из одних нулей.

Термин Определение
GAID Рекламный идентификатор Google, предоставляемый службами Google Play для измерения эффективности.
AdvertisingIdClient API служб Google Play, используемый для запроса метаданных рекламного идентификатора.
Разрешение AD_ID Разрешение манифеста Android, требуемое для приложений, ориентированных на уровень API 33+, при доступе к рекламному идентификатору служб Google Play.
Обнуленный идентификатор Контрольное значение из нулей (00000000-0000-0000-0000-000000000000), возвращаемое, когда рекламный идентификатор недоступен или скрыт.

Что такое GAID и как работает рекламный идентификатор Google

Техническая анатомия рекламного идентификатора

Google Advertising ID (GAID) возвращается службами Google Play в виде непрозрачной строки-идентификатора, которая обычно форматируется как 128-битный шестнадцатеричный UUID в нижнем регистре (например, 38400000-8cf0-11bd-b23e-10b96e4ef00d). Приложения должны относиться к возвращаемой строке как к непрозрачному идентификатору, а не выводить бизнес-логику из ее форматирования.

В отличие от идентификаторов на уровне оборудования, GAID разработан с использованием явных средств контроля конфиденциальности:

  • Сбрасывается пользователем: пользователи могут в любой момент сгенерировать новый случайный идентификатор через настройки устройства.
  • Удаляется пользователем: начиная с Android 12, пользователи могут удалить свой рекламный идентификатор, дав указание службам Google Play скрывать рекламные идентификаторы от всех приложений.
  • Область действия для профиля устройства: рекламные идентификаторы обычно доступны в разных приложениях для одного профиля пользователя устройства, но разные профили пользователей или гостевые профили Android на одном физическом устройстве получают уникальные рекламные идентификаторы.

Роль служб Google Play в управлении состоянием идентификатора

GAID не является частью базового ядра открытой платформы Android. Это сервис уровня приложения, управляемый и обслуживаемый динамически проприетарной клиентской библиотекой служб Google Play (com.google.android.gms:play-services-ads-identifier).

Когда приложение вызывает службы Google Play, клиент выполняет блокирующую связь со службами Google Play для получения текущего рекламного идентификатора и пользовательских настроек ограничения ограничений отслеживания.

Почему GAID пришел на смену аппаратным идентификаторам

В ранних версиях Android рекламные сети и разработчики отслеживали события конверсии с помощью аппаратных идентификаторов, которые нельзя было сбросить:

  • Международный идентификатор мобильного оборудования (IMEI): привязан к сотовому оборудованию устройства.
  • MAC-адрес (Media Access Control): привязан к аппаратному обеспечению сетевого интерфейса.
  • ANDROID_ID (SSAID): в современных версиях Android 8.0+ этот идентификатор привязывается к комбинации ключа подписи приложения, пользователя и устройства, а не работает в качестве универсального ключа отслеживания между приложениями.
Для сценариев использования рекламы в Google Play разработчики должны использовать рекламный идентификатор, когда он доступен, вместо подстановки другого постоянного идентификатора устройства.

См. также: GAID ──> Архитектура мобильной атрибуции

Требования к разрешениям в Android 13: объявление манифеста AD_ID

Модель обеспечения соблюдения уровня API 33

Начиная с Android 13 (уровень API 33), компания Google внедрила разрешение com.google.android.gms.permission.AD_ID:

  • Целевой SDK 33 и выше: приложения, ориентированные на Android 13 или более поздние версии, должны объявить разрешение AD_ID в своем манифесте. Если разрешение пропущено, службы Google Play возвращают строку из нулей (00000000-0000-0000-0000-000000000000).
  • Целевой SDK 32 и ниже: разрешение AD_ID в манифесте не требуется. Тем не менее, рекламный идентификатор все равно может быть недоступен или обнулен из-за настроек конфиденциальности рекламного идентификатора пользователя, включая состояние ограничения отслеживания или удаления.
  • Декларации политики Play Store: при отправке обновления, ориентированного на уровень API 33+, разработчики должны заполнить текущую декларацию рекламного идентификатора в Google Play Console, точно сообщив, использует ли приложение идентификатор и каким образом.

Процесс получения GAID в Android 13 и обработки нулевого идентификатора

Настройка AndroidManifest.xml и зависимостей Gradle

Чтобы объявить разрешение, включите тег <uses-permission> внутрь AndroidManifest.xml. В файл build.gradle модуля вашего приложения добавьте официальную зависимость play-services-ads-identifier.

Приведенная ниже конфигурация демонстрирует синтаксис разрешения в манифесте и настройку зависимостей Gradle:

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

    <!-- Требуется для API 33+ для доступа к ненулевому 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>
</manifest>
// Расположение: app/build.gradle
// Примечание: показаны примеры версий зависимостей; перед использованием в продакшене проверьте актуальные стабильные релизы в официальных репозиториях.

dependencies {
    // Официальная библиотека Google Play services Ads Identifier
    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'

    // Сопрограммы Kotlin для асинхронного выполнения вне основного потока
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}

Понимание слияния манифестов: транзитивная инъекция SDK

При сборке APK Android или Android App Bundle (AAB) система сборки Gradle объединяет манифесты из всех импортированных сторонних библиотек в единый финальный AndroidManifest.xml.

Если импортированный SDK рекламной сети, инструмент аналитики или библиотека атрибуции объявляют com.google.android.gms.permission.AD_ID в своем внутреннем манифесте, это разрешение автоматически объединяется в вашу финальную сборку. Разработчики могут проверить файл app/build/outputs/logs/manifest-merger-release-report.txt, чтобы провести аудит того, какая именно зависимость добавила это разрешение.

Программное получение: извлечение GAID через AdvertisingIdClient в Kotlin

Обязательное правило выполнения вне основного потока

Вызов AdvertisingIdClient.getAdvertisingIdInfo(context) инициирует синхронный вызов служб Google Play. Google категорически запрещает выполнять этот метод в основном потоке (потоке пользовательского интерфейса).

Вызов getAdvertisingIdInfo() в главном потоке вызывает немедленное исключение IllegalStateException:

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

Чтобы предотвратить ошибки ANR (приложение не отвечает) и аварийное завершение во время выполнения, разработчики должны отправлять вызов извлечения в фоновый рабочий поток или сопрограмму Kotlin с использованием Dispatchers.IO.

Получение GAID через AdvertisingIdClient вне основного потока

Реализация фоновых задач с помощью сопрограмм Kotlin

Приведенная ниже реализация на Kotlin демонстрирует потокобезопасный класс AdvertisingIdManager, который выполняет извлечение вне основного потока, обрабатывает исключения доступности служб Google Play и проверяет целостность идентификатора:

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"

    /**
     * Программное получение рекламного идентификатора Google вне основного потока выполнения.
     * Автоматически обрабатывает исключения, обнуленные состояния и отказ пользователей.
     */
    suspend fun fetchGaid(context: Context): GaidResult = withContext(Dispatchers.IO) {
        try {
            // Вызывает блокирующий IPC служб Google Play в диспетчере сопрограмм IO
            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, "Рекламный идентификатор недоступен или обнулен.")
                GaidResult(
                    gaid = null,
                    isLimitAdTrackingEnabled = isLAT,
                    isZeroed = true,
                    isAvailable = false
                )
            } else {
                Log.d(TAG, "Рекламный идентификатор успешно получен. LAT включен: $isLAT")
                GaidResult(
                    gaid = rawId,
                    isLimitAdTrackingEnabled = isLAT,
                    isZeroed = false,
                    isAvailable = true
                )
            }
        } catch (e: GooglePlayServicesNotAvailableException) {
            Log.e(TAG, "Службы Google Play не установлены или недоступны на этом устройстве.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: GooglePlayServicesRepairableException) {
            Log.w(TAG, "Службы Google Play требуют обновления или восстановления пользователем.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: IOException) {
            Log.e(TAG, "Ошибка связи при подключении к службам Google Play.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: IllegalStateException) {
            Log.e(TAG, "Недопустимое состояние при получении рекламного идентификатора.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        } catch (e: Exception) {
            Log.e(TAG, "Непредвиденная ошибка при получении рекламного идентификатора Google.", e)
            GaidResult(gaid = null, isLimitAdTrackingEnabled = true, isZeroed = false, isAvailable = false)
        }
    }
}

Разбор AdvertisingIdClient.Info и обработка ограничения отслеживания

Метод AdvertisingIdClient.getAdvertisingIdInfo() возвращает объект AdvertisingIdClient.Info, содержащий два ключевых свойства:

  • getId() (String): буквенно-цифровая строка, представляющая рекламный идентификатор.
  • isLimitAdTrackingEnabled() (Boolean): когда включено ограничение отслеживания, политика Google Play запрещает использовать данные рекламного идентификатора для создания профилей или таргетинга персонализированной рекламы. Политика по-прежнему разрешает такие действия, как контекстная реклама, ограничение частоты показов, отслеживание конверсий, отчетность и обеспечение безопасности/обнаружение мошенничества; однако в текущих службах Google Play сам рекламный идентификатор обнуляется при включении этой настройки, поэтому приложения не должны рассчитывать на доступность пригодного к использованию GAID.

Обработка обнуленных идентификаторов и состояний удаления по инициативе пользователя

Строка 00000000-0000-0000-0000-000000000000: когда и почему она появляется

В производственных средах AdvertisingIdClient.Info.getId() возвращает 00000000-0000-0000-0000-000000000000, если:

  1. Пользователь удалил рекламный идентификатор: пользователь перешел в настройки устройства и удалил свой рекламный идентификатор.
  2. Включено ограничение отслеживания: пользователь включил ограничение отслеживания на поддерживаемых версиях ОС.
  3. Отсутствует разрешение в манифесте: приложение ориентировано на Android 13+ (уровень API 33+) и не объявляет com.google.android.gms.permission.AD_ID в своем объединенном манифесте.

Обработка нулевого идентификатора GAID и состояний конфиденциальности

Рабочий процесс пользовательских настроек: удаление рекламного идентификатора

Пользователи в текущих версиях Android могут удалить свой идентификатор, перейдя по адресу:

Настройки > Конфиденциальность > Реклама > Удалить рекламный идентификатор (точные названия могут различаться в зависимости от производителя OEM-устройства).

При удалении службы Google Play стирают базовое значение. Последующие вызовы API во всех установленных приложениях возвращают нулевую строку.

Требования политики Google Play для состояний сброса и удаления

В соответствии с правилами для разработчиков Google Play в отношении рекламного идентификатора разработчики должны обрабатывать действия с конфиденциальностью пользователей в соответствии с четкими правилами:

  • Требования к сбросу: когда пользователь сбрасывает свой рекламный идентификатор, разработчики не должны связывать или объединять новый рекламный идентификатор с предыдущим рекламным идентификатором или данными, полученными из него, без явного согласия пользователя.
  • Требования к удалению: когда пользователь удаляет свой рекламный идентификатор, разработчики не должны подключать это устройство к данным, связанным с его предыдущим рекламным идентификатором или полученным из него.

Очистка входящих идентификаторов в конвейерах аналитики

Серверные движки атрибуции должны реализовывать фильтры валидации, чтобы предотвратить засорение баз данных атрибуции нулевыми строками:

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

Если обнаружен обнуленный идентификатор, нисходящие системы не должны рассматривать его как пригодный к использованию GAID или ключ сопоставления идентификаторов; любая обработка атрибуции или аналитики должна основываться только на других разрешенных сигналах.

Политика Google Play в отношении семей и ограничения категорий приложений

Обработка данных в приложениях для всей семьи

Google Play применяет строгие правила защиты данных для приложений, участвующих в программе Families или ориентированных на детей:

  • Запрет на передачу AAID: приложения, предназначенные исключительно для детей, не должны передавать рекламный идентификатор (AAID). Для приложений, ориентированных на уровень API 33 или выше, Google рекомендует опустить или отключить разрешение AD_ID в качестве простого механизма соблюдения требований.
  • Обработка смешанной аудитории: приложения, ориентированные как на детей, так и на более старшую аудиторию, не должны передавать AAID детей или пользователей неизвестного возраста. По умолчанию приложения и SDK должны избегать передачи AAID до тех пор, пока проверка возраста не подтвердит, что пользователь не является ребенком.

Использование инструментов:node=“remove” в манифесте

Если ваше приложение ориентировано на детей, но импортированный сторонний SDK автоматически внедряет разрешение AD_ID посредством слияния манифестов, добавьте атрибут tools:node="remove" в ваш основной файл AndroidManifest.xml:

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

    <!-- Явное удаление AD_ID, внедренного транзитивными зависимостями -->
    <uses-permission 
        android:name="com.google.android.gms.permission.AD_ID" 
        tools:node="remove"/>

</manifest>

Альтернативные варианты измерения для конкретных сценариев, когда GAID недоступен

Когда GAID обнулен, удален или ограничен политикой, инженерные команды развертывают специализированные альтернативы в зависимости от своей функциональной цели:

  • Атрибуция кампаний: используйте API Google Play Install Referrer для получения параметров кампании, передаваемых через URL-адрес Play Store (referrer=...). Работает независимо от удаления GAID.
  • Онбординг и намерения пользователей: используйте маршрутизацию параметров первого уровня для восстановления реферальных токенов, промокодов и целевых страниц глубоких ссылок (deep links), передаваемых с веб-страниц.
  • Аналитика и защита от мошенничества: используйте App Set ID (AppSetIdClient) для генерации общего идентификатора для приложений, опубликованных под одной учетной записью разработчика, без отслеживания рекламы между приложениями.
                    GAID недоступен или обнулен
                                 │
         ┌───────────────────────┼───────────────────────┐
         │                       │                       │
         ▼                       ▼                       ▼
     Платная кампания        Онбординг и         Аналитика и борьба
        Атрибуция          Реферальный трафик     с мошенничеством
         │                       │                       │
         ▼                       ▼                       ▼
    Google Play             Контекстная             App Set ID
  Install Referrer          Маршрутизация         (на уровне разработчика
    (URL магазина)          (Первая сторона)         или приложения)

Альтернативы GAID для атрибуции, онбординга и аналитики

Сравнительная матрица: GAID против Install Referrer и App Set ID

Параметр Google Advertising ID (GAID) Google Play Install Referrer App Set ID (AppSet)
Тип идентификатора Сбрасываемый рекламный UUID между приложениями Строка параметров кампании магазина Идентификатор на уровне разработчика или приложения в зависимости от установки и служб Play
Разрешение манифеста com.google.android.gms.permission.AD_ID Отсутствует Отсутствует
Влияние удаления пользователем Возвращает строку из нулей Не зависит от удаления GAID Может сброситься через 13 месяцев без доступа к API, при удалении последнего приложения в наборе или после сброса настроек
Основной сценарий использования Атрибуция и ретаргетинг рекламы между приложениями Отслеживание эффективности кампаний в Play Store Обнаружение мошенничества и аналитика разработчика
Соответствие политике для семей Не должен передаваться для детских приложений Не подпадает под запрет передачи AAID; использование должно соответствовать правилам Families Рекомендуется Google для аналитики в детских приложениях

Часто задаваемые вопросы (FAQ)

Почему вызов AdvertisingIdClient приводит к сбою IllegalStateException?
AdvertisingIdClient.getAdvertisingIdInfo(context) выполняет блокирующую связь со службами Google Play. Google прямо запрещает вызывать этот метод в основном потоке выполнения. Разработчики должны вызывать его в фоновом потоке или сопрограмме Kotlin с помощью `Dispatchers.IO`.
Что произойдет, если приложение ориентировано на Android 13 и не объявляет разрешение AD_ID?
Если приложение ориентировано на уровень API 33 или выше и не объявляет разрешение `com.google.android.gms.permission.AD_ID` в своем объединенном манифесте, API служб Google Play автоматически возвращает `00000000-0000-0000-0000-000000000000` вместо реального рекламного идентификатора.
Как удалить разрешение AD_ID, внедренное зависимостями сторонних SDK?
Если сторонняя библиотека автоматически внедряет разрешение `AD_ID` посредством слияния манифестов, а вашему приложению необходимо соответствовать политикам Google Play Families, добавьте `<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>` в основной файл `AndroidManifest.xml`.

Заключение и фреймворк принятия решений

Рекламный идентификатор Google остается важным сбрасываемым идентификатором для рекламы на Android и аналитики пользователей, но работа в Android 13+ требует соблюдения политик разрешений манифеста, стандартов фонового выполнения и корректной обработки обнуленных состояний идентификатора. Когда GAID недоступен, инженерным командам следует выбирать инструмент измерения на основе конкретного варианта использования — например, Install Referrer для атрибуции кампаний в Play Store, контекстные параметры на стороне клиента для состояния онбординга или App Set ID для аналитики и сценариев предотвращения мошенничества.

Чтобы изучить шаблоны реализации для атрибуции Android и пайплайнов глубоких ссылок (deep links), ознакомьтесь с документацией OpoInstall.

Связанные материалы

  • Концепции: жизненный цикл рекламного идентификатора, разрешение манифеста AD_ID, извлечение в фоновом потоке, обработка обнуленного идентификатора

  • Технологии: службы Google Play, API AdvertisingIdClient, API Google Play Install Referrer, SDK OpoInstall Android

  • Стандарты: политика разработчиков Google Play, изменения поведения в Android 13, стандарт UUID IETF RFC 4122

  • API и классы: AdvertisingIdClient, AdvertisingIdClient.Info, AppSetIdClient, контекстный API OpoInstall

Официальная документация

Share this article

Keep Discovering

Microsoft выпускает MAI-Transcribe-2 для 60 языков: что получат разработчики

Microsoft выпускает MAI-Transcribe-2 для 60 языков: что получат разработчики

Microsoft выпускает MAI-Transcribe-2 с уровнем ошибок распознавания (WER) 5,2% для 60 языков по цене десять центов за час. Узнайте о результатах тестирования, стоимости и интеграции API.

Tesla запустила Cybercab в Остине? Как работают поездки на роботакси

Tesla запустила Cybercab в Остине? Как работают поездки на роботакси

Tesla начала эксплуатацию Cybercab в Остине. Узнайте, как беспилотное роботакси без рулевого управления обрабатывает запросы на поездки через смартфон, предоставляет доступ к автомобилю и обеспечивает взаимодействие с пользователем внутри салона.

Как реферальные петли повышают удержание пользователей и способствуют долгосрочной лояльности

Как реферальные петли повышают удержание пользователей и способствуют долгосрочной лояльности

Узнайте, как реферальные петли улучшают удержание мобильных пользователей, позволяют моделировать виральный К-фактор с учетом затухания когорт и устраняют барьеры при вводе реферальных кодов в «нулевой день» (Day 0) благодаря передаче параметров.