Привет, Хабр! Меня зовут Юрий Петров, я Flutter Team Lead в Friflex и автор ютуб-канала «Юрий Петров | Всё об IT». Мы разрабатываем мобильные приложения для бизнеса и специализируемся на Flutter. А также мы делаем  свой вклад в развитие экосистемы Аврора + Flutter. В этой статье хочу рассказать про то, как можно подключиться к нативной части ОС Авроры для тестирования нативной части Flutter-приложения.

История

Совсем недавно, команда из ОМП (Открытая мобильная платформа) объявила, что смогла портировать Flutter для создания приложений под систему Аврора. Так же, есть классный доклад Дениса Глазкова на конференции CorssConf про это. За что, конечно, им честь и хвала. На самом деле, ребята из ОМП провели очень большую работу.

Но вернемся к земным проблемам. Для портирование Flutter приложений которые уже написаны, необходимо портировать нативные плагины. И здесь мы уперлись в проблему, что нет возможности тестировать нативную часть плагина в режиме debug. И это очень сильно замедляло разработку плагинов. Крайне трудно портировать большие плагины, к примеру, такие как location или push_notification, не имея возможности подключаться к нативной части для тестирования. 

Но решение есть. Для него нам потребуется следующее:

  1. Внешний отладчик gdb-multiarch 

  2. Плагины VScode Native Debug и работы с языком C++  C/C++ Extension Pack

P.S. Будет много консольных команд, но деваться некуда. Если нет желания читать, то можно посмотреть видео версию.

Собираем приложение в режиме debug

Как установить и настроить flutter-aurora, можете посмотреть подробную видео инструкцию на нашем канале здесь, здесь и здесь

Для примера будем использовать проект flutter_plugins. Этот репозиторий содержит плагины Flutter для платформы ОС Аврора.

Клонируем проект:

https://gitlab.com/omprussia/flutter/flutter-plugins.git

В папке с проектом запускаем в терминале команды — для перехода в папку example, вызов pub get и кодогенерацию:

cd example
flutter-aurora pub get
dart run build_runner build --delete-conflicting-outputs

Теперь собираем rpm (с таким расширением собирается билд в системе Аврора) в режиме debug.

flutter-aurora build aurora --debug

В итоге у нас есть три rpm, собранных в режиме debug.

Теперь нам необходимо их подписать, для подписи будем использовать тестовый ключ и сертификат. Скачать их можно тут. Скачиваем и копируем в папку sign в корень папки пользователя. Например, у меня это /home/dev/sign.

Далее вызываем команду для подписания пакетов:

aurora_psdk rpmsign-external sign \ 
--key $HOME/sign/regular_key.pem 
--cert $HOME/sign/regular_cert.pem \
$HOME/flutter-plugins/example/build/aurora/aurora-arm/debug/RPMS/*.rpm

Немного поясню по команде, в строке:

  1. Обращаемся к aurora_psdk и к его инструменту для подписания.

  2. Путь к ключу.

  3. Путь к сертификату.

  4. Путь к папке, где лежат debug билды.

Если процесс подписания успешно пройден, то в консоли увидите следующую информацию:

Успешное подписание три из трех билдов
Успешное подписание три из трех билдов

Отлично, теперь копируем наши сборки в смартфон.

Вызываем команду для копирования, где указываем, что все рпм, которые находятся в папке builds, необходимо перенести на смартфон в папку Downloads.

scp $HOME/flutter-plugins/example/build/aurora/aurora-arm/debug/RPMS/*.rpm defaultuser@192.168.2.15:/home/defaultuser/Downloads

В консоли можно наблюдать такую картинку.

Осталось установить приложение на смартфоне и запустить.

Подключаемся к смартфону через ssh:

ssh defaultuser@192.168.2.15

Переходим в режим суперпользователя:

devel-su

Запускаем установку всех пакетов rpm в папке Downloads:

pkcon install-local /home/defaultuser/Downloads/*.rpm -y

Результат успешной установки:

Выходим из суперпользователя:

exit

Запускаем gdb сервер:

gdbserver --multi :10006

Важно: запомните порт, на котором будет запущен gdbserver, в нашем случае это 10006.

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

В смартфоне убедились, что приложение установлено и работает.

Скриншоты с телефона

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

Если в системе не установлен gdb, необходимо установить следующей командой:

Установка и настройка отладчика

Если в системе не установлен gdb, необходимо установить следующей командой:

sudo apt install gdb-multiarch

Далее добавляем плагины Native Debug C/C++ Extension Pack в VScode. Для этого переходим в раздел "Extensions" и находим нужные плагины.

Extensions

Создаем в корне проекта файл .gdbinit для инициализации gdb. И добавляем в него следующую информацию:

set remote exec-file /usr/bin/ru.auroraos.flutter_example_packages

Это файл для инициализации gdb, в нем указан путь к установленному приложению на смартфоне. Если вы используете другое название пакета, то тут укажите свое.

Далее создаем конфигурационный файл для запуска:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach with GDB",
            "type": "cppdbg",
            "request": "launch",
            "program": "./example/build/aurora/aurora-arm/debug/ru.auroraos.flutter_example_packages",
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "192.168.2.15:10005",
            "useExtendedRemote": true,
            "cwd": "${workspaceRoot}",
         }
    ]
}

Выбираем конфигурацию для запуска: Attach with GDB. И подключаемся к смартфону в режиме debug. Теперь мы можем тестировать нативную часть плагинов.

Результат работы:

Нативная отладка

Если что-то не получается, то можно клонировать проект по ссылке и попробовать.

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


  1. nik135
    10.11.2023 11:27

    так ли необходим плагин NativeDebug? Мне кажется, все заведется и без него :)
    для чего используется параметр "useExtendedRemote": true ?


    1. mrDevGo Автор
      10.11.2023 11:27

      После создания конфигурации и запуска, наверно больше и не нужен), не проверял. А вот useExtendedRemote - расширенный режим удаленной отладки при подключении к GDB, без включения данного параметра не работает.