Как подключиться к Flutter приложению в режиме нативного debug на ОС Аврора

c84fbae08683763bc2c8e077b52177e4.jpg

Привет, Хабр! Меня зовут Юрий Петров, я 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.

5e161254549072c8cceac991abffb88b.png

Теперь нам необходимо их подписать, для подписи будем использовать тестовый ключ и сертификат. Скачать их можно тут. Скачиваем и копируем в папку 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

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

4713cd825fdc8c1cfc45956b36821a96.png

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

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

ssh defaultuser@192.168.2.15

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

devel-su

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

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

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

a85ea54a5b675fb36767477f8080e1d0.png

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

exit

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

gdbserver --multi :10006

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

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

6c93735f551c65f501382660cbe96c27.png

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

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

b50ec06b9d59066d7384f523efa2091d.png

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

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

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

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

sudo apt install gdb-multiarch

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

Extensions

4a93ed1f34f02d2987adbd4557b314a2.png

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

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

790e44bf4b4b423a27f7db95ab88e82c.png

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

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

b0600fd7055b1375c6017a97d1968f9c.png

{
    "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. Теперь мы можем тестировать нативную часть плагинов.

c2f45310fd0d78d53434504bc3bb460d.png

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

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

0bec38ed72305d3062935375b36aa6ae.gif

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

© Habrahabr.ru