Меня зовут Самир, я Flutter-разработчик в Surf, и мы продолжаем разбираться в «дружбе» Huawei и Flutter и публикации в App Gallery.
Первую часть — о настройке самого App Gallery — читайте тут.
О чем статья
В этой части статьи мы узнаем:
как подготовить приложение к публикации в разных сторах и медиасервисах;
как тестировать приложение.
Конфигурация проекта
Android
Займёмся конфигурацией нативной части приложения.
У нас есть сертификат подписи и файл agconnect-services.json
.
Первый вставляем в ту часть проекта, где лежат подписи для Android-сборок.
Важно, чтобы это было внутри проекта.
Второй вставляем в android/app/
— там обычно лежит google-services.json
.

Добавляем зависимости Huawei в android/build.gradle
и дополнительный maven-репозиторий для загрузки пакетов.
Нужно разрешить небезопасный протокол, иначе ничего работать не будет (возможно, что-то изменится, но на момент публикации статьи это не работает):

Переходим в android/app/build.gradle
.
Там создаём одну новую конфигурацию подписи сборки — специально для Huawei. Так должна быть устроена подпись в связи с тем, что в App Gallery мы привязываем сертификаты подписи не к приложению, а ко всему проекту.
Указываем путь к файлу, ключи и пароли и включаем оба варианта подписи — иначе не запустится ?

Настраиваем build dimensions — удобный способ генерировать много flavor-ов для нашего приложения. Добавляем новый dimension — тип mobile сервисов.
Добавляем новый flavor dimension — “service-type”, и создаем 2 flavor’a — Google mobile services и Huawei mobile services (далее HMS и HMS).
Для GMS оставляем подпись приложения, что была до этого, а для HMS передаём подпись Huawei:


И теперь добавляем то, что обеспечивает разделение по типам сервисов GMS и HMS, разделённое применение плагинов — в зависимости от типа сервиса в сборке:

В конце нажимаем на Sync Project. Если у появилось много flavor’ов, то поздравляем — конфигурация нативной части завершена.
Если часть flavor’ов не нужна, то можно спокойно их отфильтровать с помощью variant filter.
Flutter
Приступаем к написанию кода на Flutter.
Основная проблема в том, что у каждого mobile-сервиса для конкретной функциональности — по типу определению геолокации или аналитики — отведён собственный пакет. И одновременно двух пакетов в проекте быть не может.
Как же поступить?

Чтобы решить эту проблему, мы создаём пакеты для двух типов сервисов и общий интерфейс. С его помощью мы реализуем эти типы сервисов для каждой функциональности.
Отдельно отметим, что если в приложении используется сервис Google — к примеру, Firebase Remote Config, Crashlytics — это не означает, что его надо выключать для сборки Huawei.
Перед тем, как реализовывать разделение на сервисы, убедимся, что у библиотеки есть фиксация на определенный тип сервиса.

Вот пример реализации в пакете для определения геолокации.

Интерфейс представляет из себя обычный пакет с одним файлом, в котором находится общий интерфейс для реализации, а также общие структуры данных и переменные.

Теперь этот интерфейс мы реализуем для обеих типов медиасервисов.
HMS:

GMS:

Подключаем интерфейс и нужный нам тип сервиса в проект.

На момент публикации статьи во Flutter нет возможности переключать плагины в зависимости от flavor. Пока всё доступно только в ручном моде или в скриптах.
Ура, разделение реализовано!
Тестирование
Теперь разберёмся, как тестировать работу сервисов Huawei — устройство Huawei может не оказаться под рукой.
На момент публикации статьи мы нашли 2 способа: облачную отладку в App Gallery и установку App Gallery на эмулятор.
Облачная отладка в App Gallery
App Gallery даёт нам удаленный доступ к его парку устройств, на котором можно тестировать приложения. Интерфейс для доступа мы ищем в пункте «Облачная отладка».

После выбираем устройство из парка и переходим к экрану отладки.

Из него на удалённое устройство мы загружаем приложение, экспортируем логи и выгружаем кастомные темы (если нужно).

И всё было бы прекрасно, но, как всегда, есть несколько «но».
У каждого аккаунта есть лимит на бесплатное использование облачных устройств. Длится он 24 часа, дальше доступ платный. И лимит этот не сбрасывается.

App Gallery может написать, что устройство недоступно, и нужно забронировать конкретное время.


3. Бронирование не обязательно означает, что в обозначенное время мы получим нужное устройство.

4. Облачная отладка может просто не работать. Устройство может не отображаться в окне, сколько бы мы ни ждали и не меняли настройки качества изображения. У нас, например, на момент тестирования сделать облачную отладку так и не получилось.
5. В облачной отладке нельзя дебажить, а про Hot Reload и Hot Restart можно забыть.
Мы рассматривали облачную отладку как последнюю проверку перед публикацией — чтобы убедиться, что на реальном устройстве реализация работает.
Но есть ещё один способ.
Установка App Gallery на эмулятор
Можно взять любой обычный эмулятор Android и установить на него AppGallery.
Секрет в том, что вместе с магазином приложений будет установлен и HMS Core — отдельное приложение для поддержки Huawei сервисов на устройстве, в котором они не поддерживаются из коробки.
Для этого скачиваем AppGallery с официального сайта.
После — переносим APK на запущенный эмулятор. Он установит его автоматически.
В конце открываем App Gallery один раз — при первом запуске он предложит установить HMS Core. Разрешаем и устанавливаем.

После этого AppGallery можно больше не открывать, регистрироваться тоже нигде не надо.
Приложению HMS Core надо выдать абсолютно все разрешения, иначе библиотеки Huawei не будут работать.

Спокойно запускаем отладку на этом эмуляторе и отлаживаем Huawei сервисы без проблем.
Заключение
Поддержка Huawei сервисов в приложении — вещь совсем не тривиальная. Надеемся, что эта статья даст понимание, как это делать.
Отметим, что эта информация не актуальна для поддержки Harmony OS NEXT, которая выйдет в конце 2024 года. Она уже не будет принимать тип файла .apk, только их внутренний тип — .app. На просторах интернета вы найдёете форк движка, в котором будто бы есть поддержка, но мы ее ещё не тестировали.

Больше полезного про Flutter — в Telegram-канале Surf Flutter Team.
Кейсы, лучшие практики, новости и вакансии в команду Flutter Surf в одном месте. Присоединяйтесь!