[英]INSTALL_PARSE_FAILED_NO_CERTIFICATES from adb install; using Java 6, Android 5.0.2
I've followed the instructions here and elsewhere on creating a signed jar file and I'm still getting INSTALL_PARSE_FAILED_NO_CERTIFICATES when I try to install the signed .apk onto my LG-D415. 我已经按照这里和其他地方的说明创建了一个签名的jar文件,当我尝试将签名的.apk安装到我的LG-D415上时,我仍然得到INSTALL_PARSE_FAILED_NO_CERTIFICATES。 As noted, the signing algorithm seems to work better with Java 6. So I uninstalled all versions of Java other than that and made sure keytool and jarsigner were using Java 6. 如上所述,签名算法似乎在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 shows: 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)
Any ideas? 有任何想法吗? Any help will be appreciated. 任何帮助将不胜感激。
I found the answer. 我找到了答案。 The .apk was being signed as part of the build in adt, but with a key that didn't work. .apk是作为adt构建的一部分签署的,但是使用了一个不起作用的密钥。 For some reason the jarsigner step didn't completely replace the old signature, or show any error. 由于某种原因,jarsigner步骤没有完全替换旧签名,或显示任何错误。 So when the .apk was installed on the Android device it had a problem with the bad key. 因此,当Android设备上安装了.apk时,它会出现坏密钥问题。 The trick to finding this was to open the .apk file as a zip file before running jarsigner, and then delete the META-INF directory. 找到这个的技巧是在运行jarsigner之前将.apk文件作为zip文件打开,然后删除META-INF目录。 jarsigner then created it correctly, with the key Android creates in the .android directory. jarsigner然后使用Android在.android目录中创建的密钥正确创建它。 Once I realized this I was able to fix the problem by changing the adt command to use Android's key. 一旦我意识到这一点,我就可以通过更改adt命令来使用Android的密钥来解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.