什么是INSTALL_PARSE_FAILED_NO_CERTIFICATES错误?


163

我试图通过编辑androidmanifest.xml文件来更改我的default / main / startup(无论您叫什么)活动。我所做的就是改变android:name财产。但是,这完全破坏了整个应用程序。当我尝试安装时失败并读取。

安装错误:INSTALL_PARSE_FAILED_NO_CERTIFICATES

当我尝试将其更改回其先前的状态时,它仍然给我相同的错误...我做了什么?


对于其他任何人:INSTALL_PARSE_FAILED_NO_CERTIFICATES-103可以通过adb logsrc)获取/查看的错误,例如。 D/PackageInstaller(21320): Installation error code: -103

答案是正确的。还有一个导致此错误的原因是,您的手机上安装了具有相同软件包名称的旧应用程序。.在安装新的应用程序之前,请从手机上进行卸载
Emre Kilinc Arslan

1
对于任何偶然发现此问题的人-请阅读以下所有答案!似乎此错误消息更像是“某事不对劲”类型的错误。我遇到它的原因是由于答案之一,该列表下方!!!
GMc

Answers:


56

您是否AndroidManifest.xml直接在.apk文件中编辑了?如果是这样,那将行不通。

.apk即使不是要通过Market安装,每个Android都需要签名才能安装在手机上。开发工具通过使用开发证书进行签名来解决此问题,但.apk仍在签名。

这样做的一种用途是使设备可以知道an .apk对已安装的应用程序是否有效升级,因为如果是,则证书将相同。

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


非常感谢,有没有一个按钮可以自动重建清单?
mtmurdock 2010年

对于那些挣扎着挣扎的家伙,请flutter clean再次运行并运行/调试!此操作与上面的解决方案相似,因为它会清理构建文件夹并在运行/调试时再次重建构建文件!
Manoj Kumar

183

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

为了与所有目标系统兼容,请在Android Studio的“ 生成签名的APK”对话框中选中两个签名版本框,以确保使用两种方案对APK进行签名,如下所示:

在此处输入图片说明

如果仅预期7.0个目标,则无需包括V1签名。


5
你节省了我很多时间。升级Android Studio引起了噩梦。这就是其中之一。我想知道SO是否不会死于Android开发的一半以上。Android Studio没有提供有关错误的任何线索。
Atul

4
幸运的是,我先在旧设备上测试了发行版APK,然后才在Google Play上发布了该版本。如果所有<Android 7.0设备都无法安装新版本,那将是一场灾难。当您单击以创建apk版本时,具有两个版本的东西应该是一个大红色弹出对话框!
Kirill Karmazin

谢谢你 快要发疯了,为什么我的APK无法在Android 7以下版本上运行,但这只是一个简单的复选框。很烦人。
japzone

54

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

我在使用'ant'时遇到了这个问题,这是由于文档中提到的CAUTION:

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

注意:从JDK 7开始,默认的签名算法已更改,要求您在签名APK时指定签名并摘要算法(-sigalg和-digestalg)。

我有JDK7。在我的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)

我在这里找到答案。

如何在不卸载的情况下处理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}" />

3
JDK 7也是我的问题。我很懒,卸载了JDK 7并安装了JDK 6,也可以使用^^。可以同时安装其他黑客解决方案,但不太激进,但可以将JAVA_HOME设置为JDK 6,并将JDK 6的bin路径放在PATH中。
Ixx 2012年

1
JDK 8也有同样的问题。将PATH更改为JDK 6是可行的。谢谢救星!
克里斯·薛

谢谢!我的市场应用程序是使用JDK6编译的。当我使用JDK7使用发布密钥库编译应用程序并尝试安装时,它给了我这个问题。
Sileria

28

大多数时候,解决此错误的方法非常简单:

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

我做了2,3,4,并得到相同的错误。卸载APK是什么意思?通过我的设备?我认为它从未出现在我的设备上。
柯蒂斯

我突然开始无缘无故地得到这个错误,如果解决方案只是简单的清理项目就可以了,那就什么也没有。谢谢。
pgcan

18

(对我而言)在keytool中使用了args

-sigalg MD5withRSA -keyalg RSA -keysize 1024

并在jarsigner中使用

-sigalg MD5withRSA -digestalg SHA1

解决方案位于

Android APK签名存在哪些类型的pitfal?


谢谢,也为我解决了这个问题(我有JDK 7)。
Enrico Ros 2013年

我用相同的方式修复了它,因为我使用的是appcelerator Titan,并且无法访问apk生成脚本。请注意,此解决方案需要重新生成(更改!)私钥。
Federico 2014年

8

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

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


无需同时检查两者,如果支持OS 7.0和更低版本,请选择V1;如果支持在7.0和更高版本上运行的设备,请选择V2。
拉吉夫·拉詹

7

就我而言,我可以构建并运行发行版,但是得到了 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
  • 组织机构名称: 未知
  • 城市或地区: 未知
  • 州或省: 未知
  • 国家代码:美国

5

这是一个难看但快速的解决方案:使用JDK 6而不是7。

阅读Chloe的答案后,我卸载了JDK 7(无论如何现在都不需要它)并安装了JDK 6。更好的解决方案将使ant使用JDK 6(而无需卸载7)。也许可以更改/设置此属性:

java.library.path

在local.properties文件中。它在项目目录(根目录)中。

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


5

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

要在“生成签名的APK”对话框中修复刻度正确的签名版本


4

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

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

android {    
    signingConfigs {
        dev {
            v2SigningEnabled true
        }
     }
}

我正在使用Android Studio 4.0。但是,在build.gradle文件中没有“ v2SigningEnabled”这样的东西。那我该怎么办?
Nuwan Harshakumara Piyarathna

3

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


3

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

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


这是我的经验-我项目中的最小SDK高于设备SDK。发生这种情况是因为我在Android Studio中创建项目时“缺少”正确的选择,并意外选择了下一个更高的版本作为我的SDK,然后我的旧平板电脑正在运行。
GMc

使我的最小sdk和设备sdk相等就解决了我的问题。
Nuwan Harshakumara Piyarathna

2

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

  • 如果是纯Java,请确保不将其包含在.jar导出中
  • 如果它不是纯Java(意味着它是一个Android项目),则必须将其作为库项目包含在内

2

你也可以检查

Project Structure -> Default Config ->Signing Config

在您添加了所有需要的东西之后


1

将环境变量设置JAVA_HOME为JDK 5或6(而不是JDK 7)可以解决该错误。


0

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

它主要考虑的是您放入的最后一个文件(可以是图像或布局)。如果删除它们,则可以解决问题,然后可以重新构建项目。


0

我的Eclipse控制台出现此错误。原来,我有两个内容相同但名称不同的罐子,它们彼此冲突。我只是删除了其中之一,并设法在设备上安装了该应用程序。


0

我收到此错误是因为我确实释放了ant release失败原因是因为我用完了磁盘空间。


0

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


0

发生此错误的另一种方法是ant在macOS上使用进行构建,并Icon\r在应用程序的源代码树中具有Finder图标文件()。似乎jarsigner无法处理文件名中的回车符,尽管如果您声明该签名有效,则它会认为-verify是APK,但它始终会导致无法在设备上安装APK。具有讽刺意味的是,Google Drive Finder插件是Finder图标文件的重要来源。

解决方案是使用类似这样的说明符排除有问题的文件(无论如何在APK中都是无用的)fileset

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

0

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


0

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

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


0

它今天对我抛出此错误,因为我有一个最小SDK为28的应用程序,并且正在使用SDK版本为23的模拟器上播放。许多。


0

首先,只需尝试这样做:

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

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.