Android Studio:1.3.1 - Gradle Build Plugin: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库,所以它没有帮助。
更新
启用MultiDex。在API 21(Lollipop)上,支持multidex的方式已经改变(参见https://developer.android.com/tools/building/multidex.html)。所以它可能与此有关。
当app处于“调试模式”(Why does Gradle build my module in Release mode when the app is in Debug)时,Gradle以“发布模式”构建模块
我尝试重建,用文件创建一个新项目无济于事。
Gradle缓存文件夹中存在“commons-io:commons-io:xxx”文件夹。
答案 0 :(得分:0)
我能解决自己的问题。
基本上,正如我所理解的那样(但我没有时间进一步调查),问题是由于支持“Multidex”的方式在Android API 21(又称Android 5.0)中发生了变化。
链接: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之前找到一些方法,但app在API21及以上版本上工作正常)。
我的应用达到65k方法限制,我不得不支持API17 +。
无论如何,解决方法是禁用multidex并使用“Proguard”代替minifyEnabled,以便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,但它能很好地完成我的工作,而且我不能在这些问题上花更多的时间。< / p>
希望这会对某人有所帮助。