AndroidRunTime 异常 NoClassDefFoundError 在模拟器 API17 上,但不在 API22 上

2023-12-22

Android Studio:1.3.1 - Gradle 构建插件:1.1.2 - Gradle:1.3.0

在 Android Studio 上,我有一个应用程序可以在 Android API22 上完美运行(Lollipop,在模拟器 API22 和 Android 手机 API22 上,并且也可以在 API 21 上运行 - 但不能低于 API 21)。

在我的 Gradle 构建文件中,我有以下内容:

compileSdkVersion 22
buildToolsVersion "22.0.1"

defaultConfig {
    minSdkVersion 17
    targetSdkVersion 22
...
compile "commons-io:commons-io:2.4" //IO

因此,据我了解:我的应用程序是使用最新的 API (22) 编译的,可以在 API 17 到 API 22(以及兼容模式下的 22+)的设备上运行。

但是,当我在 API 17 模拟器上运行 Android 应用程序时,它会在某些文件复制操作期间崩溃。 在崩溃之前,dalivkvm 抱怨它找不到方法。

I/dalvikvm﹕ Could not find method org.apache.commons.io.FileUtils.copyInputStreamToFile, 
referenced from method FileCopy.batchCreate
W/dalvikvm﹕ VFY: unable to resolve static method 58205: Lorg/apache/commons/io/FileUtils;
.copyInputStreamToFile (Ljava/io/InputStream;Ljava/io/File;)V
D/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0058

然后是致命异常:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: org.apache.commons.io.FileUtils

现在显然 apache commons 库可以存在并导入,至少在 API 22 上(我提醒你,它在设备和模拟器上都成功运行)。

除了 Apache Commons 之外的其他库也会发生这种情况(如果我跳过使用 Apache Commons,那么另一个第三方库将导致类似的问题等等)。

我不明白为什么它不能在 API 17 上运行。在 API 18 和 19 上也有同样的问题,API 20 不存在。

它似乎在 API 21 和 API 22 上都能正常工作。

我在这里寻找过类似的错误,但通常是因为人们只是忘记包含他们的 jar 库,所以它没有帮助。


UPDATES

  • MultiDex 已启用。在 API 21 (Lollipop) 上,支持 multidex 的方式已更改(请参阅https://developer.android.com/tools/building/multidex.html https://developer.android.com/tools/building/multidex.html)。所以可能与此有关。

  • 当应用程序处于“调试模式”时,Gradle 在“发布模式”下构建模块(当应用程序处于调试状态时,为什么 Gradle 会在发布模式下构建我的模块 https://stackoverflow.com/questions/27277433/why-does-gradle-build-my-module-in-release-mode-when-the-app-is-in-debug/27277864#27277864)

  • 我尝试重建,用这些文件创建一个新项目,但没有成功。

  • “commons-io:commons-io:xxx”文件夹位于 Gradle 缓存文件夹中。


我能够解决我自己的问题。

因此,本质上,据我了解(但我没有时间进一步调查),问题是由于 Android API 21(又名 Android 5.0)中支持“Multidex”的方式发生了变化。

链接:https://developer.android.com/tools/building/multidex.html https://developer.android.com/tools/building/multidex.html告诉我们:

Android 5.0 及更高版本使用名为 ART 的运行时,它本身 支持从应用程序APK文件加载多个dex文件。

现在,当多重索引并尝试在同一应用程序中支持“正常 DEXing”(5.0/API21 之前)和“ART oat 文件”(5.0/API21 之后的新“DEX”文件)时,您可能会遇到一些问题与我的类似(无法找到 API21 之前的一些方法,但应用程序在 API21 及以上版本上运行良好)。

我的应用程序达到了 65k 方法限制,我必须获得 API17+ 的支持。

无论如何,解决方法是禁用 multidex 并使用 minifyEnabled 和“Proguard”,以便 Proguard 删除所有未使用的方法,并且方法总数最终低于 65k。

相关代码(在 Gradle 构建文件中):

defaultConfig {

    ...

    //Enabling multidex support (for more than 65k methods)
    multiDexEnabled false
}

buildTypes {
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

当然,这不是一个真正的解决方案,因为需要有效使用 65k 方法的人必须使用 multidex,但它对我来说很好地完成了工作,我不能在这些问题上花费更多时间。

希望这会对某人有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AndroidRunTime 异常 NoClassDefFoundError 在模拟器 API17 上,但不在 API22 上 的相关文章

  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • 如何在 StateListDrawable 中设置可绘制对象的 alpha 值?

    我想在按下时更改可绘制对象的 alpha 值 因此 我创建了两个可绘制对象并将它们放入 StateListDrawable 中 并设置按下状态的 alpha 值 但它就是行不通 StateListDrawable content new S
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • Sqlite 查询检查 - 小于和大于

    return mDb query DATABASE TABLE new String KEY ROWID KEY LEVEL KEY LEVEL gt 3 lt 5 null null null null 我究竟做错了什么 它返回的值全部高
  • 服务在后台运行?

    我正在构建的应用程序的功能之一是记录功能 我通过在服务中启动 MediaRecorder 对象来实现此目的 Intent intent new Intent v getContext RecordService class Messenge
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • android studio 底部工具栏的“运行”选项卡消失了

    Android Studio 底部工具栏中曾经有一个 运行 选项卡 但该选项卡不再显示 怎么把它带回来 请检查下图以了解它消失之前的位置 Run 选项卡曾经位于 TODO 选项卡之前的红色圆圈中 查看 gt 工具窗口 gt 运行 Or us
  • 如何在Firebase Android应用程序中分离两个不同的用户?

    我有一个应用程序 有两种不同类型的用户 一种是教师 第二种是普通用户 如果普通会员登录 他会去normal memberActivity如果他是教师会员 他会去Teacher memberActivity 我如何在登录活动中执行此操作 我的
  • 如何在代码中设置TextView的文字颜色?

    在 XML 中 我们可以通过以下方式设置文本颜色textColor属性 比如android textColor FF0000 但如何通过编码来改变它呢 我尝试过类似的东西 holder text setTextColor R color R
  • 来自外部 XML 的 Android 本地化

    是否可以使用从服务接收到的 XML 在运行时翻译 Android 应用程序 如果可能的话 请有人指出我正确的方向 谢谢 Warning 我读到的所有内容都表明 让您的应用程序更改语言不是一个好主意 因为 Android 框架不支持它 并且可
  • 如何在不改变的情况下将字符串转换为字节?

    我需要一个解决方案将字符串转换为字节数组而不需要像这样进行更改 Input String s Test Output String s Test byte b Test 当我使用 s getBytes 那么回复是 B 428b76b8 但我
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • Android框架结构与MFC/Win32结构的比较?

    我为 Android 和 Windows 进行开发 使用 MFC 有时使用 win32 昨天我随意比较了这两个框架 它们显然非常非常不同 因此 Windows 开发与 Android 开发有很大不同 我想知道人们认为 Android 这样的
  • 如何在Android中隐藏应用程序标题? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想隐藏应用程序标题栏 您可以通过编程来完成 import android app Activity import android os
  • 改造Android基本且简单的问题

    我的服务器返回简单的 Json 结果 如下所示 message Upload Success 我正在尝试将结果放入改造模型类中 public class MyResponse SerializedName message String me
  • EditText 的高度不会扩展到其父级的高度

    我在滚动视图中放置了编辑文本 高度 match parent并期望它的高度等于滚动视图 但事实并非如此 它的高度就像wrap content这意味着如果 EditText 中没有文本 我必须将光标指向要弹出的软键盘的第一 行 我想要的是我可
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • Android:列“_id”不存在

    我收到这个错误 IllegalArgumentException 列 id 不存在 当使用SimpleCursorAdapter从我的数据库中检索 该表确实有这个 id柱子 注意到这是一个常见问题 我尝试根据网上的一些解决方案来解决它 但它

随机推荐