【发布时间】:2018-06-28 05:14:46
【问题描述】:
将 Guava 导入 Android 项目的正确方法是什么?每次我尝试使用它时,我都会收到一个NoClassDefFoundError。
这就是我正在做的以产生崩溃。我正在使用 Android Studio 3.0 Canary 7。
- 使用
Empty Activity模板创建一个新项目File > New > New Project,目标API 26.0。 -
在
dependencies部分添加到app/build.gradleimplementation "com.google.guava:guava:20.0" -
将此添加到
MainActivity.java中的onCreate方法中ImmutableList<String> foo = ImmutableList.of("A", "B", "C"); Log.d("MainActivity", foo.get(0)); -
运行 App 并打开 Logcat 看到这个异常:
FATAL EXCEPTION: main Process: com.letsdoit.guavaissue, PID: 14366 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/common/collect/ImmutableList; at com.letsdoit.guavaissue.MainActivity.onCreate(MainActivity.java:20) at android.app.Activity.performCreate(Activity.java:6679) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.common.collect.ImmutableList" on path: DexPathList[[zip file "/data/app/com.letsdoit.guavaissue-1/base.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.letsdoit.guavaissue-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.letsdoit.guavaissue-1/lib/x86, /system/lib, /vendor/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:380) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.letsdoit.guavaissue.MainActivity.onCreate(MainActivity.java:20) at android.app.Activity.performCreate(Activity.java:6679) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
我几乎可以肯定这与 Gauva 体型很大并且不能很好地使用 multidex 有关,但我不确定该怎么做。这些是我尝试过但无济于事的一些值得注意的事情:
启用multidex并在multiDexKeepFile中指定ImmutableList。
禁用即时运行。
从设备中提取 APK 并验证 Guava 类在 APK 中。
遵循此堆栈溢出question 中的建议。
【问题讨论】:
标签: android android-studio apk guava