В прошлый раз мы с вами дружно:

  • Ввели основные понятия: Deep Link, Web Link, Android App Link, disambiguation dialog

  • Поговорили о том, чем они похожи и чем отличаются

  • Разобрали особенности URI формата в Android

  • Описали исходную задачу

  • Презентовали Deep Link Tree

Если вы до сих пор не прочитали первую часть, то ознакамливайтесь и возвращайтесь :)

Сегодня мы будем разбирать две проблемы, связанные с работой deep link на разных устройствах и версиях Android. Каждую проблему будет разбирать на экспериментах (которых мы провели аж 280+ штук).

Содержание

  1. Введение

  2. Описание эксперимента

  3. Хронология появления проблем

  4. Проблема №1: разные устройства

  5. Проблема №2: разные версии ОС

  6. Резюме

Описание эксперимента

Перед тем как разбираться с проблемами, давайте познакомимся с форматом экспериментов. Мы решили подойти к исследованию проблем эмпирически: проверить, как фактически отрабатывают 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

Запаслись терпением, таблицами и начали тестировать.

Таблица эксперимента.
Таблица эксперимента.

Посмотрим на таблицу выше. Мы решили описать конфигурацию в виде набора из шести параметров: 

  1. Config – идентификатор конфигурации;

  2. Real/Emulator — является ли устройство реальным или эмулятором;

  3. Android OS — версия Android;

  4. OS Shell — оболочка операционной системы и ее версия;

  5. Device — название устройства;

  6. 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, но посмотрите на скринкаст.

Переход по ссылке без scheme
Переход по ссылке без scheme

Теперь опишем процедуру выполнения эксперимента:

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

Пример заполнения таблицы конфигурации.
Пример заполнения таблицы конфигурации.
  1. Запускаем выбранное устройство.

  1. Открываем выбранное приложение.

  1. Вставляем три вида ссылок.

Перед началом эксперимента нужно вставить ссылки в приложение, из которого будем их открывать.
Перед началом эксперимента нужно вставить ссылки в приложение, из которого будем их открывать.
  1. Настраиваем intent-filter внутри нашего приложения. Так как исходная задача заключалась в реализации Web Link, то были выбраны http и https схемы. Начинаем с http.

<data
   android:host="developer.android.com"
   android:path="/about"
   android:scheme="http"/> <!-- Тут –->
  1. Компилируем, открываем приложение, в которое вставили ссылки. Начинаем кликать :)

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

Пример заполнения таблицы эксперимента
Пример заполнения таблицы эксперимента
  1. http схема протестирована! Повторяем шаги 5, 6, 7 для https scheme.

Кстати, вот ссылка на таблицы всех экспериментов. Не торопитесь очень подробно рассматривать, там есть спойлеры к следующим статьям.

Хронология появления проблем

ТЕПЕРЬ ВЫ ГОТОВЫ! Давайте посмотрим на список проблем, с которыми нам пришлось столкнуться на пути решения исходной задачи:

  1. Разные устройства. Обработка deep link отличалась на разных устройствах.

  2. Разные версии Android. Обработка deep link отличалась на разных версиях Android.

  3. Разные оболочки ОС. Обработка deep link отличалась на разных оболочках Android.

  4. Разные приложения. Обработка deep link отличалась в зависимости от приложения, из которого открывалась ссылка.

  5. Ссылки без scheme. Ссылки вида host/path обрабатывались по-разному.

  6. Второй host. Мы забыли о том, что у нас есть второй домен.

  7. Перехват всех ссылок. В один момент приложение начало перехватывать все ссылки с нашим доменом (даже те, для которых у нас не было сценариев обработки).

В этот раз мы разберем первые две проблемы. Остальные будут в следующих статьях. Поехали!

Проблема №1. Разные устройства

Опишем условия, в которых воспроизводится проблема: 

Config X-1. Конфигурация Samsung A70
Config X-1. Конфигурация Samsung A70
Config Y-1. Конфигурация Pixel 2
Config Y-1. Конфигурация Pixel 2

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

