2011-03-31 41 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