【发布时间】:2014-06-07 02:14:32
【问题描述】:
我知道有很多其他人在忘记签署他们的 apk 时遇到 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误。这不是我要描述的问题。我将分几个步骤详细说明我在做什么。
我有一个 zipaligned、签名的 apk 文件 (AndroidWorld.apk)。我可以安装这个没问题。到目前为止,一切顺利。
接下来,我使用 apktool 对 apk 进行反编译。此外,到目前为止一切顺利。
之后,我使用 asmdex 修改 classes.dex 文件并注入一些方法日志记录。此时,如果我要重新打包 apk 并尝试安装,它肯定会失败,因为 classes.dex 的签名不再匹配签名清单中的内容。我意识到这一点。所以我重新打包 apk,压缩对齐,然后用我自己的密钥库对其进行签名:
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore "android_new_sample.keystore" -storepass mypass "C:\apk\AndroidWorld-release.apk" asample
Signing with keystore android_sample.keystore alias asample
adding: META-INF/MANIFEST.MF
adding: META-INF/ASAMPLE.SF
adding: META-INF/ASAMPLE.RSA
signing: assets/x.js
signing: assets/x.css
signing: assets/special_offers.html
signing: res/layout/displayjourneylist.xml
signing: res/layout/journey_row.xml
signing: res/layout/login.xml
signing: res/layout/searchjourney.xml
signing: res/layout/settings.xml
signing: res/layout/webview.xml
signing: res/layout/window_title.xml
signing: res/menu/option_menu.xml
signing: AndroidManifest.xml
signing: resources.arsc
signing: res/drawable-hdpi/header.png
signing: res/drawable-hdpi/ic_launcher.png
signing: res/drawable-ldpi/header.png
signing: res/drawable-ldpi/ic_launcher.png
signing: res/drawable-mdpi/header.png
signing: res/drawable-mdpi/ic_launcher.png
signing: classes.dex
signing: assets/x-runtime.properties
1 file(s) copied.
那里没有抱怨,对吧?看起来 classes.dex 已经签名并且没有抱怨。但是现在,如果我用 jarsigner -verify 检查签名的 apk 的完整性,那就不高兴了:
jarsigner.exe -verify -verbose -certs C:\apk\AndroidWorld-release-signed.apk
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex
我已确保卸载设备上的现有应用程序,但尝试安装此 apk 仍然会给我 INSTALL_PARSE_FAILED_NO_CERTIFICATES 消息。我已经用 Java JDK 1.6 和 1.7 尝试过这个,因为我知道这些版本之间的 jarsigner 有一些变化(http://developer.android.com/tools/publishing/app-signing.html)。如您所见,我在签名时指定了 sigalg 和 digestalg 标志。
另一个奇怪的怪癖 - 如果我使用调试密钥库,所有这些都可以正常工作。
【问题讨论】:
标签: java android jar-signing android-keystore