ОС Аврора — российская мобильная операционная система, которую разрабатывает компания ООО «Открытая мобильная платформа» (ОМП). Система ориентирована в первую очередь на корпоративный и государственный сегменты, где критичны требования к информационной безопасности.
Исторически ОС Аврора происходит от открытой мобильной ОС Sailfish OS (компания Jolla), которая, в свою очередь, наследует наработки проектов MeeGo и Mer. Этим объясняются названия ряда компонентов платформы: классическая UI-библиотека называется Sailfish Silica (сейчас заменяется компонентами Aurora Controls),а пакет с ней — sailfishsilica-qt5.
Ключевые элементы архитектуры:
systemd;В интенсиве используется ОС Аврора 5 — актуальное пятое поколение системы. Документация для конкретных версий доступна на портале разработчиков:
developer.auroraos.ru/doc.
Официально поддерживаемый нативный стек ОС Аврора — это C++ и QML с фреймворком Qt:
Системная версия Qt в ОС Аврора — Qt 5.6. Это означает:
import QtQuick 2.0 (или 2.6), import Sailfish.Silica 1.0;Под ОС Аврора также можно разрабатывать на Flutter/Dart, в виде веб-приложений (WebView/CEF, PWA) и др, а также на Godot и KMP. При этом нативный стек C++/QML даёт максимальную производительность и полный доступ к API платформы, поэтому именно он выбран для задач граничных вычислений.
Аврора SDK — официальный набор инструментов разработчика. Состав:
| Компонент | Назначение |
|---|---|
| Аврора IDE | Интегрированная среда разработки на базе Qt Creator: редактор, мастер проектов, управление сборкой и развёртыванием |
| Build Engine | Изолированная среда сборки (виртуальная машина или Docker-контейнер) с кросс-компиляторами под целевые архитектуры |
| Эмулятор ОС Аврора | Виртуальная машина с образом ОС Аврора (архитектура x86_64, а сейчас и aarch64 для macOS) для запуска и отладки приложений |
| sfdk | Утилита командной строки для сборки и развёртывания (полезна для CI/CD и сторонних редакторов) |
Важно про версии SDK. В Аврора SDK 5.0/5.1 эмулятор и Build Engine работают поверх VirtualBox; начиная с SDK 5.2 используется QEMU, который поставляется в комплекте и не требует установки VirtualBox.
Компьютер разработчика (Windows/Linux, x86_64) и целевое устройство (ОС Аврора, чаще всего ARM: armv7hl или aarch64) — разные платформы. Поэтому компиляция выполняется не на хосте, а внутри Build Engine, где установлены целевые окружения (таргеты) для каждой архитектуры:
Аврора IDE (Windows / Linux)
│ исходный код проекта
▼
Build Engine (ВМ/контейнер с кросс-инструментами)
│ qmake/CMake → компиляция → rpmbuild
▼
RPM-пакет (armv7hl | aarch64 | x86_64)
│ развёртывание по SSH
▼
Эмулятор (x86_64) или устройство (ARM)
Для эмулятора приложение собирается под x86_64, для устройств — под armv7hl или aarch64. Выбор таргета выполняется в Аврора IDE.
Мастер Аврора IDE («Файл → Создать файл или проект → Приложение ОС Аврора») генерирует проект со стандартной структурой. Рассмотрим её на примере приложения с именем пакета ru.template.MyFirstApp (имя пакета строится по схеме «обратное доменное имя организации + название приложения»):
MyFirstApp/
├── ru.template.MyFirstApp.pro ← файл проекта qmake
├── ru.template.MyFirstApp.desktop ← параметры запуска и разрешения
├── icons/ ← иконки приложения (86x86 … 172x172)
├── qml/
│ ├── MyFirstApp.qml ← корневой файл: окно приложения
│ ├── cover/DefaultCoverPage.qml ← обложка (вид в меню)
│ └── pages/MainPage.qml ← первая страница
├── rpm/
│ └── ru.template.MyFirstApp.spec ← сценарий сборки RPM-пакета
├── translations/ ← файлы переводов
└── src/
└── main.cpp ← точка входа C++
#include <auroraapp.h>
#include <QtQuick>
int main(int argc, char *argv[])
{
QScopedPointer<QGuiApplication> application(Aurora::Application::application(argc, argv));
application->setOrganizationName(QStringLiteral("ru.template"));
application->setApplicationName(QStringLiteral("MyFirstApp"));
QScopedPointer<QQuickView> view(Aurora::Application::createView());
view->setSource(Aurora::Application::pathTo(QStringLiteral("qml/MyFirstApp.qml")));
view->show();
return application->exec();
}
Пояснения:
Aurora::Application (библиотека auroraapp) создаёт объект приложения и графическое представление, корректно настроенные для ОС Аврора;setOrganizationName / setApplicationName определяют, в каких каталогах система будет хранить настройки, данные и кэш приложения, — значения должны совпадать с полями OrganizationName и ApplicationName файла .desktop;Aurora::Application::pathTo() возвращает путь к ресурсу, установленному вместе с приложением (каталог /usr/share/<имя_пакета>/);application->exec() запускает цикл обработки событий — программа работает, пока пользователь не закроет окно.TARGET = ru.template.MyFirstApp
CONFIG += auroraapp
PKGCONFIG += auroraapp
SOURCES += src/main.cpp
DISTFILES += \
rpm/ru.template.MyFirstApp.spec
AURORAAPP_ICONS = 86x86 108x108 128x128 172x172
TARGET — имя исполняемого файла и пакета;CONFIG += auroraapp подключает правила сборки приложений ОС Аврора: автоматическую установку каталога qml/, иконок и .desktop-файла в нужные места;PKGCONFIG += auroraapp подключает заголовки и флаги линковки библиотеки libauroraapp;AURORAAPP_ICONS — список размеров иконок из каталога icons/.Здесь используется система сборки
QMake. При этом в современных примерах (ссылки ниже) применяетсяCMake.
[Desktop Entry]
Type=Application
X-Nemo-Application-Type=silica-qt5
Icon=ru.template.MyFirstApp
Exec=/usr/bin/ru.template.MyFirstApp
Name=My First App
Name[ru]=Моё первое приложение
[X-Application]
Permissions=
OrganizationName=ru.template
ApplicationName=MyFirstApp
ExecDBus=/usr/bin/ru.template.MyFirstApp
Секция [X-Application] управляет песочницей: ключ Permissions перечисляет разрешения, которые запрашивает приложение (для простого UI-приложения список пуст). ExecDBus — команда запуска для D-Bus службы; должна совпадать с путём к исполняемому файлу.
Spec-файл описывает метаданные пакета (имя, версия, лицензия), зависимости сборки и состав устанавливаемых файлов. Базовый spec из шаблона менять почти не приходится; заглянуть в него полезно, чтобы понимать, что попадает в итоговый RPM:
Name: ru.template.MyFirstApp
Summary: My First App
Version: 0.1
Release: 1
License: BSD-3-Clause
Source0: %{name}-%{version}.tar.bz2
Requires: sailfishsilica-qt5 >= 0.10.9
BuildRequires: pkgconfig(auroraapp)
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
%description
My first application for Aurora OS.
%prep
%autosetup
%build
%qmake5
%make_build
%install
%make_install
%files
%defattr(-,root,root,-)
%{_bindir}/%{name}
%defattr(644,root,root,-)
%{_datadir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/hicolor/*/apps/%{name}.png
QML — декларативный язык: вместо последовательности команд мы описываем дерево объектов и отношения между их свойствами. Логика оживляется выражениями на JavaScript.
import QtQuick 2.0
Rectangle {
id: box // идентификатор для обращения из других мест
width: 200
height: 100
color: "steelblue"
Text { // вложенный объект — потомок прямоугольника
text: "Привет, Аврора!"
anchors.centerIn: parent
}
}
ИмяТипа { свойство: значение; ... }.Text располагается внутри Rectangle.id — уникальное имя объекта в файле; parent — ссылка на родителя.Значение свойства может быть выражением. QML автоматически пересчитывает его, когда меняются входящие в выражение свойства:
Rectangle {
id: outer
width: 400; height: 300
Rectangle {
width: outer.width / 2 // привязка: всегда половина ширины родителя
height: outer.height
color: width > 150 ? "green" : "red" // привязка с условием
}
}
Привязка живёт, пока свойству явно не присвоят значение в императивном коде
(например, в обработчике сигнала).
Точные пиксельные координаты в мобильном UI не используются — экраны различаются. Применяются якоря (anchors) и позиционеры (Column, Row, Grid, Flow):
Column {
anchors {
left: parent.left
right: parent.right
margins: Theme.horizontalPageMargin // отступы из темы оформления
}
spacing: Theme.paddingMedium
Label { text: "Первая строка" }
Label { text: "Вторая строка" }
}
Theme — singleton-объект Silica с константами оформления: отступы (paddingSmall/Medium/Large, horizontalPageMargin), размеры шрифтов (fontSizeSmall/Medium/Large/ExtraLarge), цвета (primaryColor, secondaryColor, highlightColor). Используя Theme, приложение автоматически выглядит корректно на любом экране и в любой цветовой схеме.
Page {
// собственное свойство страницы
property real celsius: 0
// производное (вычислимое) значение — привязкой
property real fahrenheit: celsius * 9 / 5 + 32
Button {
text: "Увеличить"
onClicked: celsius = celsius + 1 // обработчик сигнала clicked
}
}
property <тип> <имя>[: значение] объявляет новое свойство; основные типы —int, real, bool, string, var.onCelsiusChanged: ...).on<ИмяСигнала>: onClicked, onTextChanged и т. д.Внутри обработчиков и привязок доступен JavaScript: функции Math.*, методы строк, условные операторы. Можно объявлять функции:
Page {
function formatResult(value) {
return isNaN(value) ? "—" : value.toFixed(2)
}
}
Для интенсивных вычислений JavaScript не подходит — на следующих занятиях перенесём логику в C++.
Минимальное приложение в стиле ОС Аврора:
// qml/MyFirstApp.qml — корневой файл
import QtQuick 2.0
import Sailfish.Silica 1.0
ApplicationWindow {
initialPage: Qt.resolvedUrl("pages/MainPage.qml")
cover: Qt.resolvedUrl("cover/DefaultCoverPage.qml")
allowedOrientations: defaultAllowedOrientations
}
// qml/pages/MainPage.qml — первая страница
import QtQuick 2.0
import Sailfish.Silica 1.0
Page {
allowedOrientations: Orientation.All
SilicaFlickable {
anchors.fill: parent
contentHeight: content.height
Column {
id: content
width: parent.width
PageHeader { title: qsTr("Моё первое приложение") }
Label {
x: Theme.horizontalPageMargin
width: parent.width - 2 * Theme.horizontalPageMargin
wrapMode: Text.WordWrap
color: Theme.highlightColor
text: qsTr("Привет, ОС Аврора!")
}
}
VerticalScrollDecorator {}
}
}
Ключевые компоненты:
ApplicationWindow — корень любого приложения Silica; initialPage задаёт первую страницу, cover — обложку приложения (её можно сделать интерактивной);Page — экран приложения; страницы складываются в стек (PageStack)PageHeader — стандартный заголовок страницы;SilicaFlickable — прокручиваемая область в стиле платформы ( поддержка выдвижных меню PullDownMenu);Label, Button, TextField, TextSwitch, Slider, ComboBox — основные элементы управления (понадобятся в практике).Замечание о функции
qsTr(): она помечает строку как переводимую. Даже если перевод не планируется, использоватьqsTr()— хорошая практика, которой следуют официальные примеры ОМП.
Только поддержку локализации нужно отдельно добавлять в .pro файле:
TARGET = ru.template.MyFirstApp
CONFIG += auroraapp
CONFIG += auroraapp_i18n # ← добавить для локализации
PKGCONFIG += auroraapp
SOURCES += src/main.cpp
TRANSLATIONS += \
translations/ru.template.MyFirstApp.ts \
translations/ru.template.MyFirstApp-ru.ts
DISTFILES += \
rpm/ru.template.MyFirstApp.spec
AURORAAPP_ICONS = 86x86 108x108 128x128 172x172
Также в .spec файл нужно добавить BuildRequires: pkgconfig(auroraapp_i18n).
Цель: освоить полный цикл работы с Аврора SDK и закрепить основы QML (свойства, привязки, обработчики сигналов, компоненты Silica) на небольшом законченном приложении.
TextField для ввода числа:
inputMethodHints: Qt.ImhFormattedNumbersOnly.ComboBox минимум с тремя вариантами:
F = C × 9/5 + 32);C = (F − 32) × 5/9);K = C + 273.15).Label) с результатом:
toFixed(2)).PullDownMenu с пунктом «Очистить», который сбрасывает поле ввода.PageHeader; отступы и размеры шрифтов только через константы Theme; контент размещён в SilicaFlickable + Column.QtQuick 2.0 и Sailfish.Silica 1.0 (системный Qt 5.6);qsTr();parseFloat(field.text); проверка корректности: isNaN(value).ComboBox текущий пункт: currentIndex; пункты описываются внутри menu: ContextMenu { MenuItem { text: ... } ... }.PullDownMenu размещается внутри SilicaFlickable.