Appy
← Назад в блог
Устранение неполадок

Android App Links не проходят проверку: диагностика за пять минут с adb

С Android 12 App Link, не прошедший проверку домена, открывается в браузере вместо приложения — молча и не на всех устройствах. Вот adb-чеклист, который быстро находит причину, включая несовпадение ключа подписи Play, стоящее за большинством таких инцидентов.

14 августа 2026•10 минут

Приложение установлено. Ссылка всё равно открывает Chrome.

Обычно это всплывает как тикет в поддержку, а не как ошибка. Человек нажимает ссылку на ваш домен, приложение стоит на телефоне, а открывается Chrome. С Android 12, согласно документации Android, https-ссылка открывает приложение только если система проверила домен при установке — и когда проверка проваливается, она проваливается молча. Ни креша, ни уведомления, ничего в ваших дашбордах.

Два свойства делают отладку мучительной. Проверка идёт по доменам: example.com может быть верифицирован, пока promo.example.com — нет. И по устройствам: одна и та же сборка проходит на Pixel и падает на Samsung — сочетание, о котором регулярно сообщают в ветках форумов разработчиков Samsung. Если вы читаете это посреди инцидента — переходите сразу к диагностике.

Два домена, два вердикта

adb · Android 16
$ adb shell pm get-app-links com.example.app
com.example.app:
Domain verification state:
example.com: verified
promo.example.com: none
Открывает приложениеОткрывает браузер
Вывод, который никто не читает, пока что-то не сломается: example.com прошёл проверку при установке, promo.example.com — никогда. Каждый вердикт вынесен на устройстве, молча.

Что на самом деле происходит при установке

При установке или обновлении Android читает каждый домен, объявленный с autoVerify, и скачивает https://вашдомен/.well-known/assetlinks.json для каждого. Согласно документации Android, файл должен вернуться прямым 200 по HTTPS с content type application/json — верификатор не следует редиректам. Результат кэшируется по доменам; поэтому один поддомен может быть верифицирован, а соседний — нет.

Внутри файла sha256_cert_fingerprints должен совпадать с сертификатом, подписавшим APK на устройстве. Ловушка номер один: при Play App Signing это ключ подписи Google — не ваш upload-ключ. Отпечаток из локального keystore отлично верифицирует сборки, установленные вручную, и проваливает каждую установку из Play Store.

Ещё одно свойство: вердикт кэшируется. Исправление JSON на сервере ничего не меняет на уже провалившихся телефонах, пока проверка не запустится снова — что, к счастью, можно форсировать.

Приложение установлено или обновлено

Android читает каждый домен, объявленный с autoVerify

Скачивает assetlinks.json для каждого домена

/.well-known/assetlinks.json

  1. 01

    Прямой 200 по HTTPS

    HTTP 200

    Сбой: редирект 301 или 302, 404, стена авторизации или проверка на бота

  2. 02

    Отдаётся как JSON

    content-type: application/json

    Сбой: text/html или text/plain, даже при корректном теле

  3. 03

    Имя пакета в списке

    com.example.app

    Сбой: flavor или пакет, которого нет в массиве

  4. 04

    Отпечаток совпадает с установленным приложением

    sha256_cert_fingerprints

    Сбой: только upload-ключ без ключа подписи Play

verified: ссылка открывает приложение

Хранится для каждого домена на этом устройстве

none: ссылка открывает браузер

Молча: ни креша, ни следа в ваших дашбордах

Вердикт кэшируется. Исправленный файл ничего не меняет на уже провалившихся телефонах, пока проверка не запустится снова, поэтому форсируйте повторную проверку.

Что Android проверяет при установке для каждого домена с autoVerify. Достаточно одной проваленной проверки, чтобы этот домен уходил в браузер.

Диагностика за пять минут

Подключите любое устройство с Android 12+ и установленным приложением и выполните команды по порядку. Большинство инцидентов решается на третьем шаге.

01

Прочитайте состояние проверки

adb shell pm get-app-links com.example.app

Команда печатает каждый объявленный домен с его состоянием. verified — рукопожатие прошло; none — верификатор так и не одобрил домен, именно он отправляет пользователей в Chrome. На многопользовательских устройствах проверьте и секцию по пользователям внизу вывода.

02

Скачайте assetlinks.json так, как это делает верификатор

curl -sI https://example.com/.well-known/assetlinks.json

