Расковыряли, что вообще за
.mupd и как он устроен внутри.Спойлер: это тупо переименованный обычный ZIP-архив. В коде буквально так и написано: если скормить ему не зипку, прила валится с ошибкой «Файл обновления не является ZIP-архивом».
Внутри этого архива лежит папка patch, а в ней — сам бинарный дифф (кусочки изменённого кода и ресурсов).
Как прила всё это переваривает:
С сервака прилетает JSON-манифест, где расписано: с какой версии и хэша обновляемся (блок from) и что должно получиться на выходе (блок to).
Прила чекает хэш того APK, который уже стоит у вас на телефоне, втихую распаковывает .mupd, сшивает старый APK с этим патчем и собирает готовую новую версию прямо в памяти устройства.
Если хэши сошлись — всё красиво, обнова готова. А если патч оказался кривой или битый, прила просто забивает и идёт качать нормальный полный APK, как обычно.