如何解决INSTALL_FAILED_DEXOPT错误?

我正在使用Android 2.2开发一个Android应用程序,我的应用程序APK大小是22.5 MB,我想为三星平板电脑创建一个新的构建。我得到了以下错误:

INSTALL_FAILED_DEXOPT

如何解决这种错误?

177569 次浏览

Android SDK and AVD Manager重新启动模拟器并选择选项Wipe User Data已经为我解决了这个问题。

你可以在下图中找到高亮显示的选项:

擦除用户数据选项时启动android模拟器

您正在安装的应用程序的旧版本有已更改的依赖库/ jar。我在更新我的应用程序引用的其他jar文件时遇到了这个问题。

你将需要卸载旧版本,然后你应该没有更多的问题…

设置—>应用程序—>管理应用程序—>[找到并卸载您的应用程序]

INSTALL_FAILED_DEXOPT错误不应该爆发。就像

[2011-06-14 01:23:40 - ProtectYourself] Installing ProtectYourself.apk...
[2011-06-14 01:24:26 - ProtectYourself] Installation error: INSTALL_FAILED_DEXOPT
[2011-06-14 01:24:26 - ProtectYourself] Please check logcat output for more details.
[2011-06-14 01:24:26 - ProtectYourself] Launch canceled!

哇呼!。

这个错误消息似乎有许多不同的原因。我遇到的情况是在一个真实的设备上(因此模拟器基础解决方案不适用)。

基本上,当这种情况发生时,将你的Logcat过滤器设置为详细的警告,这将帮助你获得有关原因的更多信息。

以我为例,我正在从事的项目(一个大型现有代码库)中包含了多个或相互冲突的JUnit版本。我试图部署的Android应用程序有几个库项目作为依赖项,我错误地将其设置为包含多个JUnit jar文件。

我是根据一系列Logcat信息发现这一点的。注意WARN行给出了原因:

DEBUG/dalvikvm(4808): DexOpt: 'Ljunit/framework/TestSuite$1;' has an earlier definition; blocking out
11-06 14:30:10.973: WARN/dalvikvm(4808): Invalid file flags in class Ljunit/runner/Sorter$Swapper;: 0209
11-06 14:30:10.973: null/libc(4808): Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1), thread 4808 (dexopt)

我有这个问题时,有一些Unicode字符在我的方法名称(由于,所有的事情,复制/粘贴从powerpoint文件),Dalvik不喜欢。在尝试安装APK时,您可以通过查看Logcat输出来了解这一点。

这是在一个真实的设备上。

当我尝试在2.3设备上安装时遇到了这个问题(在4.0.3上没问题)。它最终是因为我正在使用的lib项目有多个jar,这些jar用于android中已经存在的东西,例如HttpClient和XML解析器等。看着logcat让我发现这个,因为它告诉我它正在逃课,因为他们已经在场。很好的无用的原始错误!

我在一个真实的设备上进行了错误测试。清理缓存/卸载,重新启动一切都不适合我,删除构建文件夹的内容可以:)(Android工作室)

在构建(dex.force.jumbo=true)中启用jumboMode标志后,我遇到了这个问题。在更新的Android设备上一切正常,但在Gingerbread上安装失败。

因此,如果你的应用程序由于烦人的65k限制而需要巨型模式,尝试删除一些未使用的代码/字符串,并将巨型模式设置为false。

如果你正在使用Android工作室,尝试清理你的项目:

建立>清洁项目

没有通用的解决方案,你必须找到你的Logcat上报告的错误,才能解决它。有时它是一个不能被“解码器”的类,因为它使用了一个在指定的目标API上不可用的类。或者它可能是一个你在代码中引用的类,但是它所在的库没有被打包。

考虑使用proguard来缩小APK。如果我试图在旧的三星Galaxy Ace 2.3.6设备上安装25MB以上的APK,而没有使用proguard收缩/优化代码,我也会遇到同样的问题。

Jumbo模式和重新启动设备无效。

classes.dex没有进入最后的.apk。运行gradlew --offline clean && gradlew --offline assembleDebug每次都能帮我解决问题。从那时起,你可以再次从Android Studio启动应用程序。

