“包文件未正确签名”错误 - 检测是否会发生Google Play应用apk

时间:2014-11-20 08:11:18

标签: android apk code-signing

我遇到以下问题中描述的错误问题:

Published Android apk gives error "Package file was not signed correctly"
Some (but not all) users receive "Package file was not signed correctly" when downloading my app from Google Play

具体来说,当某些用户尝试下载我的Google Play应用时,他们会收到错误,其他人则不会。

我的问题是:如何在提交之前检测问题是否会发生?

当我运行

时,它的价值
jarsigner -verify -verbose -certs myapk.apk

我看到如下内容:

  

86226 Sun Nov 09 10:34:54 EET 2014 META-INF / MANIFEST.MF X.509,   // [省略个人资料] [证书有效期为2014年8月20日上午8:04   到1/5/42 7:04 AM] [CertPath未经过验证:路径不与链接   任何信任锚] //如上所述的几百个条目,   然后:jar验证。

     

警告:此jar包含其证书链不是的条目   验证。这个jar包含不包含a的签名   时间戳。没有时间戳,用户可能无法验证这一点   签名者证书的到期日期(2042-01-05)或之后的jar   在任何未来的撤销日期之后。

6 个答案:

答案 0 :(得分:5)

实际上这是一个常见问题,我想你必须使用Java 7或更高版本。

<强>解决方案

运行jarsigner:

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

看看here

答案 1 :(得分:3)

实际上并不是一个测试,看看apk是否可以正常签名,但我觉得这很有用:

我刚才遇到这个问题, 我的解决方案:手工签字。
这是脚本:

#!/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 Tab)测试了它 似乎到目前为止工作。

(在Mac OSX上签名)

答案 2 :(得分:1)

cordova build android --release

在确定配置之前: 在platforms / android /中创建一个ant.properties文件,其中包含密钥库路径和别名:

key.store = /路径/到/密钥库/ release_key_name.keystore key.alias = ALIAS_NAME

您将会提示输入密码。

APK将在platforms / android / ant-build / app_name-release.apk。

创建

来源http://ilee.co.uk/Sign-Releases-with-Cordova-Android/

答案 3 :(得分:1)

  

如何在提交之前检测问题是否会发生   <或者

如果您在提交构建之前运行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

答案 4 :(得分:0)

请使用eclipse proguard并将其替换为您的proguard.cfg内容:(请注意,如果您使用的是android studio,则可以使用import将项目导入eclipse)

-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 *;
}

答案 5 :(得分:-1)

这是一个JAVA工具问题。在系统上混合JDK和JRE工具时经常会发生这种情况。您不使用Java 7中的工具。 仅使用JDK 6中的工具。

可选地,我们可以通过粘贴以下内容来停止浪费更多时间,这样我们都觉得实际上已经做了一些事情:

which jar signer

jarsigner -verify -verbose -certs yourJar.jar

请仔细阅读this了解详情