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 缓存文件夹中。