Экран умеет и обратное: собрать новую сборку, выложить её на сервер и заменить работающую серверную часть с откатом. Эти кнопки появляются только на разработческой машине.
Важно про два режима. Обычный телефон и машина разработчика видят разные экраны. На обычном телефоне панели разработчика нет вообще, а кнопка общего обновления окружения, наоборот, работает — это главный способ обновить всё разом. На машине разработчика всё наоборот: панель есть, а кнопка общего обновления заблокирована.
Эта машина — машина разработчика. Всё, что ниже написано про неё, помечено.
Возможности
- Главная карточка с ответом в одну строку: идёт проверка, есть обновление, всё свежее, проверка не удалась или статус неизвестен.
- Кнопка Install update на главной карточке — только когда обновление есть.
- Строки Latest и Installed — новая и текущая версии рядом, с номерами.
- Строка Source — откуда взялось обновление: с сервера раздачи или уже лежит готовая сборка на этом устройстве.
- Предупреждение о пересборке. Если версия та же, но сборка другая, экран всё равно предложит обновление и скажет об этом прямо.
- Прогресс установки — полоска, пока файл готовится, и кнопка в это время заблокирована.
- Раздел release notes — первые три пункта свежих изменений и кнопка открыть полный список изменений.
- Раздел versions — что стоит: версия приложения, доступная версия, версия серверной части со стрелкой к новой, если она есть, версия Codex и когда собрана серверная часть.
- Раздел environment — обновление всего окружения разом: серверной части, Codex, opencode и скиллов одной командой. На машине разработчика кнопка заблокирована, на обычном телефоне — основной путь обновления.
- Раздел backend — живость серверной части, время работы, номер процесса, счётчики, перезапуск и живой лог.
- Кнопка Restart у серверной части с пометкой «мягкий перезапуск».
- Кнопка Refresh backend log и окно лога серверной части.
- Developer-панель — только на машине разработчика: сборка APK, выкладка на сервер, сборка и замена серверной части, обновление Codex.
- Выбор режима сборки двумя чипами: debug — около 30 секунд, release — около пяти минут.
- Кнопка Publish для выкладки собранного APK и серверной части на сервер раздачи. На обычном телефоне её нет — выкладывать там нечего.
- Кнопка Replace & restart для серверной части: сначала проверка, потом замена, потом перезапуск, а при неудаче — автоматический откат.
- Кнопка Cleanup — убрать временные файлы сборки.
- Кнопка Check for updates и Update codex для Codex: с показом установленной и доступной версии.
- Окно вывода под каждой операцией с подсветкой активных строк.
- Кнопка проверки в шапке и автопроверка при каждом возврате на экран.
Технические данные
| Параметр | Значение |
|---|---|
| Итоговых состояний главной карточки | 5, перечислены ниже |
| Разделов на экране | 5, плюс панель разработчика |
| Откуда берётся манифест | сначала локальный, при отказе — с сервера раздачи |
| С чем сравнивается установленная версия | номер версии и контрольная сумма файла |
| Сколько пунктов показывается в примечании к релизу | 3 |
| Режимов сборки | 2: debug и release |
| Заявленное время сборки | debug около 30 с, release около 5 мин |
| Часовой пояс в датах сборки | Москва |
| Размер APK | около 15 МБ, это размер лежащего здесь файла |
| На этой машине стоит | 0.8.131-261011 |
| Доступно в манифесте сейчас | 0.8.107-261002-1805 |
| Файла для установки здесь нет | лежит app-release.apk, а нужен y83-ws.apk |
| Серверная часть на этой машине | 0.8.220, отвечает |
| Как определяется режим | файл-метка или переменная окружения на серверной части |
Как читать главную карточку
Заголовок и кнопка под ним говорят всё:
- Checking updates — идёт проверка, идёт читание локального и удалённого манифеста.
- New version available — есть что ставить. Показываются новая версия, установленная и источник, а под ними кнопка Install update.
- You're up to date — установленная сборка совпадает с доступным релизом. Проверять тут нечего.
- Update check failed — манифест не пришёл. Показывается текст ошибки и кнопка Retry check.
- Release status unavailable — манифест не пришёл и без ошибки, то есть неизвестно что именно. Кнопка Check again.
Кнопка Install update заменяется на Install update с пометкой «готовим», когда файл уже качается или проверяется. Повторно нажать её в этот момент нельзя.
Про две проверки вместо одной
Экран сравнивает установленную версию с доступной двумя способами, и это важно понимать.
Первая — по номеру версии. Если он больше, обновление есть.
Вторая — по контрольной сумме файла. Есть случай, когда номер тот же, а сборка другая: тот же номер версии, но APK пересобран. По одному номеру это не видно, а по контрольной сумме — видно сразу. Тогда экран всё равно предложит обновиться и добавит отдельную строку про пересборку.
Число второй проверки считается на устройстве прямо по установленному файлу, поэтому каждый раз, когда вы открываете экран, файл читается целиком.
Про откат версии на сервере
Сравнение одностороннее: экран спрашивает «больше ли номер», а не «другой ли». Поэтому если на сервере раздачи окажется более старая версия, экран честно скажет «у вас всё свежо» — он этого отката не покажет.
Так сейчас обстоит на этой машине: стоит 0.8.131, а в манифесте 0.8.107. Экран покажет «You're up to date», и это не ошибка экрана, а следствие того, что раздача отстаёт.
На обычном телефоне картина обратная: там, как правило, стоит релизная версия, а в манифесте — та же или более новая. Тогда либо приходит обновление, либо экран так же честно пишет, что всё свежо, но уже без расхождения.
Про установку
Кнопка Install никогда не ставит пакет молча. Её работа такая:
- Проверяется разрешение на установку из неизвестных источников. Если его нет, открываются настройки телефона, и просят нажать кнопку ещё раз — это ожидаемо, а не поломка.
- Если на устройстве уже лежит файл с нужным именем и его контрольная сумма совпадает с манифестом, ставится он, без повторной закачки.
- Если файла нет или сумма не совпала, файл качается и проверяется ещё раз. При несовпадении будет сказано, что это несовпадение, и установка не пойдёт.
- Дальше открывается системный установщик телефона. Приложение не ставит пакет самостоятельно — на MIUI это невозможно, да и не нужно.
Отдельно стоит знать: файл, который лежит в папке обновлений под другим именем, не используется. На этой машине там лежит app-release.apk, а манифест просит y83-ws.apk — поэтому обновление качалось бы заново.
На обычном телефоне с этим проще: там после установки в папке лежит уже тот файл, который просит манифест, и повторная закачка не нужна.
Про обновление окружения
Кнопка Update all обновляет серверную часть, Codex, opencode и скиллы одной командой установщика. Под ней — окно вывода, чтобы было видно, что происходит.
На обычном телефоне эта кнопка — главный способ обновить всё разом, и нажимается она без всяких оговорок.
На машине разработчика кнопка заблокирована: под ней прямо написано, что на таких устройствах всё обновляется через инструменты разработчика. Сделано намеренно, чтобы общий установщик не откатил версии, поставленные вручную.
То есть на этой машине обновление окружения делается не этой кнопкой, а панелью разработчика — и на обычном телефоне её нет, поэтому там других путей и не нужно.
Про перезапуск серверной части
Кнопка Restart делает мягкий перезапуск и показывает ход дела в окне вывода. Рядом — кнопка Refresh backend log и окно лога самой серверной части, чтобы видеть, что происходит у неё внутри.
Если основной способ не сработал, экран пробует поднять серверную часть сам: жёстко завершает старый процесс и запускает новый, затем проверяет, отвечает ли он. Если и это не помогло, будет написано, что запустился, но не отвечает. Это запасной путь, и на практике до него доходит редко.
Про панель разработчика
На обычном телефоне этой панели нет вообще. Если вы пользуетесь приложением не для разработки, её вы не увидите — и это нормально. Всё, что описано ниже, относится к машине разработчика.
Четыре карточки:
- APK build. Два чипа режима с подсказкой по времени, кнопка Build и окно вывода сборки.
- Release to server. Кнопка Publish: выкладывает собранный APK и серверную часть на сервер раздачи.
- Backend. Кнопки Build backend, Replace & restart и Cleanup — сборка бинаря, замена с проверкой и откатом, уборка временных файлов.
- Codex. Показ установленной и доступной версии, кнопка Check for updates и кнопка Update, которая качает бинарь и подменяет его с проверкой.
Замена серверной части устроена так: сначала новый бинарь проходит проверку, и только потом переключается рабочий, после — контрольный запрос. Если что-то пошло не так, бинарь возвращается назад. Поэтому фраза «заменил, но ничего не изменилось» — это нормальный исход, а не сбой.
Про окна вывода
Под каждой операцией есть своё окно с меткой // output и именем операции. Активные строки подсвечиваются, пока идёт работа; когда вывода ещё нет, показывается «ожидание вывода».
Это единственный способ понять, что именно делает долгая операция: сборка и выкладка идут минутами, и без окна вывода они выглядят как зависшие.
Что агент умеет
Агент может открыть этот экран через мост командой открытия экрана updates и прочитать его содержимое командой чтения интерфейса, если приложение сейчас на экране.
Но весь этот экран для агента — просто другой интерфейс к тому же самому. У него есть собственные инструменты на каждый пункт: собрать приложение или серверную часть, заменить работающую серверную часть с откатом, выложить всё на сервер, прогнать проверки качества перед тем, как сказать «готово», и прочитать лог любой операции.
Разница в том, что агент ждёт результата и сам читает вердикт, а экран показывает окно вывода и ждёт нажатия. И ещё: агент не может нажать Install — установка пакета всегда делается человеком через системный установщик.
Ограничения
- Установка требует разрешения на неизвестные источники. Без него кнопка Install откроет настройки и попросит повторить.
- Экран никогда не ставит пакет сам и не запускает установщик без вас.
- Файл для установки берётся только по имени из манифеста: лежащий рядом файл с другим именем игнорируется.
- Если контрольная сумма не совпала, установка не начнётся — это защита, а не ошибка.
- Откат версии на сервере раздачи не показывается: сравнение одностороннее, по признаку «больше ли номер».
- Панель разработчика видна только на машине разработчика, а кнопка общего обновления окружения на ней заблокирована намеренно. Режим определяет серверная часть: по файлу-метке или переменной окружения. Стоит однажды поставить метку — и экран навсегда останется в режиме разработчика, пока её не убрать.
- Из-за этого переключение режима делается не с телефона, а на серверной части. Никакой кнопки «переключить режим» на экране нет.
- Окна вывода показывают хвост: длинная операция прокручивается, но всё начало может не поместиться.
- Каждая проверка заново перечитывает установленный файл для контрольной суммы, так что на первом открытии экран заметно задерживается.
- Ошибки и итоги операций дублируются в журнал приложения, откуда их читает агент.
- Все строки на экране английские.