В прошлый раз мы с вами дружно:
-
Ввели основные понятия: Deep Link, Web Link, Android App Link, disambiguation dialog
-
Поговорили о том, чем они похожи и чем отличаются
-
Разобрали особенности URI формата в Android
-
Описали исходную задачу
-
Презентовали Deep Link Tree
Если вы до сих пор не прочитали первую часть, то ознакамливайтесь и возвращайтесь 🙂
Сегодня мы будем разбирать две проблемы, связанные с работой deep link на разных устройствах и версиях Android. Каждую проблему будет разбирать на экспериментах (которых мы провели аж 280+ штук).
Содержание
Описание эксперимента
Перед тем как разбираться с проблемами, давайте познакомимся с форматом экспериментов. Мы решили подойти к исследованию проблем эмпирически: проверить, как фактически отрабатывают deep link в реальных условиях.
Взяли семь устройств
-
Pixel 2
-
Samsung A70
-
Samsung A7
-
Honor 9 Lite
-
Samsung Galaxy Tab A
-
Xiaomi Mi5
Восемь версий Android
-
5.0
-
6.0
-
7.0
-
8.0
-
9.0
-
10.0
-
11.0
-
12.0
Пять оболочек
-
One UI 2.5
-
Samsung Experience 9.0
-
One UI 3.1
-
EMUI 9.1.0
-
MIUI Global 10.2.2.0
Семь приложений
-
SMS-клиент
-
Telegram
-
VK
-
WhatsApp
-
Gmail
-
Google Search
-
VK Toasters
Запаслись терпением, таблицами и начали тестировать.

Посмотрим на таблицу выше. Мы решили описать конфигурацию в виде набора из шести параметров:
-
Config – идентификатор конфигурации;
-
Real/Emulator — является ли устройство реальным или эмулятором;
-
Android OS — версия Android;
-
OS Shell — оболочка операционной системы и ее версия;
-
Device — название устройства;
-
App — приложение, из которого будем переходить по deep link.

Теперь разберем таблицу эксперимента. В нее внесены три тестовых URL: developer.andorid.com/about, http://developer.andorid.com/about, https://developer.andorid.com/about и две scheme: http, https.
Q: Почему именно они?
A: Давайте вспомним исходную задачу: нам нужны deep link на ресурсы http://domain1.domain2.ru/landing, https://domain1.domain3.ru/path1/path2/{id}/ и другие. То есть http, https ссылки с host (не особо важно какой) и path (не особо важно какой).
Q: Что тут забыл developer.andorid.com/about (без схемы)?
A: Такие ссылки тоже работают! У них нет обязательного параметра scheme, но посмотрите на скринкаст.

Теперь опишем процедуру выполнения эксперимента:
-
Выберем реальное устройство или эмулятор, версию Android, оболочку ОС, приложение.

-
Запускаем выбранное устройство.
-
Открываем выбранное приложение.
-
Вставляем три вида ссылок.

-
Настраиваем intent-filter внутри нашего приложения. Так как исходная задача заключалась в реализации Web Link, то были выбраны http и https схемы. Начинаем с http.
<data android:host="developer.android.com" android:path="/about" android:scheme="http"/> <!-- Тут –->
-
Компилируем, открываем приложение, в которое вставили ссылки. Начинаем кликать 🙂

-
Если Android предложил открыть наше приложение, то помечаем этот сценарий плюсом, иначе минусом.

-
http схема протестирована! Повторяем шаги 5, 6, 7 для https scheme.
Кстати, вот ссылка на таблицы всех экспериментов. Не торопитесь очень подробно рассматривать, там есть спойлеры к следующим статьям.
Хронология появления проблем
ТЕПЕРЬ ВЫ ГОТОВЫ! Давайте посмотрим на список проблем, с которыми нам пришлось столкнуться на пути решения исходной задачи:
-
Разные устройства. Обработка deep link отличалась на разных устройствах.
-
Разные версии Android. Обработка deep link отличалась на разных версиях Android.
-
Разные оболочки ОС. Обработка deep link отличалась на разных оболочках Android.
-
Разные приложения. Обработка deep link отличалась в зависимости от приложения, из которого открывалась ссылка.
-
Ссылки без scheme. Ссылки вида host/path обрабатывались по-разному.
-
Второй host. Мы забыли о том, что у нас есть второй домен.
-
Перехват всех ссылок. В один момент приложение начало перехватывать все ссылки с нашим доменом (даже те, для которых у нас не было сценариев обработки).
В этот раз мы разберем первые две проблемы. Остальные будут в следующих статьях. Поехали!
Проблема №1. Разные устройства
Опишем условия, в которых воспроизводится проблема:


На обоих устойствах открываем Gmail, отправляем сами себе письмо с ссылкой domain1.domain2.ru/landing, получаем, открываем, кликаем по ней. А теперь внимание на экран:


