6.4 KiB
IOMATEX Android release guide
Этот репозиторий — публичный канал обновлений Android-приложения. Клиент читает
latest.json, сравнивает build_number с установленным versionCode и
показывает обновление только при строго большем значении.
Неизменяемые правила
- Каждая новая версия обязана увеличивать
build_numberвpubspec.yaml. - Все production APK подписываются только постоянным ключом
iomatex-release. - Keystore, пароль и
android/key.propertiesникогда не добавляются в Git. - SHA-1 сертификата APK должен быть
9C:0B:AA:72:12:C0:B9:84:12:10:CB:13:0A:92:20:89:5D:D8:27:EC. latest.json, APK, SHA-256 и размер обязаны описывать один и тот же файл.- Старые release-каталоги не изменяются и не удаляются.
- Откат выполняется только новой сборкой с большим
build_number. Уменьшение номера не предложит пользователям обновление.
Контракт latest.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": "Русское описание"
}
}
Фоновое обновление
Начиная с 5.3.4+4435, direct-distribution сборка не открывает APK в
браузере. После явного нажатия пользователем кнопки обновления:
- Foreground data-sync service IOMATEX скачивает APK в фоне и показывает
постоянное системное уведомление с прогрессом. Системный
DownloadManagerне используется из-за зависания его очереди на части Android-устройств. Частичный.part-файл сохраняется; после временной сетевой ошибки сервис выполняет до трёх попыток и продолжает загрузку с помощью HTTP Range. Одновременно разрешён только один процесс загрузки обновления. - Клиент проверяет
size_bytesиsha256из manifest. - Native Android-слой проверяет package name и совпадение сертификата с установленным IOMATEX.
- Только после этих проверок кнопка
Install updateпередаёт APK системному установщику.
Проверка latest.json выполняется при запуске, каждые 15 минут во время
активной сессии и сразу после возврата приложения из фона.
Этот канал нельзя включать в будущей Google Play сборке: Play-версия
должна обновляться только через Google Play и не запрашивать
REQUEST_INSTALL_PACKAGES.
Поля build, platform, architecture, file и published_at сохраняются
для людей и обратной совместимости внешних инструментов.
Подготовка версии
-
В
IOMATEX_APP/pubspec.yamlувеличить обе части версии:version: 5.3.3+4434 -
Убедиться, что локально существуют игнорируемые Git файлы:
android/app/iomatex-release.jks android/key.properties -
Запустить анализ и тесты:
flutter analyze flutter test -
Собрать production APK:
flutter build apk --release -
Проверить сертификат APK через Android SDK
apksigner:apksigner verify --verbose --print-certs \ build/app/outputs/flutter-apk/app-release.apkSHA-1 signer должен точно совпасть с production SHA-1 из правил выше.
Публикация
-
Создать неизменяемый каталог
releases/<version>-<build>/. -
Скопировать APK с понятным именем, включающим версию и build.
-
Получить метаданные:
sha256sum releases/<version>-<build>/IOMATEX-*.apk stat -c '%s' releases/<version>-<build>/IOMATEX-*.apk -
Обновить все поля
latest.json, включая абсолютный публичныйapk_url. -
Проверить JSON:
jq . latest.json -
Commit APK и manifest вместе, затем push в
main. Manifest нельзя публиковать раньше APK: клиент сразу начнёт показывать новый release. -
После push проверить публичные ответы:
curl -fL https://git.it-screen.com/An-J/DOWNLOAD_IOMATEX_APP/raw/branch/main/latest.json curl -fIL '<apk_url из manifest>' -
Скачать 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 должен иметь минимум две независимые зашифрованные резервные копии.