从Android Studio签署apk可以工作,但为什么相同的密钥库在命令行上无法工作?

4

我的 Android 应用签名密钥是使用 Android Studio 生成的。当我尝试从 Android Studio 生成已签名的 APK 时,它可以正常工作。

然而,当我尝试使用 apksigner 工具进行签名时,相同的密钥无法工作。这是我正在使用的命令:

apksigner sign --ks mykey.jks --ks-key-alias MyAlias --out app-myapp-release.apk app-myapp-release-aligned.apk

我得到了以下错误:

java.io.IOException: Keystore was tampered with, or password was incorrect

有什么建议吗?

** 更新 ** Android Studio 版本为 2.2.3 密钥库是使用“生成已签名的 APK”对话框从 Build 菜单中生成的。


  1. 这个keystore-alias-password组合是否适用于jarsigner? jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore mykey.jks -signedjar out.apk app-myapp-release-aligned.apk MyAlias
  2. 如果您在命令行中使用--ks-pass pass:yourpassword提供密钥库密码,它是否适用于apksigner?
- Alex Klyubin
  1. 是的,它可以与jarsigner一起使用。
  2. 不,它不能。它显示错误java.io.IOException: 无法从mykey.jks获取别名为“myapp”的密钥。密码错误?
- Nagarjun
谢谢!你介意发布使用Android Studio(哪个版本?)生成密钥库的步骤,以便密钥库无法与apksigner一起使用吗?我怀疑问题可能出现在密码中使用的某些字符上,但我自己还没有能够复制这个问题。 - Alex Klyubin
我已经更新了我的帖子并提供了相关信息。我使用“生成签名的APK对话框”来生成密钥库。然而,密码不包含任何空格,因为它们可以与jarsigner正常工作。顺便说一句,我是手动输入密码而不是复制粘贴。 - Nagarjun
最终我决定使用jarsigner工具,它运行良好。如果我使用jarsigner工具而不是apksigner,是否会在将来出现任何问题,因为jarsigner来自Oracle,而apksigner来自Google,实际上在Play商店上验证包。 - Nagarjun
显示剩余2条评论
2个回答

9

我刚遇到了这个问题,当我尝试签署一个apk文件时,还有许多其他问题。

尝试在签名命令中添加以下选项:

--ks-pass stdin  --key-pass stdin

现在你可以按照顺序输入您的密钥库密码和密钥(别名)密码。

1
非常感谢!您在apksigner(https://code.google.com/p/android/issues/detail?id=233426)中发现了一个错误。Nagarjun@,这个解决方法是否修复了您在apksigner和密钥库中遇到的问题? - Alex Klyubin
如果你正在修复这方面的错误,可以看一下我在这里的答案评论https://dev59.com/wFkR5IYBdhLWcg3w6ROo#41703165。似乎即使这样对于一些奇怪的字符也没有帮助。 - Nemanja Kovacevic
很高兴修复问题,但对于其中一些问题,我们尚未找到重现步骤。目前清楚的是,jarsigner对输入密码执行了一些未记录的转换(例如,不使用当前字符编码解码输入密码--请参见我在OP上的评论)。因此,如果您有重现步骤,请在https://code.google.com/p/android上提交错误报告。 - Alex Klyubin
1
回复:关于奇怪的字符,我相信我已经找到了解决方法。我现在已经提交了code.google.com/p/android/issues/detail?id=234089来跟踪这个问题,并正在努力修复/解决它。keytool/jarsigner中的这个问题也可能会解释为什么Android Plugin for Gradle / Android Studio无法使用某些密钥库并报告密码错误的类似问题。 - Alex Klyubin

0

谢谢回复。我已经尝试过那些方法了。keytool可以列出指纹,问题只出在apksigner工具上。 - Nagarjun
好的,我假设你正在使用Gradle,请查看这个链接1和这个链接2,其中有详细说明。 - Soufiane ROCHDI
不,我正在使用随Android构建工具一起提供的apksigner工具。正如我在帖子中提到的那样,它可以从Android Studio中很好地工作。但是我不想在gradle构建文件中硬编码密码或密钥库信息,因为这些文件将被检入git。 - Nagarjun
你可以在gradle构建文件中使用提示来获取密码。你可以通过**System.console()**获取密码。storePassword System.console().readLine("\nKeystore password: ") keyPassword System.console().readLIne("\nKey password: ") - Soufiane ROCHDI
谢谢您的建议。是的,那可能是我应该考虑的一个选项,另一个最好的选择是使用Alex在评论中建议的jarsigner工具(它运行良好)。 - Nagarjun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接