什么是INSTALL_PARSE_FAILED_NO_CERTIFICATES错误?

时间:2010-05-26 14:58:59

标签: android installation apk android-install-apk

我试图通过编辑androidmanifest.xml文件来更改我的默认/主/启动(无论你怎么称呼)活动。我所做的就是更改android:name属性。然而,这完全打破了整个应用程序。当我尝试安装它失败并读取。

  

安装错误:INSTALL_PARSE_FAILED_NO_CERTIFICATES

当我试图将其改回以前的状态时,它仍然给我同样的错误......我做了什么?

34 个答案:

答案 0 :(得分:144)

我发现使用错误的签名配置时现在也会发生此错误。正如here所述,Android 7.0引入了一种新的签名方案 V2 。 V2方案对整个APK进行签名而不仅仅是JAR,就像在V1方案中所做的那样。如果您只使用V2进行签名,并尝试在7.0之前的目标上安装,那么您将收到此错误,因为JAR本身未签名且7.0之前的 PackageManager 无法检测到V2 APK签名。

要与所有目标系统兼容,请通过检查Android Studio的生成签名APK 对话框中的两个签名版本框,确保APK已使用这两种方案进行签名,如下所示:

enter image description here

如果预计只有7.0个目标,则无需包含V1签名。

答案 1 :(得分:52)

我发现这是由我的JDK版本引起的。

我遇到了'ant'这个问题,这是由于文档中提到的这个注意事项:

  

http://developer.android.com/guide/publishing/app-signing.html#signapp

     

警告:从JDK 7开始,默认签名算法已更改,要求您在签署APK时指定签名和摘要算法(-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)

我发现这里已经回答了。

How to deal with INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES without uninstallation

我只需要卸载它然后就可以了!

$ 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}" />

答案 2 :(得分:46)

您是否直接在AndroidManifest.xml文件中修改了.apk?如果是这样,那将无效。

Every Android .apk needs to be signed if it is going to be installed on a phone,即使您没有通过市场安装。通过使用开发证书进行签名,开发工具可以解决此问题,但.apk仍然已签名。

这样做的一个用途是设备可以判断.apk是否是已安装应用程序的有效升级,因为如果它是证书将是相同的。

因此,如果您对应用进行任何更改,则需要重建.apk以便正确签名。

答案 3 :(得分:16)

解决(对我来说)在keytool中使用args

-sigalg MD5withRSA -keyalg RSA -keysize 1024

并在jarsigner中使用

-sigalg MD5withRSA -digestalg SHA1

解决方案

What kind of pitfals exist for the Android APK signing?

答案 4 :(得分:16)

大多数情况下,此错误的解决方案非常简单:

  1. 卸载你的apk
  2. 清理您的Android项目
  3. 构建您的Android项目
  4. 安装/运行你的apk

答案 5 :(得分:8)

最近,我在升级到Android Studio 4.0时遇到此错误。原因是该项目在build.gradle的签名配置中禁用了V2签名。

解决方案是删除v2SigningEnabled false或将其显式设置为默认值true

android {    
    signingConfigs {
        dev {
            v2SigningEnabled true
        }
     }
}

答案 6 :(得分:5)

就我而言,我正在安装一个项目,MinimumSDK 比我的真实设备的 Android 版本大。我用了另一个设备,它解决了。

我的项目 MinSDK -> 24

我的手机安卓版 -> 21

答案 7 :(得分:5)

就我而言,我可以构建并运行发布版本,但在尝试进行调试构建时遇到INSTALL_PARSE_FAILED_NO_CERTIFICATES错误。

解决方案是删除我的debug.keystore文件并让ADT重新创建它。它显然已经过期了。

更好的长期解决方案是明确创建一个仅在一年后不会过期的debug.keystore,而不是让ADT创建它。这是命令:

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android -keyalg RSA -validity 14000

出现提示时,请输入以下值:

  • 名字和姓氏: Android Debug
  • 组织单位: Android
  • 组织名称:未知
  • 城市或地区:未知
  • 州或省:未知
  • 国家/地区代码:美国

答案 8 :(得分:5)

这是一个丑陋但快速的解决方案:使用JDK 6代替7。