Как всегда, реальность внесла свои коррективы… Несмотря на то, что мы открываем одну и ту же ссылку, в одном и том же приложении, на одном и том же Android, в наше приложение смог перейти только Config X-1 (Samsung A70). Мы решили сформулировали гипотезу:
Гипотеза 1. Разные устройства.
Устройство (аппаратная часть) влияет на работу Deep Link
Ответ пришел быстро. Во-первых, тут разные оболочки. Во-вторых, Deep Link — это механизм, реализованный на программном уровне (то есть в устройстве нет специального чипа, который отвечает за обработку deep link). Поэтому
Гипотеза 1. Разные устройства — ОПРОВЕРГНУТА.
Устройство (аппаратная часть) НЕ ВЛИЯЕТ на работу Deep Link
Это значит, что в последующих тест-кейсах параметр конфигурации Device считаем незначимым (его изменение не влияет на результаты экспериментов).
Проблема №2. Разные версии Android
Как и в прошлый раз, опишем условия, в которых воспроизводится проблема:


На обоих устройствах открываем стандартный СМС клиент, отправляем куда-нибудь сообщение с ссылкой http://domain1.domain2.ru/landing, кликаем по ней. Обратите внимание на экран:


Как и в прошлый раз, мы открываем одну и ту же ссылку, в одном и том же приложении, но на разных версиях Android. В этот раз в наше приложение смог перейти только Confix X-2 (Android 10.0).
Сформулируем гипотезу:
Гипотеза 2. Разные версии Android.
Версия Android OС влияет на работу Deep Link
Для проверки этой гипотезы будем использовать мажорные версии Android: 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0… Попались! 🙂 С 12.0 web link не обрабатывается приложением (только Android App Link, смотри предыдущую статью), поэтому 12.0 и 13.0 исключаем из списка.
В рамках гипотезы мы зафиксировали все параметры, кроме Android OS, чтобы отследить его влияние на обработку Deep Link. Результаты оказались неоднозначными. Посмотрите на таблицы:

Рассмотрим самый распространенный результат (исходники тут Config 1, Config 2, Config 3, Config 5, Config 6, Config 7):

-
Для http scheme первая и вторая ссылки открываются в нашем приложении, https ссылка — нет.
-
Https работает почти также, но https ссылка обрабатывается, в отличие от строчки выше.
Теперь разберем исключительный случай:

-
Для http scheme никаких отличий нет.
-
Для https Android 8.0 отличился. Здесь система предложила открыть приложение при переходе по первым двум ссылкам (в предыдущей таблице тут стоят +).
Давайте не будем торопиться с выводами. Внимание на скринкасты.


Изначально в списке приложений нет нашего, но при выборе браузера появляется disambiguation dialog, в котором оно есть!
Если не слишком придираться, то можно сказать, что в конечном итоге пользователю было предложено открыть наше приложение (с оговоркой о том, что сначала пришлось выбрать браузер). Давайте подкорректируем таблицы с учетом этого допущения.


Вернемся к гипотезе. Если считать переход через браузер в наше приложение равносилен прямому переходу в приложение, то Android не влияет на обработку Deep Link. В противном случае вывод обратный. Мы считаем эти переходы равносильными, поэтому
Гипотеза 2. Разные версии Android – ОПРОВЕРГНУТА.
Версия Android OС НЕ ВЛИЯЕТ на работу Deep Link.
Это значит, что в последующих тест-кейсах параметр конфигурации Android ОС считаем незначимым (его изменение не влияет на результаты экспериментов).
Резюме
Подведем итоги. Сегодня мы рассмотрели две из семи проблемы, с которыми столкнулись при решении исходной задачи.
Проблема первая: на разных девайсах диплинк обрабатывается по-разному. Означает ли это, что аппаратная часть устройства может влиять на обработку? Нет. Deep Link — это механизм, реализованный на программном уровне (нет чипа, отвечающего за обработку deep link).
Гипотеза 1. Разные устройства — ОПРОВЕРГНУТА. Устройство (аппаратная часть) НЕ ВЛИЯЕТ на работу Deep Link.
Вторая проблема состояла в том, что на разных версиях Android диплинки обрабатывались не всегда ожидаемо (посмотрите еще раз на скринкасты). Сначала нам не удалось перейти в приложение на Android 8.0. Но после выбора браузера, появился disambiguation dialog с нашим приложением. Кто-то скажет, что перехода в приложение нет (ваше право). Мы же считаем, что он есть (пусть и пользователю приходится делать один дополнительный клик).
Гипотеза 2. Разные версии Android – ОПРОВЕРГНУТА.
Версия Android OС НЕ ВЛИЯЕТ на работу Deep Link.
Поздравляем! Ты дважды молодец! Позади вторая часть пути, но настоящие сложности еще впереди. Как ощущения? Напиши в комментариях, ожидал ли ты такие исходы по первой и второй гипотезам?
В следующий раз мы разберем еще две проблемы и сделаем выводы по гипотезам:
Гипотеза 3. Разные оболочки ОС.
Оболочка Android ОС влияет на работу Deep Link.
Гипотеза 4. Приложение.
Приложение, из которого открывается ссылка, влияет на работу Deep Link.
Увидимся в третьей части, а пока можете посмотреть на то, как Валера щелкает алгоритмы с LeetCode в «Алгоритмической качалке». До встречи!
Валера Петров
Android-разработчик. TG: @valeryvpetrov
Ангелина Евсикова
Android-разработчица Технократии. TG: @Angelina_dev
Также подписывайтесь на наш телеграм-канал «Голос Технократии». Каждое утро мы публикуем новостной дайджест из мира ИТ, а по вечерам делимся интересными и полезными мастридами.
ссылка на оригинал статьи https://habr.com/ru/post/691220/
Добавить комментарий