编辑:在我上面所说的之前,进入任务管理器并杀死所有cmd.execonhost.exe进程(或者只是aapt卡住的进程)。否则,从现在开始,当从命令行启动时,aapt将崩溃,并出现臭名昭著的错误-1073741819

我正在使用Android Studio,也出现了同样的错误。

删除主模块的构建文件夹有帮助。删除后一切恢复正常。

通过纠正电话上的日期时间(它是一些默认日期01.01.1980),并清理项目来解决。

我已经更改了android版本4对sdk 21的支持,并出现了这个错误。所以我回到了旧版本(21年前)的支持版本,它工作了。该错误只发生在android 2.3

我已经卸载了应用程序,尽管如此,还是得到了INSTALL_FAILED_DEXOPT错误。 如果你正在使用Android Studio / gradle: gradle清洁对我来说很有用, 欢呼。< / p >

我得到了同样的错误,并通过增加内部存储的大小来修复它。

内部存储最初设置为32MB(我知道),然后我在上面安装了几个apks,这比需要安装的apks所留下的空间要小。

我在尝试更新新的构建工具24.0.1时遇到了这个问题。互联网连接丢失,工具下载不成功,之后我得到了这个错误,花了很多时间试图解决它。但是当我成功地更新构建工具时,问题就解决了。祝你好运。

确保你已经安装了所有你需要的SDK,并且Gradle瞄准了正确的版本。

我也遇到过同样的问题,但这是由于我将设备更新到Android 5.0,然后忘记更改所有的构建来针对它。

在build.gradle < p > 更改已编译并构建到最新版本。

================

android {
compileSdkVersion 22
buildToolsVersion "22"

我在eclipse AVD管理器中更改了模拟器内存大小和内部存储容量

我遇到过这个问题,因为我使用的库有一些不匹配

通过更新android sdk到最新解决。检查SDK管理器,如果它显示更新,然后完全更新,清理你的项目,然后运行,它会工作:)

INSTALL_FAIL_DEXOPT通常与放在classes.dex上的限制有关。在ics之前的任何版本上,dexopt在超过5 MB的地方都会失败。最近版本的Android使用8或16 MB的缓冲区。

检查APK中classes.dex的大小。看看方法计数是多少也很好,因为dex有65536个方法/字段限制。


引用:

