Сообщение об ошибке подписи при загрузке новой версии APK (SHA1 не поддерживается на уровне API 8)

Я опубликовал приложение в 2010 году. Тогда я создал локальное хранилище ключей и один ключ, который я никогда не менял и использовал для всех своих (около 30) версий этого приложения, которые я опубликовал с тех пор.

У меня никогда не было проблем с этим, он всегда работал нормально, ни в те дни, когда я разрабатывал с Eclipse, ни в последние несколько лет, когда я перешел на Android Studio.

Последнюю версию я опубликовал 2016-12-23. Теперь я хотел опубликовать новый, сгенерировал подписанный APK с помощью Android Studio, загрузил его в консоль разработчика... и получил следующее сообщение об ошибке:

Загрузка не удалась. Вы загрузили APK с недействительной подписью (узнайте больше о подписи). Ошибка от apksigner: ERROR (Jar signer CERT.DSA): JAR-подпись META-INF/CERT.DSA использует дайджест-алгоритм SHA-1 и алгоритм подписи SHA-1 с DSA, который не поддерживается на уровне API 8, для которого это APK проверяется

Я пробовал эти комбинации (новых доступных) вариантов версии подписи (всегда с тем же результатом):

  • только "V1 (Подпись Jar)"
  • как «V1 (подпись Jar)», так и «V2 (полная подпись APK)»

Я использую Android Studio 2.3.3 с buildToolsVersion 25.0.0 и Gradle версии 3.3.


person Nemax    schedule 16.10.2017    source источник


Ответы (1)


Сообщение об ошибке, которое вы видите, заключается в том, что этот APK не будет установлен на Android Froyo (уровень API 8). Подпись JAR APK (META-INF/CERT.DSA) использует OID 1.2.840.10040.4.3 (SHA-1 с DSA) для указания алгоритма подписи. Этот OID поддерживается на Android в подписях JAR только из уровня API 9, но AndroidManifest.xml вашего APK указывает — через атрибут android:minSdkVersion — что APK поддерживает уровень API 8. Для DSA лучший OID алгоритма подписи для использования в подписи JAR — 1.2. 840.10040.4.1 (DSA, а не SHA-1 с DSA). Полученная криптографическая подпись точно такая же, просто этот OID поддерживается в подписях JAR всеми версиями Android. Инструменты подписи обычно не обеспечивают такого уровня контроля, но предполагается, что они выбирают рабочий OID.

Android Studio, Android Plugin для Gradle и apksigner должны создавать правильно подписанные APK, если вы не укажете пользовательские параметры. Например, ваш файл build.gradle случайно не указывает minSdkVersion 9 или выше? Или, возможно, вы выпускаете APK с помощью jarsigner, который не знает о правилах Android...

Идеи:

  • Если вы подписываете выпуск с помощью jarsigner, переключитесь на apksigner или используйте Android Studio/Android Plugin для Gradle для подписания выпуска. Например, чтобы повторно подписать APK с помощью apksigner:

    apksigner sign --ks my.keystore app.apk
    
  • Если вы подписываете релиз с помощью Android Studio/Android Plugin для Gradle, в файле build.gradle укажите тот же minSdkVersion, что и в файле AndroidManifest.xml. В качестве альтернативы, возможно, удаление minSdkVersion из файла build.gradle заставит Android Studio/Android Plugin для Android использовать minSdkVersion из AndroidManifest.xml? Я несколько сомневаюсь в этом, потому что Android Studio 2.3.3 должен использовать правильный/безопасный OID 1.2.840.10040.4.1 при подписании таких APK...

  • Измените minSdkVersion в AndroidManifest.xml на 9 или выше, если вы согласны отказаться от поддержки Froyo.

P. S. Чтобы проверить, правильно ли подписан ваш APK, и увидеть ошибки, о которых Google Play, скорее всего, сообщит во время загрузки:

apksigner verify my.apk
person Alex Klyubin    schedule 19.10.2017
comment
Спасибо за ваш подробный ответ. В моем случае применяется вариант 2, я подписываюсь с помощью AndroidStudio/Android-плагина для Gradle. Насколько я понял, Gradle автоматически переопределяет запись minSdkVersion в AndroidManifest.xml в соответствии с записью build.gradle (если вы наведете курсор на строку android:minSdkVersion в AndroidManifest.xml, когда она открыта в редакторе AndroidStudio, вы получите сообщение всплывающей подсказки, говорящее об этом). Но я всегда использовал 8 в обоих файлах и никогда не имел проблем. Я переключил его на 9 сейчас, что решило проблему. Но это означает, что мое приложение больше не поддерживает Froyo (ваш вариант 3). - person Nemax; 22.10.2017