Чому файли APK потрібно підписувати?
Кожна програма для Android повинна бути підписана цифровим підписом, перш ніж її можна буде встановити. Підпис має кілька цілей:
- Перевіряє особу розробника програми
- Переконується, що APK не було змінено
- Дозволяє Android зіставляти оновлення програми з оригіналом
- Необхідний для встановлення на всіх пристроях Android
Потрібен інструмент робочого столу
Для підпису APK потрібні інструменти командного рядка (JDK / Android SDK). Це неможливо зробити у веб-браузері. Щоб підписати файли .apk на комп’ютері, дотримуйтесь інструкцій нижче.
Спосіб 1. Підпишіть за допомогою apksigner (рекомендовано)
apksigner — це офіційний інструмент Google для підписання файлів APK, який входить до складу інструментів створення Android SDK.
Крок 1: Створіть сховище ключів
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
Крок 2. Підпишіть APK
apksigner sign --ks my-release-key.jks \
--ks-key-alias my-key-alias \
--out signed-app.apk unsigned-app.apk
Крок 3: Перевірте підпис
apksigner verify --verbose signed-app.apk
Спосіб 2: Підпишіть за допомогою jarsigner (Legacy)
# Sign
jarsigner -verbose -sigalg SHA256withRSA \
-digestalg SHA-256 \
-keystore my-release-key.jks \
app-unsigned.apk my-key-alias
# Verify
jarsigner -verify -verbose app-signed.apk
Крок 4: Zipalign (Важливо!)
Після підписання оптимізуйте APK за допомогою zipalign:
zipalign -v 4 signed-app.apk aligned-app.apk
Підписання налагодження (для тестування)
З метою тестування ви можете використовувати стандартне сховище ключів налагодження Android:
# Location of debug keystore:
# Linux/Mac: ~/.android/debug.keystore
# Windows: C:\Users\{USERNAME}\.android\debug.keystore
# Sign with debug key
apksigner sign --ks ~/.android/debug.keystore \
--ks-key-alias androiddebugkey \
--ks-pass pass:android \
app.apk
Порівняння засобів підписання
| Параметр | apksigner | jarsigner |
|---|---|---|
| Підпис V1 | ||
| Підпис V2 | ||
| Підпис V3 | ||
| Рекомендовано | Спадщина |
Підписант APK — запитання й відповіді
Поширені запитання щодо підпису APK, сховищ ключів і підпису коду Android
Чому порядок вирівнювання (zipalign перед apksigner) важливий на Android 11–15
Однією з найпоширеніших помилок розробників і моддерів під час підписання зміненого або об’єднаного APK є запуск zipalign після для підписання пакета або використання застарілої утиліти Java jarsigner замість Android SDK apksigner від Google. Оскільки схеми підпису APK версії 2 і версії 3 обчислюють криптографічний хеш для всього бінарного макета ZIP-архіву, зміна зсувів байтів за допомогою zipalign після підписання негайно робить блок підпису версії 2/v3 недійсним.
Починаючи з Android 11 (рівень API 30) і застосовуючи суворо до Android 14 і 15, PackageManager вимагає двох умов, які не підлягають обговоренню, для будь-якого APK, націленого на сучасні рівні SDK:
- Нестиснутий 4-байтовий resources.arsc: Зкомпільована таблиця ресурсів (resources.arsc) має зберігатися нестисненою (STORED) і вирівняна за 4-байтовою межею, щоб Android міг відобразити її в пам’яті (mmap) безпосередньо, не копіюючи в оперативну пам’ять. Завжди виконуйте підпис zipalign -p -f -v 4 input.apk aligned.apk раніше.
- Обов’язковий блок підпису v2+: Підписування APK, націленого на API 30+, за допомогою jarsigner (який записує лише підпис v1 META-INF/) призведе до того, що Android 11–15 відхилить установку за допомогою INSTALL_PARSE_FAILED_NO_CERTIFICATES. Використовуйте наведений вище інтерактивний генератор команд, щоб створити точну команду apksigner --v2-signing-enabled=true для вашого сховища ключів, або перевірте свій підписаний вихід у нашому Перевірка підпису APK.