android - 将 Android 开发人员从 Linux 过渡到 Windows : toolchain signes APK differently?

标签 android linux windows certificate

我已经在 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/

相关文章:

android - 如何在 Android 中调整操作栏菜单文本大小

python - BlockingIOError 异常被忽略;我应该担心吗?

linux - Net::SSH2 从 Windows 7 到 VMWare Guest CentOS 6.2 的 ssh 不使用公钥和私钥

Windows 应用程序无法访问某些网络的服务,但浏览器可以

java - Retrofit 库的 onResponse 方法的响应始终返回 null

java - 所有 Activity 中的语言都不会改变

php - 在命令行上运行 PHP 代码/脚本

linux - 为什么某些 linux 命令可以在文件列表中使用 "*"而其他命令却不能?

Python ctypes : SetWindowsHookEx callback function never called

android - React Native 中 iOS 和 Android 的 UI 层是否会发生变化?