Как предотвратить ошибку «Предупреждение: сбой при подписании Android apk» при использовании adt для компиляции приложения Adobe AIR

Я использую последнюю версию AIRSDK 50.2.2.5 от Harman для компиляции привязанного APK и получаю сообщение «Внимание: сбой при подписании APK Android».

Мой файл .p12 был создан в Animate еще в 2012 году, но он всегда работал со старыми версиями Adobe AIR. Как ни странно, если я создаю новый .p12 из Animate, компиляция проходит нормально без сообщения об ошибке подписи, но полученный APK бесполезно загружать в Play Store в качестве обновления, поскольку в нем говорится, что сертификат, используемый для подпишите, что APK другой, поэтому я не могу загрузить приложение как обновление.

Итак, как мне решить проблему «неудачной подписи Android apk» при использовании моего старого сертификата .p12? Я открыл его в инструменте «Keystore Explorer», и там написано, что срок его действия истекает 17 мая 2036 г., так что времени для использования этого сертификата еще достаточно.

Единственное отличие, которое я вижу, заключается в том, что Keystore Explorer сообщает, что новый сертификат .p12, который работает (но бесполезен для обновлений приложений), имеет размер ключа 2048, тогда как старый .p12 имеет размер ключа 1024. Поскольку я заметил эту разницу, я попытался немного изучить эту тему и нашел эту статью от Adobe:

https://helpx.adobe.com/mt/x-productkb/multi/rsa1024-certificate-issue-with-adt-tool.html

В нем говорится, что «Упаковка приложения Android не удалась с сертификатами RSA-1024» на компьютерах с Java 8 и выше. Единственное решение, которое он предлагает, — это перейти на Java 7 или 6. Я пытался использовать Java 7 с adt (настроив его в adt.cfg), но затем получаю следующие сообщения:

«ВНИМАНИЕ: не удалось найти подходящее расположение Java Home для v11+ JDK.

ВНИМАНИЕ: не удалось найти подходящее расположение Java Home для v8+ JDK».

Поэтому я не могу использовать Java 7 или более раннюю версию, поскольку ADT ищет более новые версии, но я не могу использовать Java 8 или более позднюю версию, поскольку она не работает с сертификатами RSA-1024 .p12.

Я также попробовал добавить флаг <BuildLegacyAPK>true</BuildLegacyAPK> внутри блока <android>...</android>. Но затем я получаю еще одно сообщение об ошибке:

«В SDK отсутствует файл /Users/myuser/AndroidSDK/build-tools/33.0.2/lib/dx.jar»

Изучив это сообщение об ошибке, я обнаружил, что возможным решением было бы создать копии d8 и d8.jar и назвать их «dx» и «dx.jar». Но при этом появляется еще одно сообщение об ошибке:

«Ошибка инструмента dx: нет основного атрибута манифеста в /Users/myuser/AndroidSDK/build-tools/33.0.2/lib/dx.jar»

Итак, после многих потерянных часов я в тупике. Что мне следует сделать, чтобы снова иметь возможность публиковать обновления приложения с помощью моего старого сертификата? Должно быть какое-то решение, которое я не смог найти.

1 ответ

Я узнал, как решить эту проблему, поэтому публикую здесь все необходимые шаги, чтобы другие люди могли сэкономить немного времени:

  • Загрузите и установите последнюю версию Android Studio (запустите ее один раз, чтобы загрузить Android SDK) или установите только Android SDK с помощью «sdkmanager».
  • Загрузите и установите Java SE Development Kit 8u112 (найдите на странице точный текст « Java SE Development Kit 8u112 », поскольку все, что выше этого, не будет работать со старыми сертификатами)
  • Загрузите и установите Java SE Development Kit 11.0.x (также необходим для компиляции пакетов AAB с новым сертификатом; не загружайте более позднюю версию, поскольку слишком последние версии не работают с компилятором AIR)
  • Загрузите конкретную версию инструмента «pepk» , которая работает с сертификатами RSA-1024 (более новые версии не будут работать).
  • Создайте зашифрованную версию старого сертификата, а также новый сертификат загрузки RSA-2048 следующим образом (команды проверены на компьютере MacOS, но на других платформах они должны быть аналогичны; если вы используете Windows, установите JAVA_HOME и системный PATH для любой версии (8/11) команды Java, используя эти инструкции вместо «экспорта»).
      # Use Java 8 Update 112 which works with old RSA-1024 certificates
export JAVA_HOME=`/usr/libexec/java_home -v1.8.0_112`
export JAVACMD=${JAVA_HOME}/bin/java

# Encrypt the old P12 certificate to upload to Google (the last argument is the 68 byte key Google provides in the "App integrity" > "App signing" section of its Play Console)
java -jar ~/path_to_pepk/pepk.jar --keystore=OLD_CERTIFICATE.p12 --alias=1 --output=OLD_CERTIFICATE.enc --encryptionkey=XXXXXXXX

# Create a new RSA-2048 certificate to be used as the upload certificate
adt -certificate -cn "COMMON_NAME" -ou "ORGANIZATIONAL_UNIT" -o "ORGANIZATION" -c "TWO_LETTER_COUNTRY_CODE" -validityPeriod 20 2048-RSA upload_certificate.p12 NEW_PASSWORD

# Convert the new P12 certificate to PEM
keytool -export -rfc -keystore upload_certificate.p12 -alias 1 -file upload_certificate.pem
  • Загрузите оба сертификата в консоль Play, выбрав «Целостность приложения» > «Подписание приложения» > «Экспортировать и загрузить ключ из хранилища ключей Java» (или вариант с аналогичным названием). Не используйте ссылку «Загрузить инструмент PEPK» на этой странице, поскольку эта версия не будет работать с сертификатами RSA-1024. Вместо этого используйте версию, загруженную ранее. Загрузите зашифрованную версию старого ключа RSA-1024, нажав «Загрузить закрытый ключ», а также загрузите новый сертификат загрузки RSA-2048 в разделе «Загрузите сертификат ключа загрузки» ниже (хотя там написано, что это «необязательно», но это не обязательно). на самом деле НЕ является обязательным в данном случае, поскольку это также необходимо для того, чтобы можно было использовать для компиляции сертификат RSA-2048 вместо старого).

  • Наконец, добавьте это в сценарий компиляции перед вызовом ADT, чтобы Java 11 использовалась для компиляции пакета AAB (поскольку Java 8 для этого использовать нельзя).

      # Use Java 11 to create AAB packages with an RSA-2048 certificate
export JAVA_HOME=`/usr/libexec/java_home -v11`
export JAVACMD=${JAVA_HOME}/bin/java
  • Создайте пакет AAB, используя adt с-target aabаргумент и всегда использовать новый сертификат .p12 как для пакетов AAB, так и для тестовых APK (на всякий случай сохраните резервную копию старого сертификата).
Другие вопросы по тегам