2011-03-31 45 views
19

我一直试图使用jarsigner.exe和adb.exe手动签署一个android包并将其安装在API V8仿真器上。我创建了一个简单的HelloAndroid项目,它将使用位于用户的.android目录下的debug.keystore生成签名的HelloAndroid.apk。从Eclipse启动时,它会在模拟器上构建并安装apk,而不会出现问题。试图用jarsigner.exe手动签署android包并使用adb.exe安装

我使用android工具将未签名的应用程序包导出到单独的目录。我签署并zipAligned的包,并使用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 

结果表明罐子进行了检查,每个文件签署和清单的一部分。

我跑了zipalign -v 4 temp\HelloWorld2.apk temp\HelloWorld3.apk,没有发生错误。 然后使用adb install -r temp\HelloWorld3.apk

我见过几个相关的线程和文章,提示这些方向,但我很困惑,为什么它不能手动使用Eclipse来构建签名包。我甚至采用了Eclipse构建的软件包,并且能够使用adb.exe来安装它,所以我缩小了它的范围来签署软件包。我已经尝试了从keytool生成的密钥库,但它们并没有工作,这也是我尝试debug.keystore的原因。

我会很感激任何意见,如果他们发现我的jarsigner代码有任何问题。

回答

37

我们有这个完全相同的问题。尝试使用下面的参数值:

jarsigner ... -digestalg SHA1 -sigalg MD5withRSA ... 

顺便说一句,使用显式sigalg和digestalg似乎是强制性与JDK 7

+2

你救了我的一天!我无法在任何地方找到这些信息! – POMATu 2012-11-14 12:43:27

+0

这为我节省了一个伤害的世界。 – Tom 2012-11-22 05:56:18

+0

耶!终于找到了这个。非常感谢! – bk138 2013-02-19 19:18:49

7

要使用JDK 1.7一个必须使用这些关键字签署的apk "-sigalg MD5withRSA -digestalg SHA1 "

原因: 从JDK 7开始,默认签名算法已更改,因此您需要在签署APK时指定签名和摘要算法(-sigalg和-digestalg)。

命令:

jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile] 
[originalapk] alias_name 
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