Документация
ОС Аврора 3.32.7

Реализации плагина с использованием 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 │
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.