Получить Android ID программно можно одной строкой кода через Settings.Secure.getString() — это 64-битный шестнадцатеричный идентификатор, который система генерирует при первой загрузке устройства. Разработчики сталкиваются с этой задачей, когда нужно привязать лицензию, настройки или статистику к конкретному аппарату без запроса опасных разрешений.
Однако у ANDROID_ID есть нюансы: начиная с Android 8.0 (API 26) значение стало разным для каждого приложения и каждого пользователя, а на некоторых прошивках идентификатор может меняться после сброса настроек или обновления системы. Разберём все способы получения, ограничения и правила Google Play, чтобы вы не нарушили политику приватности и не получили неожиданные значения в продакшене.
Что такое Android ID и чем он отличается от других идентификаторов
Android ID (он же SSAID — Settings Secure Android ID) — это уникальная строка из 16 шестнадцатеричных символов, которую Android создаёт при первой настройке устройства. Важно понимать: это не аппаратный идентификатор вроде IMEI или серийного номера, а программное значение, хранящееся в системной базе настроек.
До Android 8.0 идентификатор был единым для всего устройства: любое приложение получало одно и то же значение. С Android 8.0 поведение изменилось — теперь ANDROID_ID формируется на основе комбинации ключа подписи приложения, пользователя устройства и самого устройства. Это значит, что два разных приложения на одном смартфоне увидят разные идентификаторы.
Для сравнения основных идентификаторов устройства удобно использовать таблицу:
| Идентификатор | Тип | Требуемое разрешение | Сбрасывается |
|---|---|---|---|
| ANDROID_ID (SSAID) | Программный | Не требуется | При сбросе настроек, иногда при OTA |
| IMEI | Аппаратный | READ_PRIVILEGED_PHONE_STATE (недоступно обычным приложениям) | Нет |
| Advertising ID | Рекламный | ADS-сервисы Google Play | Пользователем в любой момент |
| Серийный номер | Аппаратный | Ограничено с Android 10 | Нет |
| Instance ID / FCM token | Облачный | Не требуется | При переустановке приложения |
Как получить Android ID в коде приложения
Стандартный способ — вызов Settings.Secure.getString() с передачей контекста и константы Settings.Secure.ANDROID_ID. Разрешение в манифесте для этого не нужно.
Пример на Kotlin:
val androidId = Settings.Secure.getString(
contentResolver,
Settings.Secure.ANDROID_ID
)
Аналогичный код на Java:
String androidId = Settings.Secure.getString(
getContentResolver(),
Settings.Secure.ANDROID_ID
);
Результат — строка вида 9774d56d682e549c. Вам нужно учитывать, что значение может вернуться null на некоторых кастомных прошивках или эмуляторах, поэтому обязательна проверка на пустое значение перед использованием идентификатора в логике приложения.
⚠️ Внимание: на некоторых устройствах с кастомными прошивками и старых эмуляторах ANDROID_ID может возвращать одинаковое «зашитое» значение у многих устройств либо меняться после обновления OTA. Не используйте его как единственный ключ для критичной логики вроде привязки платных лицензий.
Получение Android ID через ADB без написания кода
Если идентификатор нужен для отладки или тестирования, а не внутри приложения, проще всего получить его через ADB. Потребуется включённая отладка по USB на устройстве и установленные platform-tools на компьютере.
Выполните в терминале команду:
adb shell settings get secure android_id
Учтите важный нюанс: эта команда выводит значение для профиля пользователя, но привязка к приложению работает иначе — через ADB вы увидите идентификатор, который может не совпадать с тем, что получит конкретное приложение на Android 8.0 и выше. Для проверки значения конкретного приложения надёжнее вывести его в лог из самого приложения.
Ограничения и подводные камни на разных версиях Android
Поведение ANDROID_ID заметно менялось между версиями системы, и это частая причина багов. Перечислим ключевые моменты:
- 📱 Android 7.1 и ниже — идентификатор единый для устройства, одинаков для всех приложений.
- 📱 Android 8.0+ — значение уникально для пары «приложение + пользователь», сохраняется при переустановке приложения, если ключ подписи тот же.
- 📱 Сброс до заводских настроек — ANDROID_ID генерируется заново во всех версиях.
- 📱 Многопользовательский режим — у каждого профиля пользователя свой набор идентификаторов.
- 📱 Эмуляторы и кастомные ROM — возможны дублирующиеся или нестабильные значения.
Ещё одна тонкость: если приложение подписано разными ключами в debug- и release-сборках, ANDROID_ID для них будет различаться на Android 8.0+. Это регулярно становится причиной ситуации, когда «на отладке всё работает, а в релизе привязка слетает».
Политика Google Play и приватность
Google прямо рекомендует избегать аппаратных идентификаторов и по возможности использовать решения, которые пользователь может сбросить. ANDROID_ID допустим для не рекламных задач — аналитики, защиты от фрода, привязки настроек. Для рекламного трекинга и монетизации политика требует использовать Advertising ID, который пользователь вправе обнулить или отключить.
Необходимо также указать сбор идентификаторов в разделе Data Safety консоли Google Play, если вы передаёте ANDROID_ID на свой сервер. Сокрытие этого факта — распространённая причина отклонения или удаления приложений из магазина.
Когда ANDROID_ID нельзя использовать
Для рекламной атрибуции и персонализации рекламы — только Advertising ID. Для сквозного трекинга пользователя между приложениями разных разработчиков — это нарушает политику. Для замены системы аккаунтов — идентификатор не переживает сброс устройства и не переносится на новый аппарат.
Альтернативы: когда Android ID не подходит
Если требования к стабильности или сбрасываемости выше возможностей ANDROID_ID, рассмотрите альтернативные подходы. Выбор зависит от задачи:
- 🔑 Собственный UUID — сгенерируйте случайный идентификатор при первом запуске и сохраните его; сбрасывается при переустановке, что честно с точки зрения приватности.
- ☁️ Firebase Installation ID — облачный идентификатор установки от Google, удобен для аналитики и push-инфраструктуры.
- 📢 Advertising ID — обязателен для рекламных сценариев, пользователь может его сбросить.
- 🔐 Аккаунт пользователя — единственный надёжный способ идентификации между несколькими устройствами.
Комбинированный подход тоже рабочий: например, использовать ANDROID_ID как один из факторов в антифрод-системе, но не как единственный ключ. Так смена идентификатора после сброса устройства не сломает всю логику.
☑️ Проверка перед использованием ANDROID_ID в продакшене
⚠️ Внимание: не пытайтесь получать IMEI или серийный номер как «более надёжную» замену ANDROID_ID — начиная с Android 10 обычные приложения получают при таком запросе исключение SecurityException, а попытки обхода ограничений приведут к отклонению приложения в Google Play.
Типичные ошибки при работе с Android ID
Первая ошибка — ожидание, что идентификатор одинаков в debug- и release-сборках. Как уже отмечалось, на Android 8.0+ значение зависит от ключа подписи, поэтому тестируйте привязку на сборке, подписанной релизным ключом.
Вторая — использование ANDROID_ID как ключа шифрования пользовательских данных. После сброса устройства или смены ключа подписи идентификатор изменится, и данные станут недоступны. Для шифрования применяйте Android Keystore, а не производные от идентификатора устройства.
Третья типичная проблема — отсутствие обработки null. На части кастомных прошивок и старых эмуляторов вызов может вернуть пустое значение, и без проверки приложение упадёт с NullPointerException или запишет «пустой» идентификатор в базу.
FAQ: частые вопросы про Android ID
Меняется ли Android ID после обновления системы?
Обычно нет — при штатном OTA-обновлении значение сохраняется. Однако на отдельных кастомных прошивках и при крупных обновлениях известны случаи смены идентификатора, поэтому гарантировать постоянство нельзя. Сброс до заводских настроек меняет ANDROID_ID гарантированно.
Нужны ли разрешения для получения Android ID?
Нет. Вызов Settings.Secure.getString() с константой ANDROID_ID не требует ни обычных, ни опасных разрешений в манифесте — это одно из главных преимуществ идентификатора.
Почему разные приложения показывают разный Android ID на одном устройстве?
Это нормальное поведение начиная с Android 8.0 (API 26): идентификатор формируется с учётом ключа подписи приложения и профиля пользователя, поэтому у каждого приложения своё значение. На Android 7.1 и ниже идентификатор был общим для всего устройства.
Можно ли использовать Android ID для рекламы?
Нет. Политика Google Play требует использовать для рекламных целей только Advertising ID, который пользователь может сбросить или отключить. Применение ANDROID_ID в рекламном трекинге — основание для отклонения или удаления приложения.
Что вернёт код на эмуляторе?
Эмулятор возвращает корректное значение ANDROID_ID, но оно может дублироваться между разными виртуальными устройствами, созданными из одного образа. Не используйте эмулятор для проверки уникальности идентификатора — только реальные устройства.