我遇到以下问题中描述的错误问题:
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 在任何未来的撤销日期之后。
答案 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。
创建答案 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了解详情