模拟器API17上的AndroidRunTime异常NoClassDefFoundError,但API22上没有

模拟器API17上的AndroidRunTime异常NoClassDefFoundError,但API22上没有,第1张

概述AndroidStudio:1.3.1-GradleBuild插件:1.1.2-Gradle:1.3.0在AndroidStudio上,我有一个可以在AndroidAPI22上完美运行的应用程序(棒棒糖,在模拟器API22和Android手机API22上也可以在API21上运行-但在API21以下没有任何功能).在我的Gradle构建文件中,我具有以下内容:compileSdk

Android Studio:1.3.1-Gradle Build插件:1.1.2-Gradle:1.3.0

在AndroID Studio上,我有一个可以在AndroID API22上完美运行的应用程序(棒棒糖,在模拟器API22和AndroID手机API22上也可以在API 21上运行-但在API 21以下没有任何功能).

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

compileSdkVersion 22buildToolsversion "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.batchCreateW/dalvikvm﹕ VFY: unable to resolve static method 58205: Lorg/apache/commons/io/fileUtils;.copyinputStreamTofile (Ljava/io/inputStream;Ljava/io/file;)VD/dalvikvm﹕ VFY: replacing opcode 0x71 at 0x0058

然后致命的异常

E/AndroIDRuntime﹕ FATAL EXCEPTION: main    java.lang.NoClassDefFoundError: org.apache.commons.io.fileUtils

现在显然可以至少在API 22上提供和导入apache commons库(我提醒您,该库可以在设备和模拟器上成功运行).

除Apache Commons以外的其他库也会发生这种情况(如果我跳过使用Apache Commons的话,那么另一个第三方库也会引起类似的问题,依此类推).

我不知道为什么它不能在API 17上运行.API18和19也有相同的问题,API 20不存在.

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

我在这里一直在寻找类似的错误,但这通常是因为人们只是忘记了包含自己的jar库,所以这无济于事.

更新

> MultIDex已启用.在API 21(Lollipop)上,支持multIDex的方式已更改(请参阅https://developer.android.com/tools/building/multidex.html).因此,这可能与此有关.
>当应用程序处于“调试模式”时,Gradle在“发布模式”下构建模块(Why does Gradle build my module in Release mode when the app is in Debug)
>我尝试重建,创建了一个新项目,但文件无效.
> Gradle缓存文件夹中存在“ commons-io:commons-io:xxx”文件夹.

解决方法:

我能够解决自己的问题.

因此,从本质上讲,据我了解(但我没有时间进一步调查),该问题是由于以下事实导致的:支持“ MultIDex”的方式在AndroID API 21(又称为AndroID 5.0)中发生了变化.

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

AndroID 5.0 and higher uses a runtime called ART which natively
supports loading multiple dex files from application APK files.

现在,似乎在同一应用程序中进行多义处理并尝试同时支持“常规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,但这对我来说做得很好,我不能在这些问题上花费更多的时间.

希望这会帮助某人.

总结

以上是内存溢出为你收集整理的模拟器API17上的AndroidRunTime异常NoClassDefFoundError,但API22上没有全部内容,希望文章能够帮你解决模拟器API17上的AndroidRunTime异常NoClassDefFoundError,但API22上没有所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1095237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存