Нативное Android-приложение личного бюджета по логике Google-таблицы. Минимальный рабочий скоуп, без эмодзи, тёмная тема Material 3.
- Проект использует Gradle Wrapper (8.9) — файлы
gradlew,gradlew.bat,gradle/wrapper/*обязательны, версия закреплена и совместима с AGP 8.5.2 (системный Gradle 9.x НЕ подходит). local.propertiesв git/архив не входит (машино-зависимый): Android Studio создаёт его сам при первом открытии/синхронизации проекта. Вручную:sdk.dir=C\:\\Users\\<имя>\\AppData\\Local\\Android\\Sdk(двойные бэкслеши), либо переменная окруженияANDROID_HOME.- Сборка из терминала:
gradlew.bat assembleDebug(Windows) /./gradlew assembleDebug(Linux/macOS).
- Экран «Сегодня»: дельта (свободные деньги накопительно), конверты месяца (доступно / потрачено / перенос далее), бюджет на день, последние операции.
- Экран «Бюджет»: конвертный бюджет по категориям (план-факт), тап по категории — изменение плана месяца.
- Добавление операции (кнопка «+»): сумма → тип (расход/доход) → категория → дата → заметка. Тап по операции в списке — редактирование/удаление.
- Навигация по месяцам со стрелок у заголовка.
- Экспорт в Excel: кнопка со стрелкой вниз в шапке — все операции выгружаются
в .xlsx в папку «Загрузки» (Дата / Тип / Категория / Сумма / Заметка).
Без Apache POI — собственный минимальный OOXML-генератор
export/XlsxWriter.kt(перенесён из TheSleepTracker). На Android 10+ запись через MediaStore без разрешений. - Самообновление через GitHub: при запуске и по кнопке в шапке приложение проверяет
version.jsonв репозитории, скачивает APK системным DownloadManager и открывает установщик (с обработкой разрешения «неизвестные источники» на Android 8+). Механизм перенесён из TheSleepTracker (модулиupdate/UpdateChecker.kt,update/ApkDownloader.kt).
available(m) = plan(m) + carryIn(m) // доступно = план + перенос с прошлого месяца
left(m) = available(m) − spent(m) // остаток; уходит в следующий месяц (со знаком)
carryIn(m) = left(m−1) // перерасход уменьшает следующий месяц
delta(m) = income(m) − expense(m) // накопительно за год с переносом
Планы по умолчанию (аренда 4000, продукты 10000, кофе 1000 и т.д.) засеиваются при первом запуске на месяцы с текущего до конца года.
- Android Studio Koala (2024.1.1) или новее
- JDK 17 (входит в поставку Android Studio)
- minSdk 26 (Android 8.0), target/compile SDK 34
- Открыть папку
BudgetAppв Android Studio: File → Open. - Дождаться Gradle Sync (Gradle 8.9 скачается сам по
gradle-wrapper.properties; если Studio спросит про недостающий wrapper — согласиться на исправление, либо выполнить в терминалеgradle wrapper --gradle-version 8.9). - Run ▶ на эмуляторе или устройстве.
CLI: ./gradlew assembleDebug → app/build/outputs/apk/debug/app-debug.apk.
| Слой | Решение |
|---|---|
| UI | Jetpack Compose + Material 3 (тёмная тема, dynamic color не используется) |
| Архитектура | MVVM: AppViewModel + StateFlow<AppState> |
| БД | Room (таблицы transactions, plans), KSP |
| Расчёты | BudgetEngine — чистый Kotlin без Android-зависимостей (тестируется юнит-тестами) |
| Экспорт | XlsxWriter — .xlsx без внешних зависимостей; запись в Downloads через MediaStore |
| Обновления | version.json в репозитории + DownloadManager + FileProvider |
Приложение обновляет само себя с GitHub. Ссылки заданы в app/build.gradle.kts
(VERSION_URL, APK_URL) — сейчас указывают на maks-march/BudgetApp, поправьте под свой репозиторий.
- Поднять
versionCode(на 1) иversionNameвapp/build.gradle.kts. - Собрать:
./gradlew assembleRelease→app/build/outputs/apk/release/app-release.apk. - Положить APK в репозиторий как
apk/Budget.apk(заменить файл). - Обновить
version.jsonв корне репозитория:{ "versionCode": <тот же, что в gradle>, "versionName": "...", "notes": "что нового" }. - Закоммитить и запушить — у всех установленных приложений при следующем запуске появится диалог «Доступна версия …».
Почему это работает (уроки TheSleepTracker из ОБНОВЛЕНИЕ.md):
- подпись: debug и release подписаны одним постоянным ключом
keystore/budget.jks(пароль по умолчаниюbudgetapp, выносится вkeystore.properties) — иначе обновление не встанет поверх (INSTALL_FAILED_UPDATE_INCOMPATIBLE); versionCodeвversion.jsonдолжен быть строго больше установленного, сравнение4 > 4= «обновлений нет»;- на Android 8+ один раз нужно разрешить «Установка неизвестных приложений» — приложение само открывает нужный экран настроек.
app/src/main/java/ru/budget/app/
├── MainActivity.kt — точка входа
├── data/
│ ├── Model.kt — категории (справочник) и группы потоков
│ └── Db.kt — Room: сущности, DAO, база
├── domain/
│ └── BudgetEngine.kt — конверты, переносы, дельта, итоги месяца
├── export/
│ ├── XlsxWriter.kt — минимальный генератор .xlsx без зависимостей
│ └── BudgetExporter.kt — выгрузка операций в «Загрузки» (MediaStore)
├── update/
│ ├── UpdateChecker.kt — проверка version.json в репозитории
│ └── ApkDownloader.kt — DownloadManager + установщик + разрешения
└── ui/
├── Theme.kt — цвета и тема
├── Common.kt — формат денег, даты, GroupDot
├── AppViewModel.kt — состояние + действия (+ экспорт)
├── AppRoot.kt — scaffold, шапка (экспорт/обновления), диалоги
├── TodayScreen.kt — дашборд
├── BudgetScreen.kt — план-факт + диалог плана
└── AddSheet.kt — шторка добавления/редактирования
- Накопления: счета, переносы «в накопления», цели 10/20% от дохода.
- Калькулятор распределения дохода (50/30/20 и свои проценты).
- Кастомные категории (сейчас — фиксированный справочник).
- Копирование плана месяца на весь год.
- Второй лист в экспорте: сводка конвертов по месяцам (как лист 1 таблицы).
- Импорт из CSV/JSON, синхронизация с Google Sheets.
- Юнит-тесты
BudgetEngine(формулы переносов — ключевой сценарий).