将Android开发人员从Linux切换到Windows:工具链签名APK有所不同?

我已经在Linux和Eclipse上开发了我的Android应用程序一年了。 决定切换到Windows出于多种原因。 跳过所有的箍,现在有我的应用程序的build设,并在Windows出口罚款。 ADT接受并使用我的开发者证书 – 存储密码和密钥密码正常工作。

由此产生的应用程序安装在真实设备上的罚款,似乎签署罚款,但Android电子市场不会接受上传的应用程序更新与以下错误:

“apk必须使用与以前版本相同的证书进行签名”

回到Linux,我生成的APK可以上传罚款。 显然,工具链正在生成不同的二进制文件。 使用差异validation。

我在两个平台上使用相同版本的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 =已经改变了。 这怎么可能?

Solutions Collecting From Web of "将Android开发人员从Linux切换到Windows:工具链签名APK有所不同?"

二进制差异将无法显示。 使用jarsigner检查实际签名中的差异:

 jarsigner -verify -verbose -certs app.apk 

最可能的原因是,如果您使用-digestalg SHA1显式指定SHA1,您应该获得相同的签名(或者仅使用Java 6),那么jarsigner的默认摘要算法已经在Java 7中更改为SHA256。 Android和市场,将签名作为一个二进制的blob进行比较,实际上并不关心这个实际的证书,这就是为什么它会抱怨。 从技术上讲,如果是由同一个人(证书)签署同一个密钥,则应该认为是有效的签名。 不要让你更改摘要算法到更安全的应该被视为一个错误。

顺便说一句,我不认为ADT官方支持Ja​​va 7呢。

DUH! 我用我的版本控制犯了一个愚蠢的错误,并使用我的密钥存储的错误版本…忽略这个!