什么是INSTALL_PARSE_FAILED_NO_CERTIFICATES错误?
我试图通过编辑androidmanifest.xml
文件来改变我的默认/主/启动(不pipe你怎么称呼它)活动。 我所做的只是更改android:name
属性。 不过,这完全打破了整个应用程序。 当我尝试安装它失败并读取
安装错误:INSTALL_PARSE_FAILED_NO_CERTIFICATES
当我试图改变它回到以前的状态,它仍然给我同样的错误…我做了什么!?!?!
你是否直接在.apk
文件中编辑AndroidManifest.xml
? 如果是这样,那就行不通了。
每一个.apk
需要签名,如果它将被安装在手机上 ,即使你没有通过市场进行安装。 开发工具通过签署一个开发证书来工作,但是.apk
仍然是签名的。
这样做的一个用途是设备可以告诉一个.apk
是否是已安装应用程序的有效升级,因为如果是,证书将是相同的。
因此,如果您对应用程序进行了任何更改,则需要重新生成.apk
以便正确地进行签名。
我发现现在使用错误的签名configuration时也会发生这个错误。 如此处所述,Android 7.0引入了新的签名schemeV2 。 V2scheme对整个APK进行签名,而不仅仅是JAR,就像在V1scheme中所做的那样。 如果您仅使用V2进行签名,并尝试安装在7.0之前的目标上,则会出现此错误,因为JAR本身没有签名,并且7.0之前的PackageManager无法检测到V2 APK签名的存在。
要与所有目标系统兼容,请确保APK已同时在两个scheme中签名,方法是在Android Studio的“ 生成签名的APK”对话框中同时选中两个签名版本框,如下所示:
如果预计只有7.0个目标,则不需要包含V1签名。
我发现这是由我的JDK版本引起的。
我遇到了“ant”这个问题,这是由于在文档中提到的这个小心:
http://developer.android.com/guide/publishing/app-signing.html#signapp
警告:从JDK 7开始,缺省签名algorithm已经发生变化,要求您在签名APK时指定签名和摘要algorithm(-sigalg和-digestalg)。
我有JDK 7.在我的Ant日志中,我使用-v进行了详细的显示
$ ant -Dadb.device.arg=-d -v release install [signjar] Executing 'C:\Program Files\Java\jdk1.7.0_03\bin\jarsigner.exe' with arguments: [signjar] '-keystore' [signjar] 'C:\cygwin\home\Chloe\pairfinder\release.keystore' [signjar] '-signedjar' [signjar] 'C:\cygwin\home\Chloe\pairfinder\bin\PairFinder-release-unaligned.apk' [signjar] 'C:\cygwin\home\Chloe\pairfinder\bin\PairFinder-release-unsigned.apk' [signjar] 'mykey' [exec] pkg: /data/local/tmp/PairFinder-release.apk [exec] Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
我手动签署了JAR并进行了zipaligned,但它给出了一个稍微不同的错误:
$ "$JAVA_HOME"/bin/jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore release.keystore -signedjar bin/PairFinder-release-unaligned.apk bin/PairFinder-release-unsigned.apk mykey $ zipalign -v -f 4 bin/PairFinder-release-unaligned.apk bin/PairFinder-release.apk $ adb -d install -r bin/PairFinder-release.apk pkg: /data/local/tmp/PairFinder-release.apk Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] 641 KB/s (52620 bytes in 0.080s)
我在这里find答案。
如何在不卸载的情况下处理INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
我只需要卸载它,然后它的工作!
$ adb -d uninstall com.kizbit.pairfinder Success $ adb -d install -r bin/PairFinder-release.apk pkg: /data/local/tmp/PairFinder-release.apk Success 641 KB/s (52620 bytes in 0.080s)
现在我只需要修改build.xml以在签名时使用这些选项!
确定这里是:C:\ Program Files \ Java \ android-sdk \ tools \ ant \ build.xml
<signjar sigalg="MD5withRSA" digestalg="SHA1" jar="${out.packaged.file}" signedjar="${out.unaligned.file}" keystore="${key.store}" storepass="${key.store.password}" alias="${key.alias}" keypass="${key.alias.password}" verbose="${verbose}" />
解决了(对我来说)在keytool中使用的参数
-sigalg MD5withRSA -keyalg RSA -keysize 1024
并在jarsigner中使用
-sigalg MD5withRSA -digestalg SHA1
解决scheme中find
Android APK签名有什么样的秘密?
大多数情况下,这个错误的解决scheme非常简单:
- 卸载你的apk。
- 清理你的Android项目。
- build立你的android项目。
- 安装/运行你的apk
玩的开心
这是一个丑陋而快速的解决scheme:使用JDK 6而不是7。
在阅读了Chloe的回答之后,我卸载了我的JDK 7(目前不需要它)并安装了JDK 6.修复了这个问题。 一个更好的解决scheme将使ant使用JDK 6(不卸载7)。 也许可以改变/设置这个属性:
的java.library.path
在local.properties文件中。 它在项目目录(root)中。
Android无法使用JDK 7(只有6或5),所以使ant脚本也使用JDK 6或5可能是一个很好的解决scheme。
在我的情况下,我可以构build和运行发布版本,但在尝试执行debugging版本时遇到了INSTALL_PARSE_FAILED_NO_CERTIFICATES
错误。
解决scheme是删除我的debug.keystore
文件,让ADT重新创build它。 它显然过期了。
一个更好的长期解决scheme是明确创build一个不会在一年后过期的debug.keystore
,而不是让ADT创build它。 以下是执行该操作的命令:
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android -keyalg RSA -validity 14000
出现提示时,input这些值:
- 名字和姓氏: Androiddebugging
- 组织单位: Android
- 组织名称: 未知
- 城市或地点: 未知
- 州或省: 未知
- 国家代码: US
将环境variablesJAVA_HOME
为JDK 5或6(而不是JDK 7)修复了错误。
如果您尝试包含一个包含AndroidManifest.xml
文件的.jar
库,就会发生这种情况。
- 如果是纯Java,请确保不要将其包含在.jar导出中
- 如果它不是纯Java(这意味着它是一个Android项目),那么你必须把它作为一个库项目
经过一段时间和多个在线主题我设法修复我的项目。
主要是考虑到你放入的最后一个文件( 可能是图像或布局 )。如果删除它们,它就会生效,你可以重新构build你的项目。
我在Eclipse控制台中遇到了这个错误。 事实certificate,我有两个内容相同但名称不同的jar子,彼此冲突。 我刚刚删除了其中一个,并设法在设备上安装应用程序。
我得到这个错误,因为我释放了我的ant release
失败,因为我用完了磁盘空间。
当我试图在运行api v23的手机上安装一个针对Android N预览而构build的Xamarin项目时,我得到了这个错误。 解决方法是不这样做。
另一个得到这个错误的方法是在macOS上使用ant
来构build,并在应用程序的源代码树中有一个Finder图标文件( Icon\r
)。 它似乎jarsigner
无法应付回车的文件名,并且,虽然它会声称签名是有效的,如果你-verify
APK,它总是导致一个APK不会安装在设备上。 具有讽刺意味的是,Google Drive Finder插件是Finder图标文件的重要来源。
解决scheme是在文件集中使用类似这样的说明符排除违规文件(在APK中无用)
<exclude name="**/Icon " />
因为之前生成的版本和当前在v1(jar签名)和v2(full APK签名)之间的签名版本中有冲突,
在“生成签名APK”对话框中修复滴答适当的签名版本