ZapretKVN-android/docs/APP_UPDATER.md
loop-uh 02e1f9eecb
Some checks failed
Android CI / build (push) Has been cancelled
Обновления: сами в фоне, только изменённые части APK, без всплывающих окон
- Маршрут: при включённом VPN проверка идёт наперегонки напрямую и через
  туннель, выигрывает первый ответ; без VPN — напрямую, затем временный
  VPN-маршрут. Промежуточных «Forgejo не отвечает» больше нет, ошибка —
  только если не сработал ни один маршрут. Удачный маршрут запоминается.
- Подключённый VPN больше не перезапускается ради обновления: правило
  «запросы приложения к Forgejo — через выбранный proxy» теперь постоянное
  (RuntimeConfigOptions.standingUpdaterPackageName; без proxy пропускается).
- Дельта: центральный каталог нового APK читается по Range, совпадающие
  записи копируются из установленного APK, остальное догружается; итог
  сверяется с опубликованным SHA-256, при любом сомнении — полная загрузка
  с докачкой. 0.5.0 → 0.5.1: 3,39 МБ вместо 117,8 МБ.
- Фон: проверка при запуске и раз в сутки (JobScheduler, без новых
  зависимостей); Stable скачивается сам (по мобильной сети — если ≤ 25 МБ).
- Установка через PackageInstaller: на Android 12+ после первой установки
  самим приложением — без подтверждения; иначе тихое уведомление и баннер,
  установщик открывается только по нажатию. Всплывающий диалог убран.

Проверено: 675 юнит-тестов, lint, verify-project.sh, 32/32 UI- и
updater-тестов на эмуляторе API 37 (тихая установка — 5 с без окна).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:31:42 +03:00

2.2 KiB
Raw Permalink Blame History

app-updater

Изолированный модуль обновления APK. Он не зависит от UI, профилей, libbox или реализации VPN в app.

  • ForgejoUpdateSource.kt — HTTPS-клиент одного маршрута (Range, нейтральный User-Agent, кэш редиректа) и разбор Forgejo Releases.
  • UpdateModels.kt — release metadata, состояния (Checking, Downloading с экономией, Ready/Installing, Failure) и строгий JSON parser.
  • ZipDirectory.kt, DeltaPlan.kt — чистый разбор ZIP/APK (EOCD, центральный каталог, APK Signing Block), план повторного использования записей и склейка диапазонов; без сети и Android.
  • ApkDownloader.kt — дельта-загрузка по HTTP Range против установленного APK, полная загрузка с докачкой .part, проверка SHA-256.
  • UpdateRouter.kt — выбор маршрута (прямой / через временный VPN) без промежуточных сообщений; гонка при включённом VPN; запомненный маршрут в updater_prefs (UpdatePrefs.kt).
  • ApkUpdateVerifier.kt — package/version/minSdk/signing policy.
  • UpdateController.kt — проверка, автоскачивание (Stable), политика мобильной сети (UpdateAutoDownloadPolicy), передача установщику, cache cleanup; состояние для плашки и страницы настроек.
  • UpdateContracts.kt, UpdateVpnFallback.kt — узкие callback-контракты: установщик, уведомления, окружение (VPN/сеть/экран), VPN lease.

Реализация контрактов находится в app/src/main/java/io/github/zapretkvn/android/updates/ (AppUpdateVpnFallback, PackageInstallerUpdateInstaller, UpdateInstallReceiver, UpdateCheckJob, AndroidUpdateNotifier), потому что только product-модуль владеет VpnService, PackageInstaller, уведомлениями и JobScheduler.