Нужен прямой 200. Любой 301 или 302 проваливает проверку: согласно документации Android верификатор не следует редиректам. Убедитесь, что content-type — application/json, затем скачайте тело и прочитайте имя пакета и отпечатки своими глазами. Защита от ботов или авторизация перед /.well-known/ тоже считается провалом.

03

Сверьте отпечаток с ключом подписи Play

Play Console → App integrity → App signing key certificate

Откройте эту страницу Play Console и положите SHA-256 рядом с вашим JSON. Они должны совпадать байт в байт. Если в файле отпечаток upload-ключа — вы нашли баг: добавьте отпечаток ключа подписи Play, а если распространяете сборки и вне Play Store, держите оба.

04

Форсируйте повторную проверку

adb shell pm verify-app-links --re-verify com.example.app

Починив серверную сторону, попросите устройство попробовать снова. Верификатор работает асинхронно: подождите несколько секунд, повторите первый шаг и смотрите, как none меняется на verified. На некоторых устройствах Samsung состояние не сдвигается до перезагрузки — паттерн, о котором сообщают на форумах разработчиков Samsung.

05

Запустите интент как настоящее нажатие

adb shell am start -a android.intent.action.VIEW -d "https://example.com/promo"

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

Если не хочется вычитывать JSON глазами посреди инцидента, наш инструмент проверки ссылок скачает ваш assetlinks.json и за один проход проверит код ответа, content type и формат отпечатков.

Обычные подозреваемые

Пять причин покрывают почти все известные случаи. Слева причина, справа решение.

Сборка, установленная вручную

Подписана вашим upload-ключом

Upload-ключ

assetlinks.json

Отпечаток, указанный в файле

Upload-ключ

Совпадение: verified

Сборка из Google Play

Подписана ключом подписи приложений Google

Ключ подписи Play

assetlinks.json

Отпечаток, указанный в файле

Upload-ключ

Нет совпадения: none

Ключ подписи PlayUpload-ключ

Решение: добавьте SHA-256 со страницы Play Console → App integrity → App signing key certificate. Если распространяете и сборки, подписанные upload-ключом, держите оба отпечатка.

Почему на вашем телефоне работает, а у пользователей нет: в файле отпечаток upload-ключа, а каждая установка из Play Store подписана ключом Google.
Причина

В JSON отпечаток upload-ключа, а не ключа подписи Play

Скопируйте SHA-256 со страницы Play Console → App integrity → App signing key certificate. Если распространяете сборки, подписанные upload-ключом, держите оба отпечатка.

assetlinks.json отвечает редиректом или 404

Отдавайте файл напрямую по /.well-known/assetlinks.json на каждом объявленном хосте. Для верификатора www и «голый» домен — два разных домена.

Неверный content type, например text/html или text/plain

Настройте сервер или CDN отдавать application/json по этому пути. Корректный JSON с неправильным заголовком всё равно проваливается.

Несколько flavor или имён пакетов, одного нет в файле

Файл — это массив: по одному заявлению на имя пакета, каждое со своими отпечатками. Пропущенный flavor падает только сам, что в QA выглядит бессистемно.

Samsung остаётся в none после исправления JSON

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

Что изменили Android 15 и 16

Два недавних релиза сдвинули планку в одном направлении: поддерживаемый путь — верифицированные https App Links, всё остальное сужается.

Android 15

Добавил Dynamic App Links, согласно примечаниям к релизу: привязки доменов можно обновлять без выпуска нового APK, что сокращает цикл между исправлением JSON и его подхватом устройствами.

Android 16

Ужесточил проверку кастомных URI-схем, согласно примечаниям к релизу. Если часть вашего потока всё ещё держится на схемах myapp://, считайте их наследием и переносите входные точки на верифицированные https-ссылки.

Где честно уместна smart-ссылка

Smart-ссылка маршрутизирует на сервере, до того как вся эта механика включится: когда кто-то открывает ссылку Appy, редирект читает устройство и отправляет посетителей Android, iOS и десктопа в разные назначения. Эта маршрутизация работает на всех тарифах и не зависит от проверки на устройстве, потому что происходит до того, как ОС увидит ваш домен.

Честно о том, чего она не делает: smart-ссылка не может обойти проверку App Links. Редирект заканчивается на вашем https-домене, и тот же статус verified-или-none решает, откроется приложение или браузер. Что она даёт посреди инцидента — управляемую входную дверь: направьте Android-трафик на страницу Play Store или веб, пока чините assetlinks.json, а потом верните назначение обратно, не трогая ничего напечатанного — динамические QR-коды остаются редактируемыми после печати. Аналитика покажет, сколько Android-трафика прошло через сломанный путь.

