Ошибка "Файл пакета не был подписан правильно" - обнаружит, произойдет ли это с приложением Google Play app apk

У меня возникают проблемы с ошибкой, описанной в следующих вопросах:

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


Некоторые (но не все) пользователи получают "Файл пакета не был правильно подписан" при загрузке приложения из Google Play

В частности, когда некоторые пользователи пытаются загрузить мое приложение Google Play, они получают ошибку, другие - нет.

Мой вопрос: как обнаружить перед представлением, будет ли проблема возникать или нет?

Для чего это стоит, когда я запускаю

jarsigner -verify -verbose -certs myapk.apk

Я вижу что-то вроде следующего:

86226 Вс Ноя 09 10:34:54 EET 2014 META-INF/MANIFEST.MF X.509, // [личный материал опущен] [сертификат действителен с 8/20/14 8:04 AM до 1/5/42 7:04 AM] [CertPath не подтвержден: путь не связан с любой из якоря доверия]//несколько сотен записей, как указано выше, и затем: jar verified.

Предупреждение. Эта банка содержит записи, цепочка сертификатов которых не является подтверждено. Эта банка содержит подписи, которые не включают метка времени. Без метки времени пользователи могут не проверить эту после истечения срока действия сертификата подписчика (2042-01-05) или после любой даты отзыва в будущем.

Ответ 1

На самом деле это обычная проблема, и я предполагаю, что вы должны использовать Java 7 или новее.

Решение

Запустить jarsigner:

jarsigner -verbose -verify -keystore ${KEYSTORE_PATH} ${YOU_JAR_FILE}

посмотрите здесь

Ответ 2

На самом деле не тест, чтобы проверить, подписана ли apk, но я считаю, что это полезно:

Я получил эту проблему некоторое время назад, мое решение: подписать вручную.
Вот script:

#!/bin/bash
storepass="your store pass"
keypass="your key pass"
alias="alias"
if [ $# -lt 1 ]; then
    echo "$0 <apk file>"
    exit 1;
fi

filename=$(basename "$1")
extension="${filename##*.}"
filename="${filename%.*}"


if [ $extension != "apk" ]; then
    echo "Inputfile is no apk!"
    exit 1;
fi

cp $filename.apk $filename-tmp.apk
zip -d $filename-tmp.apk "META-INF*"
rm -rf $filename-signed.apk
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $keystore -storepass $storepass -keypass $keypass $filename-tmp.apk $alias
/Developer/android-sdk-macosx/build-tools/20.0.0/zipalign -f -v 4 $filename-tmp.apk $filename-signed.apk
rm -rf $filename-tmp.apk

Вам может потребоваться обновить настройки. Я тестировал его с помощью нескольких устройств (Galaxy Note 10.5, Samsung Galaxy S3, S5, Nexus 4, вкладка Lenovo)
Кажется, работает до сих пор.

(Подпись на Mac OSX)

Ответ 3

corova build android --release

Перед тем, как настроить его: Создайте файл ant.properties в платформах/android/с помощью пути к хранилищу ключей и имени псевдонима:

key.store =/путь/к/хранилище ключей /release _key_name.keystore key.alias = имя_псевдоним

Вам будет предложено ввести пароль.

APK будет создан на платформах /android/ ant -build/app_name-release.apk.

Источник http://ilee.co.uk/Sign-Releases-with-Cordova-Android/

Ответ 4

как обнаружить перед отправкой вопрос о том, произойдет ли проблема или не

Если вы запустите jarsigner -verify -verbose -certs myapk.apk перед отправкой сборки и не получите никаких предупреждений, подобных тем, которые вы видите, проблема не будет.

Для чего стоит, OSX я избегаю этой проблемы, временно переключаясь на Java 6 только для сборки релиза:

sudo cp -R /System/Library/Java/JavaVirtualMachines/1.6.0.jdk /Library/Java/JavaVirtualMachines/1.6.0.jdk
sudo mv /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk ~/Desktop/jdk1.8.0_31.jdk
java -version   // shows java version "1.6.0_65" yay!! 

Сделайте мою сборку без сертификата и временных ошибок. Вернитесь к Java 8:

sudo mv ~/Desktop/jdk1.8.0_31.jdk /Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk

Ответ 5

пожалуйста, используйте eclipse proguard в этом отношении и замените свой контент proguard.cfg на это: (обратите внимание, что если вы используете студию Android, вы можете импортировать проект для затмения с помощью импорта)

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-dontshrink
-verbose

-injars bin/classes
-injars libs
-outjars bin/classes-processed.jar

-dontwarn org.apache.**
-dontwarn org.slf4j.**
-dontwarn org.json.*
-dontwarn org.mortbay.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.codec.binary.**
-dontwarn javax.xml.**
-dontwarn javax.management.**
-dontwarn java.lang.management.**
-dontwarn android.support.**
-dontwarn com.google.code.**
-dontwarn oauth.signpost.**
-dontwarn twitter4j.**

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.code.linkedinapi.**

-keep class javax.**  { *; }
-keep class org.**  { *; }
-keep class java.lang.management.**  { *; }

# use the keep command in that format for your third party libraries

-keepclassmembers public class com.google.code.linkedinapi.client.impl.LinkedInApiXppClient {
     public <init>(java.lang.String, java.lang.String);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

Ответ 6

Это проблема с инструментами JAVA. Это часто происходит при смешивании инструментов JDK и JRE в системе. Вы не используете инструменты Java 7. Используйте только инструменты JDK 6.

По желанию мы можем перестать тратить больше времени, вставив результат из следующего, чтобы мы оба почувствовали, что на самом деле что-то сделали:

which jar signer

jarsigner -verify -verbose -certs yourJar.jar

Прочтите это для более подробной информации