在阅读Chloe的回答后,我卸载了我的JDK 7(目前不需要它)并安装了JDK 6.修复了它。一个更好的解决方案是让ant使用JDK 6(不卸载7)。也许可以更改/设置此属性:

的java.library.path

在local.properties文件中。它位于项目目录(root)中。

Android无论如何都不能与JDK 7一起使用(只有6或5),所以要使ant脚本也使用JDK 6或5可能是一个很好的解决方案。

答案 9 :(得分:4)

因为先前生成的构建和当前在v1(jar签名)和v2(完整APK签名)之间的签名版本中存在冲突,

在Generate Signed APK对话框

下修复勾选正确的签名版本

答案 10 :(得分:4)

大多数答案都是正确的。发生的其他一些原因是

►您的最小sdk小于设备的sdk。
►您的设备中的旧应用程序具有相同的软件包名称

答案 11 :(得分:3)

我也面临着同样的问题。首先,我使用V2生成了版本并将其安装在OS 5.1上运行的移动设备中,但遇到了同样的问题。但是在OS 7.0上运行的Tablet上,构建工作正常。因此,我使用V1 Jar签名生成了一个构建,并且在两个设备上都能正常工作。

结论:如果您支持android OS 7.0以下的设备。使用V1 jar签名生成构建。

答案 12 :(得分:2)

如果您尝试包含包含.jar文件的AndroidManifest.xml库,则可能会发生这种情况。

  • 如果是纯Java,请确保不将其包含在.jar导出
  • 如果它不是纯Java(意味着它是一个Android项目),那么你必须将它作为一个图书馆项目包含

答案 13 :(得分:2)

在较新的Android Studio 3.2+版本中,如果您尝试运行release安装,并且尚未定义任何签名配置,则它将显示错误提示,并且安装将失败。您需要做的是运行debug构建或正确设置签名配置(V1或V2)。

答案 14 :(得分:2)

如果添加签名配置(创建签名密钥并添加到“项目结构”>“模块”>“签名配置”),但是忘记在“项目结构”>“构建变体”中指出,则可能引发此错误。 “>”构建类型“>”签名配置“。

签名配置字段不能为空! (如下图所示)否则,您将看到

"INSTALL_PARSE_FAILED_NO_CERTIFICATES...APK signature verification failed." 
如果尝试安装release变体,则会出现

错误。 (或其他配置相同的变体)

Signing Config Example

答案 15 :(得分:1)

将环境变量JAVA_HOME设置为JDK 5或6(而不是JDK 7)修复了错误。

答案 16 :(得分:0)

对我来说简单但愚蠢的修复是安装 JRE 和 JDK。

我使用全新安装的 Android Studio 启动了一个新的 Kotlin 项目,以完成一项工作任务。我尝试为模拟手机构建默认模板,但出现给定错误。

我做了以下事情:

  • 安装了最新的 JRE 和 JDK 版本
  • 打开 CMD 并执行 java -version 以确保它已安装。它返回一条有效的版本消息。
  • 重新启动 Android Studio 并加载我的项目
  • 点击 Play 按钮安装到我的模拟设备。
  • 一切正常。

答案 17 :(得分:0)

对我来说,我忘记将新的签名配置添加到

Project Structure -> Default Config -> Signing Config

答案 18 :(得分:0)

对于在应用中心构建和分发的 Xamarin 用户,卸载可能无法解决此问题。问题可能是如果您将目标 sdk 升级到 30+,您需要将您的密钥库文件重新上传到应用中心构建配置。这将强制应用中心使用 v2 签名,这是 v30 以后的要求。完全归功于this github issue comment

答案 19 :(得分:0)

打开终端,写Clean project->回车->这个问题会在几秒内自动解决。

答案 20 :(得分:0)

我在JetBrains Rider IDE中遇到了这个问题。

完全错误

INSTALL_PARSE_FAILED_NO_CERTIFICATES:无法从/data/app/vmdl1252907876.tmp/base.apk收集证书:尝试获取空数组的长度

问题是使用JDK8的结果。切换到JDK11可以解决此问题。

enter image description here

答案 21 :(得分:0)

确保在Android Studio中将构建变体设置为调试(而不是发布)(请检查构建变体面板)。

答案 22 :(得分:0)

