Пакет не подписан правильно отображается для некоторых пользователей

У меня есть приложение в Google Play в течение многих лет, которое претерпело бесчисленное количество обновлений. Некоторым людям не удается установить последнее обновление (первое за последнее время), они просто получают сообщение об ошибке «Неправильно подписанный пакет».

Это работает для моих устройств Android, которые есть у меня дома. Я создаю и подписываюсь с помощью пользовательской системы сборки, которая в основном сводится к вызову ant release, за которым следует

jarsigner -verbose -keystore $(keystore) -storepass $(storepass) $(appname).apk $(alias)
zipalign -v 4 $(appname).apk $(finalname).apk

Это работало годами, не было никаких изменений в системе сборки или хранилище ключей, я не знаю, почему это перестало работать для некоторых пользователей.

Я заметил, что в документации добавлено следующее предостережение:

Начиная с JDK 7, алгоритм подписи по умолчанию [sic] изменился, требуя, чтобы вы указали подпись и алгоритмы дайджеста [sic] (-sigalg и -digestalg) при подписании APK.

Поэтому я добавил -sigalg SHA1withDSA -digestalg SHA1, который создает APK другого размера. Я могу попробовать развернуть это, но я не хочу продолжать выпускать обновления и раздражать пользователей, не зная, что я действительно что-то исправляю.

Почему это не удается только некоторым людям? Как это исправить? Достаточно ли явно указать -sigalg/-digestalg?


person EboMike    schedule 05.01.2014    source источник


Ответы (3)


Проблема такая же, как вы сказали о jdk7. Чтобы преодолеть это, есть много дискуссий по одной и той же теме

Попробуйте это, добавив

<presetdef name="signjar">
<signjar sigalg="MD5withRSA" digestalg="SHA1" />
</presetdef>

в вашем build.xml файле

Примечание

Проблема заключается в том, что после создания версии выпуска с выпуском ant apk не может быть установлен на физическом устройстве.

Это происходит только с JDK 7, с JDK 1.6.25 все в порядке!

Это влияет только на небольшой процент, потому что for jarsign jdk7 need SHA1 digest algm, but not with the default algorithms, whatever they are. Таким образом, устройство с некоторыми другими алгоритмами по умолчанию отклонит это и вызовет проблему.

Ниже приведены алгоритмы, используемые

По умолчанию jarsigner подписывает файл JAR одним из следующих способов:

DSA (Digital Signature Algorithm) with the SHA1 digest algorithm
RSA algorithm with the SHA256 digest algorithm.
EC (Elliptic Curve) cryptography algorithm with the SHA256 with ECDSA (Elliptic Curve Digital Signature Algorithm).

Подробнее об подписании jar

person Viswanath Lekshmanan    schedule 07.01.2014
comment
Спасибо Арью. Я предполагаю, что мое замешательство происходит из-за того, что я не знаю, что каждое устройство имеет свой собственный алгоритм по умолчанию - я не думал, что он будет отличаться для разных устройств. - person EboMike; 13.01.2014
comment
Да, ваш вопрос также дает мне больше знаний об этом - person Viswanath Lekshmanan; 13.01.2014

Проверьте этот ответ:

Опубликованный apk для Android выдает ошибку "Файл пакета не был подписан правильно

Проблема, похоже, связана с jdk7, поэтому ваше исправление может решить проблему (но я сам с этим не сталкивался!)

person Pedro Loureiro    schedule 07.01.2014
comment
Это указывало бы на то, что мое предполагаемое исправление в вопросе действительно исправит его. Я не понимаю, почему это влияет только на процент пользователей? - person EboMike; 07.01.2014
comment
Я полагаю, что у arju есть ответ на этот вопрос: на некоторых устройствах этот алгоритм может отсутствовать или не использоваться по умолчанию. - person Pedro Loureiro; 07.01.2014

Мы можем подписать приложение, используя eclipse. Например: - Щелкните правой кнопкой мыши свой проект в Eclipse> Выбрать инструмент Android> Экспорт подписанного пакета приложения...

Подписание APK приложения Android?

Я надеюсь, что это может помочь. Спасибо!

person Jagdish    schedule 07.01.2014