Подпись
Подпись APK
Обновлено:
Каждый APK подписан ключом разработчика. Удостоверяющего центра здесь нет: Android не выясняет, кто выпустил сертификат, и разработчик вправе подписать приложение ключом, который создал сам. Зато система строго следит, чтобы все обновления были подписаны тем же ключом, что и установленная версия.
На этой странице
Схемы подписи
| Схема | Появилась | Что защищает | Где хранится |
|---|---|---|---|
| v1 (JAR) | с первых версий Android | отдельные файлы архива; служебные структуры ZIP не защищены | файлы MANIFEST.MF и .SF внутри архива |
| v2 | Android 7.0 | весь файл, включая структуру ZIP | блок подписи перед центральным каталогом ZIP |
| v3 | Android 9 | то же самое, а также история смены ключа | тот же блок |
| v3.1 | Android 13 | смену ключа, которая действует только на новых версиях системы | тот же блок |
| v4 | Android 11 | потоковую установку через adb install --incremental | отдельный файл .apk.idsig |
Подпись v4 не самостоятельна: ей обязательно нужна парная подпись v2 или v3. Устройства с Android 6.0 и более ранних версий распознают только v1, поэтому приложения, поддерживающие старые системы, подписываются сразу несколькими схемами.
Обновление с другой подписью
При установке обновления система сравнивает сертификаты новой и установленной версий. Если они совпадают — обновление устанавливается, а данные сохраняются. Если не совпадают — установщик отказывает в обновлении; при установке через adb это выглядит как ошибка INSTALL_FAILED_UPDATE_INCOMPATIBLE. Штатного способа установить такую сборку поверх имеющейся нет: остаётся удалить старую версию вместе с её данными и установить новую как отдельное приложение.
Легитимный способ сменить ключ всё же существует — ротация в схеме v3. В новую подпись встраивается цепочка, где старый сертификат удостоверяет новый, и такое обновление устанавливается как обычное.
Важно
Отсюда практический вывод. Если «новая версия», скачанная со стороннего сайта, не устанавливается из-за конфликта подписей, это повод остановиться: файл подписан не тем ключом, что установленная программа, а значит, скорее всего, собран не разработчиком.
Как посмотреть подпись
Утилита apksigner из пакета Android SDK Build Tools проверяет подпись и показывает сертификаты:
apksigner verify --print-certs -v app.apkФлаг --print-certs выводит сведения о сертификатах, -v включает подробный отчёт, в том числе о том, какими схемами файл подписан. Сравните отпечатки сертификатов установленной и новой версий: если они совпадают, конфликта подписей не будет.
Источники
- Подпись APK: схемы v1–v4source.android.com
- Схема подписи v3 и ротация ключаsource.android.com
- apksignerdeveloper.android.com