如果您正在使用仿真器,请尝试将其重置;如果您在移动设备上,请先卸载应用程序,然后关闭开发人员模式,然后再打开它,即可解决问题。

答案 23 :(得分:0)

首先尝试这样做:

  • 转到Gradle脚本→bulid.gradle(module:app)→然后必须更改(minSdkVersion)值。例如,如果您使用了26,则可以尝试减小该值,例如(minSdkVersion 20)
  • 然后尝试(立即同步)。

答案 24 :(得分:0)

今天向我抛出此错误,因为我有一个最小SDK为28的应用程序,并且正在使用SDK版本为23的仿真器上进行播放。通常这是不可能的(AS灰色显示为“播放”按钮),但是今天不是很多。

答案 25 :(得分:0)

还可以检查

Project Structure-> Default Config-> Signing Config

在您添加所需的所有内容之后

答案 26 :(得分:0)

我在ionic / Visual Studio Code(在设备上运行Android)上遇到了问题:

我在移动设备(设置/应用程序)上卸载了该应用程序,该错误消失并且该应用程序正在启动。

答案 27 :(得分:0)

如果您正在安装APK的未签名版本,则会发生此问题。检查您是否安装了正确的APK。

答案 28 :(得分:0)

获得此错误的另一种方法是在macOS上使用ant进行构建,并在应用的源树中使用Finder图标文件(Icon\r)。看来jarsigner无法处理文件名中的回车符号,虽然如果您-verify APK,它会声称签名有效,但它始终会生成一个不会安装的APK一个装置。具有讽刺意味的是,Google Drive Finder插件是Finder图标文件的绝佳来源。

解决方案是在fileset中使用这样的说明符排除违规文件(在APK中无用):

    <exclude name="**/Icon&#13;" />

答案 29 :(得分:0)

当我尝试在运行api v23的手机上安装针对Android N预览构建的Xamarin项目时出现此错误。解决方法是不这样做。

答案 30 :(得分:0)

我收到此错误是因为我确实发布了我的<html> <head> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> <script> $(function () { $('#contact_form1').on('sendus', function (e) { e.preventDefault(); $.ajax({ type: 'post', url: 'email.php', data: $('#contact_form1').serialize(), success: function () { alert('form was submitted'); } }); }); }); </script> </head> <body> <div class="tabs-content"> <div tab-id="1" class="tab active"> <form name="contactForm1" id='contact_form1' method="post" action=''> <div class="form-inline"> <div class="form-group col-sm-12 padd"> <input type="text" class="form-control" name="name" id="exampleInputName" placeholder="name" > </div> <div class="form-group col-sm-12 padd"> <input type="email" class="form-control" name="email" id="exampleInputEmail" placeholder="email address"> </div> <div class="form-group col-sm-12 padd"> <input type="text" class="form-control" name="telephone" placeholder="phone"> </div> <div class="form-group col-sm-12 padd"> <input type="text" class="form-control" name="Country" id="exampleInputName" placeholder="Country" > </div> <div class="form-group col-sm-12 padd"> <textarea class="form-control" name="message" rows="3" id="exampleInputMessage" placeholder="message" ></textarea> </div> </div> <div class="form-group col-xs-12 padd"> <div id='mail_success' class='success' style="display:none;">Your message has been sent successfully. </div> <div id='mail_fail' class='error' style="display:none;"> Sorry, error occured this time sending your message. </div> </div> <div class="form-group col-xs-8 padd" id="recaptcha2"></div> <div class="form-group col-sm-4 padd" id='submit'> <input type="submit" id='send_message' name="sendus" class="btn btn-lg costom-btn" value="send"> </div> </form> </div> </div> </body> </html> 失败,因为我的磁盘空间不足。

答案 31 :(得分:0)

我在Eclipse控制台中遇到此错误。事实证明,我有两个相同内容但名称不同的罐子,彼此之间存在冲突。我刚刚删除其中一个,并设法在设备上安装该应用程序。

答案 32 :(得分:0)

经过一段时间和关于这个主题的多个在线主题,我设法修复了我的项目。

它主要考虑您输入的最后一个文件(可能是图像或布局)。如果删除它们,它将会运行,您可以重新构建项目。

答案 33 :(得分:-1)

You can also just change the build variant to Debug and you should be good to goenter image description here