【问题标题】:"Package file was not signed correctly" error -- detect whether or not it will happen with Google Play app apk“包文件未正确签名”错误 - 检测它是否会在 Google Play 应用程序 apk 中发生
【发布时间】:2015-01-18 00:33:09
【问题描述】:

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

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 11 月 9 日星期日 10:34:54 EET 2014 META-INF/MANIFEST.MF X.509, //[个人资料省略] [证书有效期为 8/20/14 8:04 AM 到 1/5/42 上午 7:04] [CertPath 未验证:路径不与 任何信任锚] // 数百个类似上面的条目, 然后:jar 验证。

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

【问题讨论】:

  • 您使用哪个 IDE?您如何构建项目?你有什么特别的图书馆吗?
  • 您确定使用了相同的密钥库和别名吗?这些用户是否也从 Playstore 或其他商店或手动下载了以前的版本?如果你有两个版本的apk,你可以比较他们的MD5,看看keystores是否有错误
  • 我的 Mac 上的 Xamarin Studio。当我通过项目菜单 > 发布发布时出现问题。当我使用 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore myKeystore myAPK keystoreAlias 登录终端时,它不会发生。但我真的很想能够测试一个签名的 apk 看看它是否好。
  • @William Jockusch,已尝试(不是 Mac,在带有 java 8 的 Windows 7 上)通过终端使用您的 SHA1withRSA - 没有时间戳的相同警告(在阅读您的帖子之前,我已经尝试了 MD5withRSA 时间戳警告结果)。 Google 希望 Android 开发者使用 Mac?或者,Mac 的 java 7 jarsigner 与 Win 的 java 6 是旧的相同的无警告功能?

标签: android apk code-signing


【解决方案1】:

其实这是一个常见的问题,我猜你一定是在使用 Java 7 或更高版本。

解决方案

运行jarsigner:

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

看看here

【讨论】:

  • 好的,根据输出,我怎么知道问题会不会出现?
  • 实验是最好的选择,找到有这个问题的用户,重新签名你的应用程序,让用户重新安装应用程序,检查是否有问题发生,imo 90% 的可能性不会发生,这不是一个新问题。
  • 其实这是一个常见的问题 - 常见的怎么样?这是一个特定的设置吗?项目?虚拟机? IDE?建造?我已经为 Playstore 构建并发布了数百个 apk 版本,但从未遇到过此类问题……有什么一致的原因吗?
  • @TacB0sS 这对于使用 java 7 的人来说很常见。
  • 直到今天我们一直在使用 Eclipse。我们现在已经转移到强制您使用 Java 7 的 Android Studio ......所以从现在开始的每个版本都会是这样的?这没有多大意义……这会使 Studio 毫无用处。
【解决方案2】:

实际上并不是测试 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 上签名)

【讨论】:

  • 不是真正的问题的答案,但我奖励赏金,因为它是迄今为止最好的答案。
  • 执行上述命令后出现此错误“jarsigner:无法签署 jar:java.util.zip.ZipException:无效条目压缩大小(预期为 4021,但得到 4061 字节)”可能是什么问题??
【解决方案3】:

cordova build android --release

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

key.store=/path/to/keystore/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/

【讨论】:

    【解决方案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 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 *;
      }
      

      【讨论】:

        【解决方案6】:

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

        或者,我们可以通过粘贴以下输出来停止浪费更多时间,这样我们都觉得自己确实做了一些事情:

        which jar signer
        
        jarsigner -verify -verbose -certs yourJar.jar
        

        更多详情请转至this

        【讨论】:

        猜你喜欢
        • 2011-01-31
        • 2011-06-13
        • 2019-06-16
        • 1970-01-01
        • 2015-03-09
        • 2015-07-30
        • 2014-11-06
        • 2019-12-06
        • 2020-02-03
        相关资源
        最近更新 更多