我一直在尝试使用jarsigner.exe和adb.exe手动签署一个android包并将其安装在API V8模拟器上。我创建了一个简单的HelloAndroid项目,它将使用位于用户的.android目录中的debug.keystore生成一个签名的HelloAndroid.apk。从Eclipse启动时,它会在模拟器上构建并安装apk而不会出现问题。
我使用android工具将未签名的应用程序包导出到单独的目录中。我签名并压缩了包,并使用adb来安装它但收到错误:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
我使用以下命令对其进行签名。
jarsigner -verbose -keystore c:\users\jhwong\.android\debug.keystore
-storepass android -keypass android -digestalg SHA-1 -sigalg SHA1withRSA
-sigfile CERT -signedjar temp\HelloWorld2.apk
temp\HelloWorld.unsigned.apk androiddebugkey
adding: META-INF/MANIFEST.MF
adding: META-INF/CERT.SF
adding: META-INF/CERT.RSA
signing: res/layout/main.xml
signing: AndroidManifest.xml
signing: resources.arsc
signing: res/drawable-hdpi/icon.png
signing: res/drawable-ldpi/icon.png
signing: res/drawable-mdpi/icon.png
signing: classes.dex
这没有给我任何错误,只是为了确保我跑:
jarsigner -verify -verbose temp\HelloWorld2.apk
它显示jar已经过验证,每个文件都已签名并且是清单的一部分。
我跑了zipalign -v 4 temp\HelloWorld2.apk temp\HelloWorld3.apk
,但没有出错。
然后使用adb install -r temp\HelloWorld3.apk
。
我已经看到了几个相关的线程和文章提出了这些方向,但我很困惑,为什么它不能手动使用Eclipse来构建签名包。我甚至采用了从Eclipse构建的软件包,并且能够使用adb.exe来安装它,所以我缩小了它以签署软件包。我尝试过使用keytool生成的密钥库,但是它们运行不正常,这就是我尝试使用debug.keystore的原因。
如果他们发现我的jarsigner代码有任何问题,我会很感激。
答案 0 :(得分:37)
我们遇到了同样的问题。请尝试使用以下参数值:
jarsigner ... -digestalg SHA1 -sigalg MD5withRSA ...
顺便说一下,JDK 7似乎强制使用显式sigalg和digestalg。
答案 1 :(得分:7)
要使用JDK 1.7签署apks,必须使用这些关键字"-sigalg MD5withRSA -digestalg SHA1 "
原因: 从JDK 7开始,默认的签名算法已经改变,要求您在签署APK时指定签名和摘要算法(-sigalg和-digestalg)。
命令:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile]
[originalapk] alias_name
答案 2 :(得分:0)
如果您使用的是JDK 7,请尝试
jarsigner -sigalg SHA1withRSA -digestalg SHA1
如果你得到
jarsigner error: java.security.SignatureException: private key algorithm is not compatible with signature algorithm
然后尝试
jarsigner -sigalg MD5withRSA -digestalg SHA1