Инструмент apksigner
, доступный в версии 24.0.3 и более поздних версиях Android SDK Build Tools, позволяет подписывать APK и подтверждать, что подпись APK будет успешно проверена на всех версиях платформы Android, поддерживаемых этим APK.
На этой странице представлено краткое руководство по использованию этого инструмента и справочная информация по различным параметрам командной строки, которые поддерживает этот инструмент. Более полное описание того, как инструмент apksigner
используется для подписи APK-файлов, см. в разделе Подписание приложения .
Внимание: если вы подпишите APK с помощью apksigner
и внесете в него дальнейшие изменения, подпись APK станет недействительной. Если вы используете zipalign
для согласования APK, используйте его перед подписанием APK.
Использование
Подписать APK
Синтаксис подписи APK с помощью инструмента apksigner
следующий:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
Когда вы подписываете APK с помощью инструмента apksigner
, вы должны предоставить закрытый ключ и сертификат подписывающей стороны. Вы можете включить эту информацию двумя способами:
- Укажите файл хранилища ключей, используя параметр
--ks
. - Укажите файл закрытого ключа и файл сертификата отдельно, используя параметры
--key
и--cert
соответственно. Файл закрытого ключа должен использовать формат PKCS #8, а файл сертификата — формат X.509.
Обычно вы подписываете APK, используя только одного подписывающего лица. Если вам нужно подписать APK с использованием нескольких подписывающих лиц, используйте параметр --next-signer
, чтобы разделить набор общих параметров , применимых к каждому подписывающему лицу:
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
Проверьте подпись APK
Синтаксис подтверждения успешной проверки подписи APK на поддерживаемых платформах следующий:
apksigner verify [options] app-name.apk
Ротация ключей подписи
Синтаксис ротации происхождения сертификата подписи или новой последовательности подписей следующий:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
Параметры
Следующие списки включают набор параметров для каждой команды, которую поддерживает инструмент apksigner
.
Подписать команду
Команда apksigner
Signer имеет следующие параметры.
Общие параметры
Следующие параметры определяют основные настройки, которые будут применяться к подписывающему лицу:
-
--out <apk-filename>
- Место, в котором вы хотите сохранить подписанный APK. Если этот параметр не указан явно, пакет APK подписывается на месте, что перезаписывает входной файл APK.
-
--min-sdk-version <integer>
- Самый низкий уровень API платформы Android, который
apksigner
использует для подтверждения того, что подпись APK будет проверена. Более высокие значения позволяют инструменту использовать более строгие параметры безопасности при подписании приложения, но ограничивают доступность APK для устройств под управлением более поздних версий Android. По умолчаниюapksigner
использует значение атрибутаminSdkVersion
из файла манифеста приложения. -
--max-sdk-version <integer>
- Самый высокий уровень API платформы Android, который
apksigner
использует для подтверждения того, что подпись APK будет проверена. По умолчанию инструмент использует максимально возможный уровень API. -
--rotation-min-sdk-version <integer>
- Самый низкий уровень API, который должен использовать ротируемый ключ подписи APK для создания подписи APK. Исходный (неповторенный) ключ подписи APK будет использоваться для всех предыдущих версий платформы. По умолчанию с блоком подписи v3.1 используются чередующиеся ключи подписи, которые поддерживаются на устройствах под управлением Android 13 (уровень API 33) или выше.
-
--v1-signing-enabled <true | false>
- Определяет, подписывает ли
apksigner
данный пакет APK, используя традиционную схему подписи на основе JAR. По умолчанию инструмент использует значения--min-sdk-version
и--max-sdk-version
чтобы решить, когда применять эту схему подписи. -
--v2-signing-enabled <true | false>
- Определяет, подписывает ли
apksigner
данный пакет APK с помощью схемы подписи APK v2 . По умолчанию инструмент использует значения--min-sdk-version
и--max-sdk-version
чтобы решить, когда применять эту схему подписи. -
--v3-signing-enabled <true | false>
- Определяет, подписывает ли
apksigner
данный пакет APK с помощью схемы подписи APK v3 . По умолчанию инструмент использует значения--min-sdk-version
и--max-sdk-version
чтобы решить, когда применять эту схему подписи. -
--v4-signing-enabled <true | false | only>
Определяет, подписывает ли
apksigner
данный пакет APK с помощью схемы подписи APK v4 . Эта схема создает подпись в отдельном файле (apk-name .apk.idsig
). Еслиtrue
и APK не подписан, то подпись v2 или v3 генерируется на основе значений--min-sdk-version
и--max-sdk-version
. Затем команда создает файл.idsig
на основе содержимого подписанного APK.Используйте
only
для создания только подписи версии 4 без изменения APK и любых подписей, которые он имел до вызова. происходит сбойonly
в том случае, если APK еще не имеет подписи v2 или v3 или если в подписи использовался ключ, отличный от того, который предоставлен для текущего вызова.По умолчанию инструмент использует значения
--min-sdk-version
и--max-sdk-version
чтобы решить, когда применять эту схему подписи.-
-v
,--verbose
- Используйте режим подробного вывода.
Примечание. Если ваше приложение было подписано повернутым ключом подписи на устройстве под управлением Android 12L (уровень API 32) или ниже, вам необходимо использовать --rotation-min-sdk-version 28
чтобы продолжить подписывать свое приложение повернутым ключом подписи. ключ подписи для Android 9 (уровень API 28).
Опции для каждого подписывающего лица
Следующие параметры определяют конфигурацию конкретного подписывающего лица. Эти параметры не нужны, если вы подписываете свое приложение, используя только одну подписывающую сторону.
-
--next-signer <signer-options>
- Используется для указания различных общих параметров для каждого подписывающего лица.
-
--v1-signer-name <basename>
- Базовое имя файлов, составляющих подпись на основе JAR для текущего подписывающего лица. По умолчанию
apksigner
использует псевдоним ключа KeyStore или базовое имя файла ключа для этого подписывающего лица.
Варианты ключа и сертификата
Следующие параметры указывают закрытый ключ и сертификат подписывающего лица:
-
--ks <filename>
- Закрытый ключ и цепочка сертификатов подписывающего лица находятся в данном файле KeyStore на основе Java. Если для имени файла установлено значение
"NONE"
, хранилище ключей, содержащее ключ и сертификат, не требует указания файла, что имеет место для некоторых хранилищ ключей PKCS #11. -
--ks-key-alias <alias>
- Имя псевдонима, который представляет закрытый ключ подписывающего лица и данные сертификата в KeyStore. Если хранилище ключей, связанное с подписывающей стороной, содержит несколько ключей, необходимо указать этот параметр.
-
--ks-pass <input-format>
Пароль для хранилища ключей, содержащего закрытый ключ и сертификат подписывающей стороны. Вы должны предоставить пароль для открытия хранилища ключей. Инструмент
apksigner
поддерживает следующие форматы:-
pass:<password>
— пароль, указанный вместе с остальной частью командыapksigner sign
. -
env:<name>
– пароль хранится в данной переменной среды. -
file:<filename>
– пароль хранится в одной строке в данном файле. -
stdin
— пароль предоставляется в виде одной строки в стандартном потоке ввода. Это поведение по умолчанию для--ks-pass
.
Примечание. Если вы включаете несколько паролей в один файл, укажите их в отдельных строках. Инструмент
apksigner
связывает пароли с подписывающими лицами APK в зависимости от порядка, в котором вы указываете подписывающих сторон. Если вы предоставили подписывающей стороне два пароля,apksigner
интерпретирует первый пароль как пароль хранилища ключей, а второй — как пароль ключа.-
-
--pass-encoding <charset>
- Включает указанные кодировки символов, такие как
ibm437
илиutf-8
, при попытке обработки паролей, содержащих символы, отличные от ASCII.Keytool часто шифрует хранилища ключей, преобразуя пароль, используя кодировку консоли по умолчанию. По умолчанию
apksigner
пытается расшифровать пароль, используя несколько форм:- Форма Юникод
- Форма, закодированная с использованием кодировки JVM по умолчанию.
- В Java 8 и более ранних версиях форма закодирована с использованием кодировки консоли по умолчанию.
В Java 9
apksigner
не может определить кодировку консоли. Возможно, вам придется указать--pass-encoding
если используется пароль, отличный от ASCII. Вам также может потребоваться указать эту опцию с помощью KeyStores, который keytool создан в другой ОС или в другом языковом стандарте. -
--key-pass <input-format>
Пароль для закрытого ключа подписывающего лица, который необходим, если закрытый ключ защищен паролем. Инструмент
apksigner
поддерживает следующие форматы:-
pass:<password>
— пароль указывается вместе с остальной частью командыapksigner sign
. -
env:<name>
– пароль хранится в данной переменной среды. -
file:<filename>
– пароль хранится в одной строке в данном файле. -
stdin
— пароль предоставляется в виде одной строки в стандартном потоке ввода. Это поведение по умолчанию для--key-pass
.
-
-
--ks-type <algorithm>
- Тип или алгоритм, связанный с хранилищем ключей, которое содержит закрытый ключ и сертификат подписывающей стороны. По умолчанию
apksigner
использует тип, определенный как константаkeystore.type
в файле свойств безопасности. -
--ks-provider-name <name>
- Имя поставщика JCA, который будет использоваться при запросе реализации KeyStore подписывающей стороны. По умолчанию
apksigner
использует поставщика с наивысшим приоритетом. -
--ks-provider-class <class-name>
- Полное имя класса поставщика JCA, которое будет использоваться при запросе реализации KeyStore подписывающей стороны. Этот параметр служит альтернативой
--ks-provider-name
. По умолчаниюapksigner
использует провайдера, указанного в опции--ks-provider-name
. -
--ks-provider-arg <value>
- Строковое значение, передаваемое в качестве аргумента конструктору класса поставщика JCA; сам класс определяется опцией
--ks-provider-class
. По умолчаниюapksigner
использует конструктор класса без аргументов. -
--key <filename>
- Имя файла, содержащего закрытый ключ подписывающего лица. Этот файл должен использовать формат PKCS #8 DER. Если ключ защищен паролем,
apksigner
запрашивает пароль, используя стандартный ввод, если вы не укажете другой формат ввода с помощью опции--key-pass
. -
--cert <filename>
- Имя файла, содержащего цепочку сертификатов подписывающей стороны. Этот файл должен использовать формат X.509 PEM или DER.
Проверить команду
Команда apksigner
имеет следующие параметры.
-
--print-certs
- Показать информацию о сертификатах подписи APK.
-
--min-sdk-version <integer>
- Самый низкий уровень API платформы Android, который
apksigner
использует для подтверждения того, что подпись APK будет проверена. Более высокие значения позволяют инструменту использовать более строгие параметры безопасности при подписании приложения, но ограничивают доступность APK для устройств под управлением более поздних версий Android. По умолчаниюapksigner
использует значение атрибутаminSdkVersion
из файла манифеста приложения. -
--max-sdk-version <integer>
- Самый высокий уровень API платформы Android, который
apksigner
использует для подтверждения того, что подпись APK будет проверена. По умолчанию инструмент использует максимально возможный уровень API. -
-v
,--verbose
- Используйте режим подробного вывода.
-
-Werr
- Считайте предупреждения ошибками.
Примеры
Ниже приведены примеры использования apksigner
.
Подписать APK
Подпишите APK, используя release.jks
, который является единственным ключом в KeyStore:
$ apksigner sign --ks release.jks app.apk
Подпишите APK, используя закрытый ключ и сертификат, хранящиеся в отдельных файлах:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Подпишите APK, используя два ключа:
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
Подпишите APK с помощью повернутого ключа подписи и SDK для ротации версии 28+:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk \ --rotation-min-sdk-version 28
Подпишите APK с помощью повернутого ключа подписи и SDK для ротации версии 33+:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk
Проверьте подпись APK
Проверьте, будут ли подписи APK подтверждены как действительные на всех платформах Android, которые поддерживает APK:
$ apksigner verify app.apk
Проверьте, будут ли подписи APK подтверждены как действительные на Android 4.0.3 (уровень API 15) и выше:
$ apksigner verify --min-sdk-version 15 app.apk
Ротация ключей подписи
Включите линию сертификата подписи, которая поддерживает ротацию ключей:
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
Еще раз поменяйте ключи подписи:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks