什么是 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误?
Posted
技术标签:
【中文标题】什么是 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误?【英文标题】:What is INSTALL_PARSE_FAILED_NO_CERTIFICATES error? 【发布时间】:2021-10-26 11:46:19 【问题描述】:我试图通过编辑androidmanifest.xml
文件来更改我的默认/主/启动(无论你怎么称呼它)活动。我所做的只是更改android:name
属性。但是,这完全破坏了整个应用程序。当我尝试安装它失败并读取。
安装错误:INSTALL_PARSE_FAILED_NO_CERTIFICATES
当我尝试将其更改回之前的状态时,它仍然给我同样的错误...我做了什么?
【问题讨论】:
对于其他任何人:INSTALL_PARSE_FAILED_NO_CERTIFICATES
是错误 -103
,您可以通过 adb log
(src) eg. D/PackageInstaller(21320): Installation error code: -103
获取/查看
答案是正确的。还有另一个导致此错误的原因是当您在手机中安装了具有相同软件包名称的旧应用程序时。只需在安装新应用程序之前从手机中卸载
致任何偶然发现这个问题的人 - 请阅读下面的所有答案!似乎此错误消息更像是“出了点问题”类型的错误。我遇到它的原因是由于其中一种答案方式,在列表中!!!!
【参考方案1】:
我发现现在使用错误的签名配置也会出现此错误。如here 所述,Android 7.0 引入了一个新的签名方案,V2。 V2 方案签署整个 APK 而不仅仅是 JAR,就像在 V1 方案中所做的那样。如果您仅使用 V2 签名,并尝试在 7.0 之前的目标上安装,您将收到此错误,因为 JAR 本身未签名并且 7.0 之前的 PackageManager 无法检测到V2 APK 签名。
要与所有目标系统兼容,请通过选中 Android Studio 的 Generate Signed APK 对话框中的两个签名版本框,确保 APK 使用两种方案签名,如下所示:
如果仅预期 7.0 目标,则无需包含 V1 签名。
【讨论】:
你节省了我很多时间。升级 Android Studio 带来了噩梦般的麻烦。这是其中之一。我想知道如果没有超过一半的 Android 开发会死掉。 Android Studio 没有提供任何有关错误的线索。 幸运的是,我在旧设备上测试了我的发布 apk,然后才在 Google Play 上推出它。如果所有 谢谢。快要疯狂地寻找为什么我的 APK 不能在 Android 7 以下运行,但这只是一个简单的复选框。太烦人了。【参考方案2】:您是否直接在.apk
文件中编辑了AndroidManifest.xml
?如果是这样,那就行不通了。
Every Android .apk
needs to be signed if it is going to be installed on a phone,即使您不是通过 Market 安装。开发工具通过使用开发证书进行签名来解决此问题,但 .apk
仍被签名。
这样做的一个用途是设备可以判断.apk
是否是已安装应用程序的有效升级,因为如果是,证书将是相同的。
因此,如果您对应用进行任何更改,则需要重新构建 .apk
以便正确签名。
【讨论】:
非常感谢,有自动重建清单的按钮吗? 对于 Flutter 苦苦挣扎的人,请运行flutter clean
并再次运行/调试!此操作类似于上面的解决方案,因为它会清理构建文件夹并在运行/调试时再次重建构建文件!
我刚刚做了“制作项目”并尝试了它。它对我有用。【参考方案3】:
我发现这是我的 JDK 版本造成的。
我在使用“ant”时遇到了这个问题,这是由于文档中提到的这个 CAUTION:
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 并对其进行了压缩,但它给出了一个稍微不同的错误:
$ "$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" />
【讨论】:
JDK 7 也是我的问题。我很懒,卸载了JDK 7并安装了JDK 6,也工作了^^。可以同时安装其他 hack 解决方案但不太激进,但将 JAVA_HOME 设置为 JDK 6 并将 JDK 6 的 bin 路径放在 PATH 中。 JDK 8 也有同样的问题。将 PATH 更改为 JDK 6 有效。谢谢你的救星! 谢谢!我的市场应用程序是用 JDK6 编译的。当我使用JDK7编译带有发布密钥库的应用程序并尝试安装时,它给了我这个问题。【参考方案4】:大多数时候这个错误的解决方法很简单:
-
卸载您的 apk
清理您的 Android 项目
构建您的 Android 项目
安装/运行您的 apk
【讨论】:
我做了 2,3,4 并得到了同样的错误。卸载你的apk是什么意思?从我的设备?我认为它从未出现在我的设备上。 我突然开始得到这个错误,如果解决方案只是清理项目有效,则没有。谢谢。【参考方案5】:解决了(对我来说)在 keytool 中使用 args
-sigalg MD5withRSA -keyalg RSA -keysize 1024
并在 jarsigner 中使用
-sigalg MD5withRSA -digestalg SHA1
解决方案在
What kind of pitfals exist for the Android APK signing?
【讨论】:
谢谢,也为我解决了这个问题(我有 JDK 7)。 我以同样的方式修复了它,因为我使用的是 appcelerator Titan 并且无法访问 apk 生成脚本。请注意,此解决方案需要重新生成(更改!)私钥。【参考方案6】:如果您添加签名配置(创建签名密钥并添加到“项目结构”>“模块”>“签名配置”)但忘记在“项目结构”>“构建变体”中指出,则可能会引发此错误" > "构建类型" > "签名配置"。
签名配置字段不应为空! (见下图)否则,你会看到
"INSTALL_PARSE_FAILED_NO_CERTIFICATES...APK signature verification failed."
如果您尝试安装 release
变体,则会出错。 (或其他具有相同错误配置的变体)
【讨论】:
【参考方案7】:我也面临同样的问题。首先,我使用 V2 生成构建并将其安装在运行 OS 5.1 的移动设备中,我遇到了同样的问题。但是构建在 OS 7.0 上运行的平板电脑上运行良好。所以我生成了带有 V1 Jar 签名的构建,它在两个设备上都运行良好。
结论:如果您支持android OS 7.0以下的设备。使用 V1 jar 签名生成构建。
【讨论】:
两者都不需要勾选,如果支持7.0及以下的操作系统,请选择V1 如果您支持7.0及以上的设备,请勾选V2。【参考方案8】:最近我在升级到 Android Studio 4.0 时遇到了这个错误。原因是项目在build.gradle
的签名配置中禁用了V2签名。
解决方案是删除v2SigningEnabled false
或将其显式设置为true
,这是默认值。
android
signingConfigs
dev
v2SigningEnabled true
【讨论】:
【参考方案9】:就我而言,我可以构建并运行发布版本,但在尝试进行调试构建时出现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 调试 组织单位:Android 组织名称:未知 城市或地区:未知 州或省:未知 国家代码:美国【讨论】:
在从配置文件构建切换回调试构建(想使用 VS Code 测试我的设备上应用程序的性能)、删除 debug.keystore 文件(位于 C :\Users\user\.android) 并在调试模式下再次运行应用程序修复它。【参考方案10】:在我的例子中,我安装了一个比我的真实设备的 Android 版本更大的 MinimumSDK 的项目。我用了另一个设备,它解决了。
我的项目 MinSDK -> 24
我的手机安卓版 -> 21
【讨论】:
【参考方案11】:在较新的 Android Studio 版本 3.2+ 中,如果您尝试运行 release
安装,并且您没有定义任何签名配置,它将显示错误提示并且安装将失败。您需要做的是运行 debug
构建或正确设置签名配置(V1 或 V2)。
【讨论】:
关于如何“设置签名配置 (V2)”的更多提示?【参考方案12】:这是一个丑陋但快速的解决方案:使用 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 可能是一个不错的解决方案。
【讨论】:
【参考方案13】:这是因为之前生成的构建版本和当前版本在 v1(jar 签名)和 v2(完整 APK 签名)之间的签名版本存在冲突,
在 Generate Signed APK 对话框下修复勾选正确的签名版本
【讨论】:
【参考方案14】:大多数答案都是正确的。发生的其他一些原因是
► 你的 min sdk 小于 device sdk。 ► 您的设备中有旧版应用程序具有相同的包名称
【讨论】:
这是我的经验 - 我项目中的 min sdk 高于 device sdk。发生这种情况是因为我在 Android Studio 中创建项目时“错过”了正确的选择,并且不小心选择了下一个更高版本作为我的 SDK,然后我的旧平板电脑正在运行。 让我的 min sdk 和 device sdk 相等解决了我的问题。【参考方案15】:你也可以检查
Project Structure
-> Default Config
-> Signing Config
在你添加所有你需要的东西之后
【讨论】:
【参考方案16】:如果您尝试包含包含 AndroidManifest.xml
文件的 .jar
库,则可能会发生这种情况。
【讨论】:
【参考方案17】:将环境变量 JAVA_HOME
设置为 JDK 5 或 6(而不是 JDK 7)修复了该错误。
【讨论】:
【参考方案18】:我收到此错误是因为我确实发布了我的 ant release
因磁盘空间不足而失败。
【讨论】:
【参考方案19】:今天给我抛出了这个错误,因为我有一个最小 sdk 为 28 的应用程序,并且在 SDK 版本为 23 的模拟器上点击播放。通常这是不可能的(因为灰色的播放按钮),但是今天没那么多。
【讨论】:
谢谢,丹尼尔。经过大量研究,后来使用您的方法终于解决了这个问题。【参考方案20】:对我来说,我忘记将新的签名配置添加到
Project Structure
-> Default Config
-> Signing Config
【讨论】:
我如何实际生成要放在这里的签名配置? 当你生成你的第一个 Apk 时,你需要创建一个登录配置【参考方案21】:导航到运行 -> 编辑配置... -> Android 应用 -> 应用 -> 安装选项
然后改为APK from app bundle
而不是Default APK
【讨论】:
【参考方案22】:经过一段时间和多个关于该主题的在线讨论后,我设法修复了我的项目。
主要是考虑您最后放入的文件(可能是图像或布局)。如果您删除它们,它会起作用,您可以重新构建您的项目。 p>
【讨论】:
【参考方案23】:我在我的 Eclipse 控制台中遇到了这个错误。事实证明,我有两个内容相同但名称不同的罐子,它们相互冲突。我刚刚删除了其中一个并设法在设备上安装了该应用程序。
【讨论】:
【参考方案24】:当我尝试在运行 api v23 的手机上安装针对 Android N 预览构建的 Xamarin 项目时出现此错误。解决办法是不要那样做。
【讨论】:
【参考方案25】:获得此错误的另一种方法是在 macOS 上使用 ant
构建,并在应用程序的源代码树中有一个 Finder 图标文件 (Icon\r
)。看来jarsigner
无法处理文件名中的回车,尽管如果您-verify
APK 会声称签名有效,但它始终会导致无法在设备上安装的APK。具有讽刺意味的是,Google Drive Finder 插件是 Finder 图标文件的重要来源。
解决方案是在fileset
中使用这样的说明符排除有问题的文件(无论如何在 APK 中无用):
<exclude name="**/Icon " />
【讨论】:
【参考方案26】:如果您安装的是未签名版本的 APK,则会出现此问题。检查您是否安装了正确的 APK。
【讨论】:
【参考方案27】:我在使用 ionic / Visual Studio Code(在设备上运行 Android)时遇到了这个问题:
我在移动设备上卸载了应用程序(设置/应用程序),错误消失了,应用程序正在启动。
【讨论】:
【参考方案28】:首先尝试这样做:
转到 Gradle 脚本 → bulid.gradle(module:app) → 然后您必须更改 (minSdkVersion) 值。例如,如果您使用 26,您可以尝试减小该值,例如 (minSdkVersion 20 ) 然后尝试(立即同步)。【讨论】:
【参考方案29】:如果您使用的是模拟器,请尝试重置它,如果您在移动设备上先卸载应用程序,然后关闭开发者模式,然后再打开它,问题将得到解决。
【讨论】:
【参考方案30】:确保在 Android Studio 中将构建变体设置为调试(而不是发布)(检查构建变体面板)。
【讨论】:
以上是关于什么是 INSTALL_PARSE_FAILED_NO_CERTIFICATES 错误?的主要内容,如果未能解决你的问题,请参考以下文章
什么时候是:typedef __intn_t(__INTPTR_WIDTH__) intptr_t;合法的?而且,为什么?