尝试使用jarsigner.exe手动签署android包,并使用adb.exe安装

时间:2011-03-31 19:30:52

标签: android apk jar-signing

我一直在尝试使用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代码有任何问题,我会很感激。

3 个答案:

答案 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