Config X-1. Переход в наше приложение — предлагается.
Config X-1. Переход в наше приложение — предлагается.
Config Y-1. Переход в наше приложение — не предлагается (мы попали в браузер).
Config Y-1. Переход в наше приложение — не предлагается (мы попали в браузер).

Как всегда, реальность внесла свои коррективы… Несмотря на то, что мы открываем одну и ту же ссылку, в одном и том же приложении, на одном и том же Android, в наше приложение смог перейти только Config X-1 (Samsung A70). Мы решили сформулировали гипотезу:

Гипотеза 1. Разные устройства. 

Устройство (аппаратная часть) влияет на работу Deep Link

Ответ пришел быстро. Во-первых, тут разные оболочки. Во-вторых, Deep Link — это механизм, реализованный на программном уровне (то есть в устройстве нет специального чипа, который отвечает за обработку deep link). Поэтому

Гипотеза 1. Разные устройства — ОПРОВЕРГНУТА. 

Устройство (аппаратная часть) НЕ ВЛИЯЕТ на работу Deep Link

Это значит, что в последующих тест-кейсах параметр конфигурации Device считаем незначимым (его изменение не влияет на результаты экспериментов).

Проблема №2. Разные версии Android

Как и в прошлый раз, опишем условия, в которых воспроизводится проблема:

Config X-2. Конфигурация  Pixel 2
Config X-2. Конфигурация Pixel 2
Config Y-2. Конфигурация Pixel 2
Config Y-2. Конфигурация Pixel 2

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

Confix X-2. Переход в наше приложение — предлагается.
Confix X-2. Переход в наше приложение — предлагается.
Confix Y-2. Переход в наше приложение — не предлагается.
Confix Y-2. Переход в наше приложение — не предлагается.

Как и в прошлый раз, мы открываем одну и ту же ссылку, в одном и том же приложении, но на разных версиях 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. Результаты оказались неоднозначными. Посмотрите на таблицы:

Результаты проверки гипотезы о влиянии версии Android ОС.
Результаты проверки гипотезы о влиянии версии Android ОС.

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

Результаты проверки гипотезы о влиянии версии Android ОС для 5.0, 6.0, 7.0, 9.0, 10.0, 11.0.
Результаты проверки гипотезы о влиянии версии Android ОС для 5.0, 6.0, 7.0, 9.0, 10.0, 11.0.
  • Для http scheme первая и вторая ссылки открываются в нашем приложении, https ссылка — нет.

  • Https работает почти также, но https ссылка обрабатывается, в отличие от строчки выше.

Теперь разберем исключительный случай:

Результаты проверки гипотезы о влиянии версии Android ОС для 8.0 (Config 4).
Результаты проверки гипотезы о влиянии версии Android ОС для 8.0 (Config 4).
  • Для http scheme никаких отличий нет.

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

Давайте не будем торопиться с выводами. Внимание на скринкасты.

Config 4 (Android 8.0), developer.android.com/about, scheme=https. При выборе браузера появляется второй disambiguation dialog с нашим приложением.
Config 4 (Android 8.0), developer.android.com/about, scheme=https. При выборе браузера появляется второй disambiguation dialog с нашим приложением.
Config 4 (Android 8.0), http://developer.android.com/about, scheme=https. 
Исход такой же, но переход в браузер не замечен.
Config 4 (Android 8.0), http://developer.android.com/about, scheme=https. Исход такой же, но переход в браузер не замечен.

Изначально в списке приложений нет нашего, но при выборе браузера появляется disambiguation dialog, в котором оно есть!

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

Результаты проверки гипотезы о влиянии версии Android ОС для 8.0 (с корректировкой).
Результаты проверки гипотезы о влиянии версии Android ОС для 8.0 (с корректировкой).
Результаты проверки гипотезы о влиянии версии Android ОС.
Результаты проверки гипотезы о влиянии версии Android ОС.

Вернемся к гипотезе. Если считать, что переход через браузер в наше приложение равносилен прямому переходу в приложение, то 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


Также подписывайтесь на наш телеграм-канал «Голос Технократии». Каждое утро мы публикуем новостной дайджест из мира ИТ, а по вечерам делимся интересными и полезными мастридами.

Комментарии (0)