Android-приложение для инженерного ведения проектов и контроля версий аппаратных/программных состояний с автоматическим анализом сбоев с помощью ИИ (локального или облачного).
Nexus в большинстве предназначен для энтузиастов-инженеров. Приложение позволяет структурировать историю работы над техническими проектами, сохранять контрольные точки (снимки/коммиты), логировать ошибки, прикреплять фотографии плат или схем, а также использовать нейросетевого ассистента для диагностики неисправностей.
Снимок в Nexus - это аналог коммита в Git. Он фиксирует состояние проекта на определенный момент времени и содержит:
- Название и описание выполненных действий.
- Теги (например, номера контактов, задействованные шины, версии прошивки).
- Лог ошибки (если снимок фиксирует сбой).
- Фотографию аппаратной части (с возможностью просмотра в общей галерее).
- План решения от ИИ (если проводился анализ сбоя).
Для экономии токенов и ускорения работы ИИ-моделей используется алгоритм сжатия истории снимков:
- Если у проекта более 4 снимков, все старые снимки (кроме последних 3) сжимаются в лаконичный однострочный формат:
[Индекс]. Снимок: "[Название]" (Статус: Ошибка/Успешно) [Теги: ...]. - Три последних снимка передаются в ИИ в полном объеме (с детальным описанием и предыдущими планами ответов).
- Сохранение тегов в однострочном формате критически важно: это позволяет ИИ удерживать контекст по схеме распиновки и номерам компонентов, не перегружая контекстное окно лишними деталями.
При активном обсуждении проекта история сообщений может переполнить контекстное окно модели. Для решения этой проблемы в фоне работает механизм суммаризации:
- Если общая история содержит 10 и более сообщений, а несжатая активная часть - 6 и более сообщений, запускается фоновый поток для сжатия старой части диалога.
- Сообщения до определенного индекса отправляются ИИ с промптом на создание краткой выжимки на русском языке (в 2-3 предложения).
- Полученная выжимка записывается в базу данных проекта как
chatSummary. - При отправке новых запросов ИИ передается только
chatSummaryи последние 3 активных сообщения. - При этом в интерфейсе приложения для пользователя отображается полная переписка без каких-либо сокращений.
Для обхода региональных ограничений и нестабильного подключения к серверам Google API, в OkHttpClient встроен собственный DNS-резолвер:
- При обращении к хосту
generativelanguage.googleapis.comприложение выполняет UDP-запросы напрямую к DNS-серверамxbox-dns.ru(IP-адреса:111.88.96.50и111.88.96.51) через порт 53. - DNS-пакет запроса формируется вручную на байтовом уровне, а ответ парсится для получения IP-адресов A и AAAA записей.
- При возникновении ошибок или таймаутов приложение автоматически переключается на системный DNS-резолвер.
Nexus может работать полностью в офлайн-режиме:
- Поддерживается запуск локальных LLM моделей семейства Qwen (версии 1.5B и 4B) через MediaPipe LLM Inference API.
- Инференс выполняется на устройстве с использованием аппаратного ускорения (GPU или CPU в зависимости от настроек модели).
- Модели загружаются в песочницу приложения и инициализируются один раз при первом запросе, после чего остаются в памяти для быстрого ответа.
При авторизации пользователя через Firebase Authentication все данные проектов и снимков синхронизируются с облачной базой Firestore. Фотографии снимков автоматически выгружаются в Firebase Storage. При отсутствии сети приложение работает с локальной базой Room, синхронизируя изменения при восстановлении подключения.
Проект построен по архитектуре MVVM с использованием Dagger Hilt для внедрения зависимостей.
app/src/main/java/ru/mogcommunity/nexus/
|
|- data/
| |- model/ - сущности Room: Project, Snapshot, ChatMessage
| |- local/ - база данных AppDatabase, DAO-интерфейсы и LocalAiManager (управление локальным ИИ)
| |- remote/ - GeminiClient (сетевой клиент с кастомным DNS) и FirebaseManager (синхронизация с облаком)
| |- repository/ - ProjectRepository (единая точка доступа к локальным и удаленным данным)
| |- PreferenceManager.java - управление настройками приложения
|
|- di/ - модуль Hilt (DatabaseModule) для внедрения зависимостей базы данных и репозитория
|
|- viewmodel/ - ProjectViewModel (бизнес-логика проектов, чата и суммаризации), AuthViewModel (авторизация)
|
|- ui/
| |- SplashActivity, MainActivity, LoginActivity - основные экраны
| |- ProjectsFragment, GalleryFragment, SettingsFragment - вкладки интерфейса
| |- CreateProjectBottomSheet, EditProjectBottomSheet, AddSnapshotBottomSheet - диалоговые окна управления
| |- adapter/ - RecyclerView адаптеры для проектов, снимков и сообщений
| |- helper/ - утилиты разметки (MarkdownStripper, SpaceItemDecoration)
| |- view/ - GitBranchLogoView (кастомный элемент отрисовки логотипа в виде ветки Git)
- Язык: Java
- СУБД: Room (SQLite)
- Синхронизация: Firebase Auth, Cloud Firestore, Firebase Storage
- Сетевой стек: OkHttp, Gson
- ИИ-движки: Gemini API (облако), MediaPipe LLM Inference (локально)
- Загрузка изображений: Glide
- Внедрение зависимостей: Dagger Hilt
- Архитектурные компоненты: LiveData, ViewModel, Room, WorkManager
- UI: Material Design, ViewBinding, ConstraintLayout
- JDK 17
- Android SDK 35 (мин. версия API 24)
- Gradle 8.x
- Настроенный Firebase-проект (требуется файл google-services.json)
git clone <url-репозитория>
cd NexusПоместите полученный из консоли Firebase файл google-services.json в корневую директорию модуля app/ (рядом с build.gradle.kts).
Сборка debug-версии через Gradle Wrapper:
./gradlew assembleDebugУстановка полученного APK-файла на подключенное устройство или эмулятор через ADB:
adb install app/build/outputs/apk/debug/app-debug.apkЗапуск всех локальных тестов (модели, репозиторий, вспомогательные классы):
./gradlew testDebugUnitTestЗапуск UI-тестов на подключенном устройстве или эмуляторе:
./gradlew connectedAndroidTestТесты расположены в директории app/src/test/java/ru/mogcommunity/rbrproject/:
data/model/ProjectTest.java- проверка логики инициализации и обновления свойств проектов.data/model/SnapshotTest.java- тестирование состояния снимков и валидации данных.data/model/ChatMessageTest.java- проверка отправки и статусов сообщений в чате.data/repository/ProjectRepositoryTest.java- модульные тесты для репозитория с использованием Mockito (заглушки для DAO и сетевых клиентов).ui/helper/MarkdownStripperTest.java- тестирование корректности удаления Markdown-разметки из текста ответов ИИ.
Проект распространяется под лицензией MIT.