Проверку чините в любом случае. Deeplink-назначения на Pro и отложенный deeplink на Enterprise полезны, но они опираются на работающий assetlinks.json, а не заменяют его.

Кто-то нажимает на вашу ссылку

appy.to/promo

На сервере

Редирект читает устройство

Android, iOS и десктоп уходят в разные назначения, на любом тарифе

iOS и десктоп: свои назначения

На телефоне

Android попадает на ваш https-домен

Теперь ОС видит ваш домен

На телефоне

Android применяет свой статус проверки

verified: приложениеnone: браузер

Пока вы чините assetlinks.json

AndroidСтраница Play StoreВаш сайт

Направьте Android-трафик на страницу Play Store или на ваш сайт, а потом верните как было. Напечатанные QR-коды остаются в силе.

Smart-ссылка выбирает, куда пойдёт каждое устройство, ещё до того, как вмешается ОС. Обойти проверку она не может: на вашем домене между приложением и браузером по-прежнему выбирает статус verified или none.

Частые вопросы

Почему одна и та же ссылка работает на одном устройстве и не работает на другом?

Проверка выполняется на каждом устройстве при установке, поэтому каждый телефон хранит собственный кэшированный вердикт. Сетевой сбой при установке, иначе ведущий себя OEM-верификатор — Samsung чаще всего фигурирует на своих форумах разработчиков — или установка до вашего исправления JSON дают разные состояния для одной сборки.

Нужно ли выпускать обновление приложения?

Обычно нет. Если манифест уже объявляет домен с autoVerify, поломка — в JSON-файле или отпечатке, и то и другое на сервере. Исправьте файл, форсируйте повторную проверку — и установленная сборка начнёт открывать ссылки. Обновление нужно только если домен вообще не был объявлен.

Обходит ли smart-ссылка проверку?

Нет — и остерегайтесь любых обещаний обратного. Редирект выбирает назначение на сервере, но когда посетитель попадает на ваш https-домен, система применяет тот же статус проверки, что и всегда. Smart-ссылка меняет то, что вы можете делать, пока проверка сломана — вести в стор или веб, — а не сам факт поломки.

Через сколько проверка повторится сама?

Согласно документации Android, верификатор повторяет проверку упавших доменов и запускается заново при обновлении приложения, но расписание не гарантировано и зависит от OEM. На практике — от часов до дней. Форсировать проверку через adb или переустановить приложение быстрее, чем ждать.

Продолжить изучение

Сравнение
1 окт. 2026 г.
12 мин чтения

Лучшие инструменты для deep linking в 2026 году: честное сравнение

Branch, AppsFlyer OneLink, Adjust, Airbridge, Kochava, Singular, Bitly, Dub, onelink.to и Appy, проверенные по их собственным страницам с ценами и документации: диплинки, отложенные диплинки, атрибуция, QR-коды, ИИ-ассистенты, цена и внедрение.

deep linking
deep linking tools
branch alternative
firebase dynamic links
Читать статью
Сравнение
24 сент. 2026 г.
6 мин чтения

Альтернатива Branch.io: без карты, без счетов за превышение, без истекающих ссылок

Branch убрал бесплатный тариф. Теперь, чтобы просто попробовать, нужно дать карту, дальше — $39 в месяц с доплатами без потолка и $199 в месяц за свой домен. Ссылки, по которым 380 дней никто не кликал, истекают. Полная картина и то, чем небольшие команды пользуются вместо Branch.

branch alternative
branch.io pricing
deep linking
link expiration
Читать статью
Сравнение
23 сент. 2026 г.
7 мин чтения

Цены Airbridge изменились в 2026 году: бесплатные тарифы превратились в 30-дневный пробный период

Airbridge рекламировал бесплатную квоту Core и бесплатный тариф DeepLink. Теперь на странице цен — 30 дней пробного периода и затем от $40 в месяц. Хронология и что проверить, если вы подключались на старых условиях.

airbridge alternative
airbridge pricing
deep linking
pricing
Читать статью

Ищете другое? Посмотрите все темы в блоге.

Дайте Android-трафику место для посадки

Создайте smart-ссылку, которая определяет устройство на сервере и ведёт Android-посетителей в приложение, стор или веб — а назначение поменяйте позже, не перепечатывая ни одного QR-кода.

Создать бесплатную smart-ссылку