diff --git a/DEVELOPERS.md b/DEVELOPERS.md new file mode 100644 index 0000000..bd19fbd --- /dev/null +++ b/DEVELOPERS.md @@ -0,0 +1,116 @@ +# IOMATEX Android release guide + +Этот репозиторий — публичный канал обновлений Android-приложения. Клиент читает +`latest.json`, сравнивает `build_number` с установленным `versionCode` и +показывает обновление только при строго большем значении. + +## Неизменяемые правила + +1. Каждая новая версия обязана увеличивать `build_number` в `pubspec.yaml`. +2. Все production APK подписываются только постоянным ключом + `iomatex-release`. +3. Keystore, пароль и `android/key.properties` никогда не добавляются в Git. +4. SHA-1 сертификата APK должен быть + `9C:0B:AA:72:12:C0:B9:84:12:10:CB:13:0A:92:20:89:5D:D8:27:EC`. +5. `latest.json`, APK, SHA-256 и размер обязаны описывать один и тот же файл. +6. Старые release-каталоги не изменяются и не удаляются. +7. Откат выполняется только новой сборкой с большим `build_number`. Уменьшение + номера не предложит пользователям обновление. + +## Контракт latest.json + +Обязательные для приложения поля: + +```json +{ + "version": "5.3.2", + "build_number": 4433, + "apk_url": "https://git.it-screen.com/.../IOMATEX.apk", + "sha256": "64 lowercase hex characters", + "size_bytes": 82910903, + "release_notes": { + "en": "English release notes", + "ru": "Русское описание" + } +} +``` + +Поля `build`, `platform`, `architecture`, `file` и `published_at` сохраняются +для людей и обратной совместимости внешних инструментов. + +## Подготовка версии + +1. В `IOMATEX_APP/pubspec.yaml` увеличить обе части версии: + + ```yaml + version: 5.3.3+4434 + ``` + +2. Убедиться, что локально существуют игнорируемые Git файлы: + + ```text + android/app/iomatex-release.jks + android/key.properties + ``` + +3. Запустить анализ и тесты: + + ```bash + flutter analyze + flutter test + ``` + +4. Собрать production APK: + + ```bash + flutter build apk --release + ``` + +5. Проверить сертификат APK через Android SDK `apksigner`: + + ```bash + apksigner verify --verbose --print-certs \ + build/app/outputs/flutter-apk/app-release.apk + ``` + + SHA-1 signer должен точно совпасть с production SHA-1 из правил выше. + +## Публикация + +1. Создать неизменяемый каталог `releases/-/`. +2. Скопировать APK с понятным именем, включающим версию и build. +3. Получить метаданные: + + ```bash + sha256sum releases/-/IOMATEX-*.apk + stat -c '%s' releases/-/IOMATEX-*.apk + ``` + +4. Обновить все поля `latest.json`, включая абсолютный публичный `apk_url`. +5. Проверить JSON: + + ```bash + jq . latest.json + ``` + +6. Commit APK и manifest вместе, затем push в `main`. Manifest нельзя + публиковать раньше APK: клиент сразу начнёт показывать новый release. +7. После push проверить публичные ответы: + + ```bash + curl -fL https://git.it-screen.com/An-J/DOWNLOAD_IOMATEX_APP/raw/branch/main/latest.json + curl -fIL '' + ``` + +8. Скачать APK по публичной ссылке, повторно проверить SHA-256 и установить на + тестовое устройство поверх предыдущей production-версии. + +## CI/CD + +Для автоматической сборки хранить keystore как protected file variable, а +пароли — как protected masked variables. Job должен восстановить +`android/app/iomatex-release.jks`, сформировать `android/key.properties`, +собрать APK, проверить signer SHA-1 и только затем публиковать release. + +Не запускайте release job из недоверенных веток или pull request. Постоянный +keystore должен иметь минимум две независимые зашифрованные резервные копии. diff --git a/README.md b/README.md index c18eaf2..314e6f0 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,40 @@ # Download IOMATEX APP -Готовые Android-сборки IOMATEX APP для установки вне Google Play. +Публичное хранилище production-сборок IOMATEX APP для Android. Скачивание APK +не требует регистрации или пароля. ## Актуальная версия -- Версия: `5.3.1+4432` +- Версия: `5.3.2+4433` - Платформа: Android -- Архитектура: `arm64-v8a` -- Назначение: современные Android-планшеты и телефоны -- APK: [скачать IOMATEX 5.3.1+4432](releases/5.3.1-4432/IOMATEX-5.3.1-4432-arm64-v8a.apk) -- SHA-256: `dfaf921ccd5d17ec8988303b59c3c762ce7761c2b69597c0118939536707f26b` +- Архитектура: universal (`arm64-v8a`, `armeabi-v7a`, `x86_64`) +- Подпись: постоянный IOMATEX production certificate +- APK: [скачать IOMATEX 5.3.2+4433](releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk) +- SHA-256: `ddfded775c87282668d412e2f5f87f18d03a893f990f29120a26ad79884f50d3` + +Прямая публичная ссылка: + +```text +https://git.it-screen.com/An-J/DOWNLOAD_IOMATEX_APP/raw/branch/main/releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk +``` Для установки разрешите Android устанавливать приложения из выбранного браузера или файлового менеджера, скачайте APK и откройте его. -`latest.json` содержит машиночитаемую информацию об актуальной сборке и может -использоваться приложением или внешним сервисом для проверки обновлений. +## Обновления в приложении -> Текущая тестовая сборка подписана ключом разработки. Перед массовым -> распространением потребуется постоянный production signing key. +Приложение проверяет публичный [`latest.json`](latest.json) при запуске. +Если `build_number` больше установленного Android `versionCode`, на иконке +Profile появляется красный badge, а на странице Profile — кнопка `Обновить`. +Кнопка открывает прямую ссылку на подписанный APK в системном браузере. + +Версия `5.3.2+4433` является первой production-сборкой с механизмом обновлений. +Переход со старой debug-подписи требует один раз удалить прежнее приложение и +установить эту APK вручную. Последующие production-версии будут обновляться +поверх неё без удаления приложения. + +## Разработчикам + +Полный контракт manifest, правила версий, подписи, публикации, проверки и +отката описаны в [DEVELOPERS.md](DEVELOPERS.md). Менять `latest.json` без +выполнения этого регламента нельзя. diff --git a/latest.json b/latest.json index b692500..ad97700 100644 --- a/latest.json +++ b/latest.json @@ -1,9 +1,18 @@ { - "version": "5.3.1", - "build": 4432, + "version": "5.3.2", + "build": 4433, + "build_number": 4433, "platform": "android", - "architecture": "arm64-v8a", - "file": "releases/5.3.1-4432/IOMATEX-5.3.1-4432-arm64-v8a.apk", - "sha256": "dfaf921ccd5d17ec8988303b59c3c762ce7761c2b69597c0118939536707f26b", - "published_at": "2026-09-30T12:32:00+02:00" + "architecture": "universal", + "file": "releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk", + "apk_url": "https://git.it-screen.com/An-J/DOWNLOAD_IOMATEX_APP/raw/branch/main/releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk", + "sha256": "ddfded775c87282668d412e2f5f87f18d03a893f990f29120a26ad79884f50d3", + "size_bytes": 82910903, + "published_at": "2026-10-02T05:31:00+02:00", + "release_notes": { + "en": "Production-signed build with Google Sign-In and automatic update notifications.", + "ru": "Production-сборка с Google Auth и автоматическими уведомлениями об обновлениях.", + "pl": "Wersja produkcyjna z logowaniem Google i automatycznymi powiadomieniami o aktualizacjach.", + "hi": "Google Sign-In और स्वचालित अपडेट सूचनाओं के साथ प्रोडक्शन बिल्ड।" + } } diff --git a/releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk b/releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk new file mode 100755 index 0000000..35ed869 Binary files /dev/null and b/releases/5.3.2-4433/IOMATEX-5.3.2-4433-universal.apk differ