来自adb install的INSTALL_PARSE_FAILED_NO_CERTIFICATES;使用Java 6,Android 5.0.2

时间:2016-05-04 18:18:31

标签: java android install adb sign

我按照这里和其他地方的说明创建了一个签名的jar文件,当我尝试将签名的.apk安装到我的LG-D415上时,我仍然得到INSTALL_PARSE_FAILED_NO_CERTIFICATES。 如上所述,签名算法似乎在Java 6中运行得更好。因此我卸载了除此之外的所有Java版本,并确保keytool和jarsigner使用Java 6.

keytool -genkey -v -keystore debug.keystore -alias TabletClient -keyalg RSA -keysize 2048 -validity 20000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore debug.keystore Release\TabletClient.apk TabletClient
zipalign -v 4 Release\TabletClient.apk Release\TabletClientZ.apk
adb install Release\TabletClientZ.apk

adb logcat显示:

W/PackageManager(  957): android.content.pm.PackageParser$PackageParserException: Failed to collect certificates from /data/app/vmdl272628750.tmp/base.apk
W/PackageManager(  957):        at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1108)
W/PackageManager(  957):        at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1035)
W/PackageManager(  957):        at com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:11848)
W/PackageManager(  957):        at com.android.server.pm.PackageManagerService.access$2500(PackageManagerService.java:273)
W/PackageManager(  957):        at com.android.server.pm.PackageManagerService$7.run(PackageManagerService.java:9770)
W/PackageManager(  957):        at android.os.Handler.handleCallback(Handler.java:739)
W/PackageManager(  957):        at android.os.Handler.dispatchMessage(Handler.java:95)
W/PackageManager(  957):        at android.os.Looper.loop(Looper.java:135)
W/PackageManager(  957):        at android.os.HandlerThread.run(HandlerThread.java:61)
W/PackageManager(  957):        at com.android.server.ServiceThread.run(ServiceThread.java:46)
W/PackageManager(  957): Caused by: java.lang.SecurityException: Can not recognize a critical extension
W/PackageManager(  957):        at org.apache.harmony.security.utils.JarUtils.verifySignature(JarUtils.java:120)
W/PackageManager(  957):        at java.util.jar.JarVerifier.verifyCertificate(JarVerifier.java:346)
W/PackageManager(  957):        at java.util.jar.JarVerifier.readCertificates(JarVerifier.java:320)
W/PackageManager(  957):        at java.util.jar.StrictJarFile.<init>(StrictJarFile.java:68)
W/PackageManager(  957):        at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1050)

有什么想法吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到了答案。 .apk是作为adt构建的一部分签署的,但是有一个不起作用的密钥。由于某种原因,jarsigner步骤没有完全替换旧签名,或显示任何错误。因此,当Android设备上安装了.apk时,它会出现坏密钥问题。 找到这个的技巧是在运行jarsigner之前将.apk文件作为zip文件打开,然后删除META-INF目录。 jarsigner然后使用Android在.android目录中创建的密钥正确创建它。 一旦我意识到这一点,我就可以通过更改adt命令来解决问题,以使用Android的密钥。