Этот бизнес-план фокусируется на создании Native-First экосистемы. Мы будем использовать Android лишь как временную «несущую частоту», выжимая из неё максимум возможностей при помощи C++ и Qt, не погружаясь в её родной стек.
Цель: Создать набор приложений, которые на 100% состоят из нативного кода (C++/QML), используя стандартные средства сборки Linux-мира (CMake). Философия: Игнорирование Dalvik/ART (виртуальной машины Android) везде, где это технически возможно. Использование Qt Android Extras / QJniObject как «хирургического инструмента» для разовых обращений к системным функциям.
| Слой | Технология | Роль |
|---|---|---|
| Интерфейс | QML (Qt 6) | Реактивный UI, жесты, анимации «стеклянного» интерфейса. |
| Логика | C++ 20 | Обработка данных, бизнес-логика, работа с сетью. |
| Сборка | CMake | Единственный инструмент управления проектом (замена Gradle для разработчика). |
| Связь с ОС | QJniObject | C++ обертка, позволяющая дергать Android API без написания .java файлов. |
| Графика | RHI (Vulkan/GLES) | Прямой рендеринг через драйвер Adreno (Freedreno-ready). |
Это фундамент. Мы используем Qt-классы для интерфейса и JNI-вызовы для доступа к телефонной книге.
- Техническая фишка: Перехват интентов звонков напрямую в C++ через
QAndroidActivityResultReceiver. - Результат: Приложение, которое выглядит как Sailfish, но звонит как Pixel.
Замена домашнего экрана Android.
- Задача: Реализовать «Active Covers». Поскольку в Android нельзя реально управлять окнами других приложений без Java, мы реализуем это для своих приложений через общую память (Shared Memory).
- Результат: Свайп слева направо открывает сетку ваших Qt-приложений.
Управление яркостью, Wi-Fi и звуком.
- Метод: Использование системных команд
dbus-send(черезQProcess) или прямых вызовов системных сервисов Android через JNI.
Чтобы Gradle не раздражал вас своим присутствием, мы настраиваем CMake-centric процесс:
- Вы работаете только с
CMakeLists.txt. - Qt Creator при сборке создает скрытую папку
android-build. - Там автоматически генерируется шаблонный манифест.
- Gradle запускается как «черный ящик» одной командой, просто чтобы упаковать ваши
.soбиблиотеки (бинарники C++) в.apk.
Вместо того чтобы писать Java-класс для получения уровня батареи, вы пишете это в C++:
// Чистый C++, никакой магии Java
int getBatteryLevel() {
QJniObject action = QJniObject::fromString("android.intent.action.BATTERY_CHANGED");
QJniObject filter = QJniObject::newInstance("android/content/IntentFilter",
"(Ljava/lang/String;)V",
action.object<jstring>());
// ... и так далее, всё внутри вашего .cpp файла
}
-
Риск: "Google требует специфический Java-код для новых разрешений Android 15".
-
Решение: Использование готовых библиотек-оберток от сообщества KDE/Nemo, которые уже упаковали этот код в C++ классы.
-
Риск: "Gradle-ошибки при сборке".
-
Решение: Использование стабильной версии NDK, зафиксированной в вашем бизнес-плане, чтобы версия Gradle никогда не менялась вручную.
Вы считаете фазу успешной, если:
- У вас есть один репозиторий, в котором нет ни одного
.javaили.ktфайла. - Вы запускаете проект на Fedora (x86) — он работает.
- Вы подключаете Pixel 5a, нажимаете "Run" в Qt Creator — и через 20 секунд у вас в руках телефон с интерфейсом Sailfish.
Ваш следующий шаг:
Давайте создадим ваш первый "Pure C++" проект. Я могу подготовить для вас CMakeLists.txt, который настроен на сборку Android APK так, чтобы вы больше никогда не вспоминали о Gradle.
Хотите шаблон проекта, где всё управление идет через CMake?