我已经在 Linux 和 Eclipse 上开发我的 Android 应用程序一年了。出于多种原因决定切换到Windows。克服了所有障碍,现在我的应用程序可以在 Windows 中正常构建和导出。 ADT 接受并使用我的开发人员证书 - 存储密码和 key 密码工作正常。
生成的应用程序在真实设备上安装正常,并且看起来签名正常,但 Android Market 将不接受应用程序更新的上传并出现以下错误:
“apk 必须使用与之前版本相同的证书进行签名”
回到 Linux,我生成了 APK 并可以正常上传。显然,工具链正在生成不同的二进制文件。使用 diff 验证。
我在两个平台上使用相同版本的 Java。我正在使用相同的 keystore 和相同的密码进行导出。在运行 jarsigner -verify 时,我得到以下信息:
Windows :
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= 已经改变了。这怎么可能?
最佳答案
二进制差异不会显示任何内容。使用 jarsigner 检查实际签名的差异:
jarsigner -verify -verbose -certs app.apk
您的问题很可能的原因是 jarsigner 的默认摘要算法在 Java 7 中已更改为 SHA256,如果您使用 -digestalg SHA1
明确指定 SHA1,您应该获得相同的签名(或者只使用 Java 6)。 Android 和 Market 将签名作为二进制 blob 进行比较,此时真的不关心实际证书,这就是它提示的原因。从技术上讲,如果由同一个人(证书)使用相同的 key 签名,则应视为有效签名。不让您将摘要算法更改为更安全的算法应该被视为错误。
顺便说一句,我认为 ADT 还没有正式支持 Java 7。
关于android - 将 Android 开发人员从 Linux 过渡到 Windows : toolchain signes APK differently?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8115111/