我一直在Linux和Eclipse上开发我的Android应用程序一年了。由于多种原因决定切换到Windows。跳过所有的篮球,现在我的App建立并在Windows中导出很好。 ADT接受并使用我的开发人员证书 - 存储密码和密钥密码正常工作。
生成的应用程序在真实设备上安装正常,并且似乎签名正常,但Android Market不接受上传应用更新,但出现以下错误:
“apk必须使用与先前版本相同的证书进行签名”
回到Linux,我生成APK并可以上传它。显然,工具链正在生成不同的二进制文件。使用差异验证
我在两个平台上使用相同版本的Java。我正在使用相同的密钥库和相同的密码导出。在运行jarsigner -verify时,我得到以下内容:
视窗:
X.509, O=VoltUp, C=US
[certificate is valid from 11/17/10 10:28 AM to 10/24/10 11:28 AM]
Linux的:
X.509, O=BatteryStorm Mobile Inc, C=US
[certificate is valid from 10/25/10 12:04 AM to 10/17/40 12:04 AM]
显然O =已经改变了。怎么会这样?
答案 0 :(得分:4)
二元差异不会显示任何内容。使用jarsigner检查实际签名的差异:
jarsigner -verify -verbose -certs app.apk
问题的原因很可能是jarsigner的默认摘要算法已在Java 7中更改为SHA256,如果使用-digestalg SHA1
明确指定SHA1,则应获得相同的签名(或者只使用Java 6) )。 Android和Market,将签名作为二进制blob进行比较,实际上并不关心实际的证书,这就是它抱怨的原因。从技术上讲,如果由同一个人(证书)使用相同的密钥签名,则应将其视为有效签名。不允许您将摘要算法更改为更安全的算法应该被视为错误。
答案 1 :(得分:0)
DUH !!!我的版本控制犯了一个愚蠢的错误,并使用了我的密钥库的错误版本...忽略这个!