Реализации плагина с использованием D-Bus
Пример платформо-зависимого плагина, работающего с операционной системой Аврора через систему межпроцессного взаимодействия D-Bus. Задача плагина — получить название устройства через D-Bus.
Реализация плагина через D-Bus интерфейс позволяет работать с операционной системой без имплементации интерфейса Platform Channel на С++. Это самый простой способ реализации платформо-зависимого, а точнее — частично-зависимого плагина.
Примечание:
Этот демонстрационный плагин доступен в репозитории Flutter в разделе examples/dbus.
Содержание:
Создание проекта
Flutter CLI позволяет создать шаблон плагина.
Подробнее ознакомиться с типами плагинов можно в разделе Пакеты Flutter.
Плагин на D-Bus является частично-зависимым,
то есть зависит от платформо-зависимого плагина dbus.
Создать такой плагин можно следующей командой:
flutter-aurora create --template=package --org=ru.aurora dbus_demo
ru.aurora— имя организации (Organization name), участвует в формировании названия пакета;dbus_demo— название плагина (Application Name), участвует в формировании названия пакета.
Данная команда генерирует базовый пример плагина Flutter с настроенным окружением для сборки под ОС Аврора. Структура файлов и каталогов проекта имеет следующий вид:
.
├── lib
│ └── dbus_demo.dart
├── test
│ └── dbus_demo_test.dart
├── analysis_options.yaml
├── CHANGELOG.md
├── LICENSE
├── pubspec.lock
├── pubspec.yaml
└── README.md
3 directories, 9 files
Примечание:
Для предварительного знакомства с Flutter можно обратиться к документации Flutter и создать своё первое приложение, используя информацию из статьи "Write your first Flutter app".
Настройка D-Bus
Пакет dbus можно установить из командной строки:
dart pub global activate dbus
В пакете имеются следующие исполняемые файлы:
dart-dbus
dart-dbus — приложение CLI, которое позволяет на основе XML интерфейса D-Bus создать
привязки для Dart-кода.
Запустив приложение в терминале, можно увидеть следующий вывод:
A tool to generate Dart classes from D-Bus interface defintions.
Usage: dart-dbus <command> [arguments]
Global options:
-h, --help Print this usage information.
Available commands:
generate-object Generates a DBusObject to register on the D-Bus.
generate-remote-object Generates a DBusRemoteObject to access an object on the D-Bus.
Run "dart-dbus help <command>" for more information about a command.
Для того чтобы плагин мог работать с D-Bus, следует добавить в зависимости файла pubspec.yaml
платформо-зависимый плагин dbus, который работает на платформе ОС Аврора:
dependencies:
dbus: ^0.7.10
Генерация привязок
Демонстрационный плагин выполняет задачу по получению названия устройства.
Это можно осуществить через доступную службу интерфейса D-Bus ru.omp.deviceinfo.
Подробнее о службе можно почитать в документации ОС Аврора "Device Info API".
Для генерации привязок необходим XML-файл с интерфейсом этой службы. Для получения XML-файла с интерфейсом нужно перейти на эмулятор:
ssh -i ~/AuroraOS/vmshare/ssh/private_keys/sdk -p 2223 defaultuser@localhost
или
~/AuroraOS/bin/sfdk emulator exec
Примечание:
Путь к ключу может отличаться на машине с установленным Аврора SDK.
Проверка наличия службы D-Bus ru.omp.deviceinfo:
busctl --user list | grep ru.omp.deviceinfo
Вывод должен быть следующим:
ru.omp.deviceinfo.Features - - - (activatable) - -
ru.omp.deviceinfo.SIM - - - (activatable) - -
ru.omp.deviceinfo.Storages - - - (activatable) - -
Получение XML-кода интерфейса для генерации DBusRemoteObject, необходим только раздел Features:
gdbus introspect --system --recurse --xml \
--dest "ru.omp.deviceinfo" \
--object-path "/ru/omp/deviceinfo/Features"
Команда выдаст в терминал XML код, из которого необходимо создать файл ru.omp.deviceinfo.Features.xml
в корне проекта, убрав ненужные фрагменты:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="ru.omp.deviceinfo.Features">
<method name="getDeviceModel">
<arg type="s" direction="out"/>
</method>
</interface>
</node>
После создания XML-файла с интерфейсом нужной службы следует запустить генерацию
привязок (DBusRemoteObject):
dart-dbus generate-remote-object ru.omp.deviceinfo.Features.xml \
-o lib/ru_omp_deviceinfo_Features.dart
В созданном dart-dbus файле <project>/lib/ru_omp_deviceinfo_Features.dart находятся все методы и
сигналы интерфейса ru.omp.deviceinfo.Features.
Доработка плагина
Для получения названия устройства можно использовать метод getDeviceModel службы ru.omp.deviceinfo.
Ниже представлена реализация запроса в плагине в службу через привязки Dart.
Для этого необходимо обновить файл <project>/lib/dbus_demo.dart следующим образом:
library dbus_demo;
import 'package:dbus/dbus.dart';
import 'package:dbus_demo/ru_omp_deviceinfo_Features.dart';
class DbusDemo {
/// Реализация метода для получения названия устройства.
Future<String?> getDeviceName() async {
// Инициализация клиента D-Bus
final client = DBusClient.system();
// Инициализация объекта
final features = RuOmpDeviceinfoFeatures(
client,
'ru.omp.deviceinfo',
DBusObjectPath('/ru/omp/deviceinfo/Features'),
);
// Выполнение метода
final deviceName = await features.callgetDeviceModel();
// Закрытие клиента D-Bus
await client.close();
// Возвращение результата
return deviceName == '' ? null : deviceName;
}
}
Для обновления зависимостей плагина необходимо выполнить команду в корне проекта:
flutter-aurora pub get
Добавление примера
Для Dart-библиотеки демо-приложение (example), использующее плагин, по умолчанию не создаётся.
Добавить его можно командой для создания приложений в корне проекта плагина:
flutter-aurora create --platforms=aurora --template=app --org=ru.aurora dbus_demo_example \
&& mv dbus_demo_example example
Необходимо перейти в директорию example и подключить плагин dbus_demo в pubspec.yaml:
dependencies:
dbus_demo:
path: ../
Для повышения читаемости кода, систематизации и упрощения написания приложений-примеров
был разработан плагин internal_aurora.
Добавить в зависимости плагин internal_aurora в pubspec.yaml можно следующим образом:
dependencies:
internal_aurora:
git:
url: https://developer.auroraos.ru/git/flutter/flutter-community-plugins/internal_aurora.git
Обновить зависимости в директории example можно следующим образом:
cd example
flutter-aurora pub get
Далее следует доработать приложение, которое будет использовать плагин dbus_demo и демонстрировать название
устройства:
import 'package:dbus_demo/dbus_demo.dart';
import 'package:flutter/material.dart';
import 'package:internal_aurora/list_item_data.dart';
import 'package:internal_aurora/list_item_info.dart';
import 'package:internal_aurora/list_separated.dart';
import 'package:internal_aurora/theme/colors.dart';
import 'package:internal_aurora/theme/theme.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final DbusDemo _plugin = DbusDemo();
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: internalTheme,
home: Scaffold(
appBar: AppBar(
title: const Text('D-Bus Demo'),
),
body: ListSeparated(
children: [
const ListItemInfo("""
An example of a platform-dependent plugin that works with the
Aurora OS via the D-Bus interface.
"""),
ListItemData(
'Get Device Name',
InternalColors.purple,
description:
'Getting the device name through a platform-dependent plugin on D-Bus',
future: _plugin.getDeviceName(),
),
],
),
),
);
}
}
Добавить необходимые разрешения в файл <project>/aurora/desktop/ru.aurora.dbus_demo.desktop
в example для получения доступов к службе ru.omp.deviceinfo:
Permissions=DeviceInfo
Теперь можно запустить приложение. В корне проекта выполнить команду Flutter CLI для сборки и запуска приложения:
flutter-aurora run
Примечание:
Для сборки доступны 3 архитектуры, более детально с этим вопросом можно ознакомиться в разделе "Целевая архитектура".
После успешной сборки выводится путь к файлу RPM c собранным приложением. Приложение будет запущено на выбранном устройстве:
┌─ Result ────────────────────────────────────────────────────────────────────────────────────────────┐
│ ./build/aurora/psdk_5.0.0.60/aurora-arm/release/RPMS/ru.aurora.dbus_demo_example-0.1.0-1.x86_64.rpm │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