安装应用程序时出错(INSTALL_FAILED_DEXOPT

https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

如何缩小代码-65k方法限制在dex

也许这个会有帮助:

  1. 在启动模拟器之前擦除用户数据
  2. 清理项目
  3. 删除不需要的依赖项....

通过删除主应用程序的构建文件夹可以解决这个错误,它将重新创建。

试试我的答案

如果你使用android studio 2.0,禁用即时运行。

仅供参考,即时运行是android studio 2.0的新功能(我从未使用过>.<)

如何禁用:首选项->构建,执行&部署->即时运行->禁用,然后像魔术一样工作

享受吧!

我需要禁用即时运行来解决这个问题。要禁用OS X上的即时运行,请转到Android工作室 > 首选项 > 构建、执行、部署 > 即时运行,然后从Enable Instant Run to hot swap code/resource changes on deploy (default enabled)中删除勾号。

因为这似乎是我自己遇到过多次的问题,这次没有一个分享的解决方案对我有帮助,我仍然会发布一些对我个人有帮助的东西,以及我认为将来可能会帮助其他人的东西:

进入项目目录,找到build/intermediates/dex-cache/cache文件。删除它——顾名思义,这是一个缓存的dex文件,如果你改变了项目的依赖关系,构建工具版本等,它可能已经过时了。

如果你有INSTALL_FAIL_DEXOPT错误,请查看manifest android:targetSdkVersion。 设定版本<21 示例:< / p >

android: targetSdkVersion = " 19 "

这对我很管用。

在android Studio中点击File -> Invalidate cache / restart。当我在设备而不是模拟器上得到这个错误时,这个对我有用。

对我来说,这是proguard导致INSTALL_FAILED_DEXOPT在一些三星设备与Android 5.x。

也就是说,我必须添加这个来保护-不知道为什么它有帮助。

-keepattributes LocalVariableTable

重新启动设备。

以我为例,这个应用程序在大多数设备上都能运行,只有一个例外:我的手机太旧了,最近一直在故障,即使没有安装一次应用程序,应用程序也会抛出这个错误。

在我的案例中,这是kotlin插件1.1.51版本中的一个bug

https://youtrack.jetbrains.com/issue/KT-20034

此错误出现在旧设备上(API 16)。

通过删除@Parcelize注释并将其替换为代码生成器:https://github.com/nekocode/android-parcelable-intellij-plugin-kotlin来修复此问题

此外,如果您还在使用ECLIPSE,请尝试清理您的项目:

项目>清洁…

我今天在新的虚拟设备上使用Android Studio时也遇到了同样的问题。似乎我已经下载了x86_64映像,用等效的x86映像重新创建了VD。

我期望在这种情况下得到INSTALL_FAILED_NO_MATCHING_ABIS,但不知何故,我被INSTALL_FAILED_DEXOPT卡住了

我发现造成这个问题的原因只有一个:手机空间不足。所以我从手机上删除了几个APP,这是固定的。

targetSdkVersion 22//17==========================>设置这个数字小于或等于设备上的Android操作系统版本可能会有帮助

 defaultConfig {
applicationId "software.nhut.personalutilitiesforlife"
minSdkVersion 16
targetSdkVersion 22//17==========================> set this number less then or equal to the version of Android OS on devices might help
versionCode 5
versionName "1.26"
// Enabling multidex support.
multiDexEnabled true
}

对我来说,这似乎与磁盘空间有关。新推出的5.1仿真器启动时出现了“磁盘空间不足”错误——查看仿真器属性,为内部存储分配的默认空间是800MB,这看起来很低。

因此,解决方案是增加内存(我增加到4GB)。奇怪的是,模拟器仍然引导相同的磁盘空间警告,但出厂重置(设置->备份和恢复在模拟器内部)完全解决了我的问题。

只是有点奇怪,它不能在默认设置下开箱即用。

检查设备上的存储空间

在使用Android Studio 3.4.1时遇到了这种情况,但使用的是较旧的模拟器(5.0)。这个过程(在Mac上)修复了问题:

  1. 停止模拟器
  2. cd ~ /。安卓/ avd / .avd模拟器的名字
  3. rm * .lock
  4. 擦模拟器
  5. 启动模拟器

对我来说唯一有效的解决方案是将虚拟机的RAM增加到4GB。

这里有很多答案,但也许它可以帮助某些人 我有这个问题与实际设备和问题是D8

试着把这个添加到你的gradle中。它对我有用

android.enableD8=false
android.enableD8.desugaring= false
一个原因是classes.dex在.apk-package的根目录中找不到。 < / p >
  • 该文件在apk-package或
  • 它位于.apk文件中的子文件夹中。

这两种情况都会导致终止,因为Android只搜索apk文件的根目录。造成这种混乱的原因是.apk文件的构建运行没有错误消息。

造成这种错误的核心原因可能是:

  • dx工具需要在当前的主工作文件夹中找到classes.dex。但实际上,classes.dex位于其他位置。
  • Aapt在classes.dex的位置有错误信息。例如,aapt.exe add ... bin/classes.dex。这是错误的,因为classes.dex在创建的.apk文件的子文件夹/bin中。

在我的案例中,问题发生在一些运行API 21和22的设备上。在manifest中在application标签下设置android:vmSafeMode="true"解决了这个问题。但是,不建议发布版本使用它,所以我在values文件夹中创建了两个xml文件。旧API的默认值:

<resources>
<bool name="vm_safe_mode">true</bool>
</resources>

对于API的false值的>= 23也是一样。在这种情况下,操作系统更新的设备不会受到影响,旧的设备至少可以工作。

致任何搜索关键词“房间”的人。我在实现Room来管理数据库时遇到了这个问题。原因是我从Android文档中复制了所有依赖项。只复制你需要的文件。如果您没有使用Kotlin或番石榴,只需添加:

implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
testImplementation "androidx.room:room-testing:$room_version"

我添加了下面的行到gradle。属性文件,问题得到解决:

android.enableD8=false
android.enableD8.desugaring= false

我在真正的设备上运行这个应用程序。