Как подписать уже скомпилированный Apk

121

Я декодировал APK с помощью apktool (поскольку исходный исходный код был утерян), поэтому я мог исправить некоторые проблемы с XML-файлами макета. Затем я восстановил его резервную копию с помощью apktool, и когда я попытался установить его на свое устройство (используя adb: adb install appname.apk), он дал мне эту ошибку:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

однако исходный apk был подписан хранилищем ключей (в среде Eclipse IDE), а этот нет, как я могу правильно подписать его с помощью исходного файла keystone вне Eclipse !?

Сварог
источник
да, весь смысл сертификатов состоит в том, чтобы помешать людям делать это ... Если у вас нет оригинального сертификата, вам придется его регенерировать
edthethird
вот именно, у меня есть исходный сертификат, но декодирование / пересборка apk удалили его.
svarog

Ответы:

286

создать ключ, используя

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

затем подпишите apk, используя:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

проверьте здесь для получения дополнительной информации

user3854546
источник
11
это должен быть ответ, 27 голосов против 3 за исходный ответ, давай!
Кайл
1
если вы сделаете это и попытаетесь установить APK, вы можете получить ошибку INSTALL_FAILED_DUPLICATE_PERMISSION. Это происходит, когда оригинальный APK не может быть перезаписан (например, система или встроенное приложение)
Couitchy
@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr Deo
14
если вы не хотите беспокоиться о создании ключа, вы можете использовать ключ отладки с помощью: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet
3
Есть ли разница между использованием jarsignerи apksigner? Один требует подписи, а затем zipaligning, а другой zipaligning, а затем подписи
Мария Инес Парнисари
73

Автоматизированный процесс:

Воспользуйтесь этим инструментом (использует новый apksigner от Google):

https://github.com/patrickfav/uber-apk-signer

Отказ от ответственности: я разработчик :)

Ручной процесс:

Шаг 1. Создайте хранилище ключей (только один раз)

Вам нужно один раз создать хранилище ключей и использовать его для подписи вашего unsignedapk. Используйте предоставленный JDK, найденный вkeytool %JAVA_HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

Шаг 2 или 4: Zipalign

zipalign который является инструментом, предоставляемым Android SDK, например, %ANDROID_HOME%/sdk/build-tools/24.0.2/является обязательным шагом оптимизации, если вы хотите загрузить apk в Play Store.

zipalign -p 4 my.apk my-aligned.apk

Примечание: при использовании старого jarsignerвам необходимо выполнить zipalign ПОСЛЕ подписания. При использовании нового apksignerметода вы делаете это ДО подписания (я знаю, что сбивает с толку). Вызов zipalign перед apksigner работает нормально, потому что apksigner сохраняет выравнивание и сжатие APK (в отличие от jarsigner).

Вы можете проверить выравнивание с помощью

zipalign -c 4 my-aligned.apk

Шаг 3. Подпишите и подтвердите

Использование инструментов сборки 24.0.2 и старше

Используйте jarsignerкоторые, как Keytool, приходит с распределением JDK найти в %JAVA_HOME%/bin/и использовать его так:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

и можно проверить с помощью

jarsigner -verify -verbose my_application.apk

Использование инструментов сборки 24.0.3 и новее

В Android 7.0 представлена ​​схема подписи APK v2, новая схема подписи приложений, которая обеспечивает более быстрое время установки приложения и дополнительную защиту от несанкционированного изменения файлов APK ( подробнее см. Здесь и здесь ). Поэтому Google реализовал собственный подписчик apk, который называетсяapksigner (да!). Файл сценария можно найти в %ANDROID_HOME%/sdk/build-tools/24.0.3/(.jar находится в /libподпапке). Используйте это так

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name

и можно проверить с помощью

apksigner verify my-app.apk

Официальную документацию можно найти здесь.

Патрик Фавр
источник
6
Спасибо за uber-apk-signer! Отличный инструмент!
cantoni
2
Для инструментов сборки 24.0.3 правильный способ вызова zipalign: zipalign -p 4 my.apk my-align.apk
kinORnirvana
Спасибо за описание! сначала попробовал uber-apk-signer, но потерпел неудачу, вероятно, потому, что в моей системе установлен openJDK вместо «официальной» java-оракулов. Поэтому я попробовал ручной способ, но тоже не смог (все та же ошибка [INSTALL_PARSE_FAILED_NO_CERTIFICATES]). Проверка с помощью uber-apk-signer дала мне дополнительное понимание signature VERIFY FAILED[...] ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]. Да, андроид 4.2.2, SHA256 там нет? идеи?
antiplex
@antiplex, пожалуйста, сообщите о проблеме в github, не ТАК
Патрик Фавр
@ for3st, вы имеете в виду, что мои проблемы могут быть не из-за моих ограниченных знаний об apk-подписи, а из-за некоторой несовместимости uber-apk-signer? но даже в этом случае ручной способ также не работает, что кажется не связанным с вашим инструментом ...
antiplex
14

Самый быстрый способ - подписаться в хранилище ключей отладки:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android

или в Windows:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android
гранула
источник
6

Вы используете jarsigner для подписи APK. Вам не нужно подписывать исходное хранилище ключей, просто создайте новое. Читайте подробности: http://developer.android.com/guide/publishing/app-signing.html.

Николай Еленков
источник
1
ссылка не работает
jayatubi
4

Для тех из вас, кто не хочет создавать файл bat для редактирования для каждого проекта или не хочет запоминать все команды, связанные с программами keytools и jarsigner, и просто хочет выполнить это за один процесс, используйте эту программу:

http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx

Я построил его, потому что мне надоел долгий процесс ввода всех файлов каждый раз.

Эта программа может сохранить вашу конфигурацию, поэтому в следующий раз, когда вы запустите ее, вам просто нужно нажать «Создать», и она обработает ее за вас. Вот и все.

Установка не требуется, он полностью переносимый и сохраняет свои конфигурации в CSV в той же папке.

Люк Олдертон
источник