如何将番石榴导入Android应用程序

如何将番石榴导入Android应用程序,android,android-studio,apk,guava,Android,Android Studio,Apk,Guava,将番石榴导入Android项目的正确方法是什么?每次尝试使用它时,我都会得到一个NoClassDefFoundError 这就是我正在做的,以产生崩溃。我使用的是安卓Studio 3.0金丝雀7 使用空活动模板创建新项目文件>新建>新项目,目标API 26.0 添加到dependencies部分的app/build.gradle implementation "com.google.guava:guava:20.0" 将其添加到MainActivity.java ImmutableList&

将番石榴导入Android项目的正确方法是什么?每次尝试使用它时,我都会得到一个
NoClassDefFoundError

这就是我正在做的,以产生崩溃。我使用的是安卓Studio 3.0金丝雀7

  • 使用
    空活动
    模板创建新项目
    文件>新建>新项目
    ,目标
    API 26.0
  • 添加到
    dependencies
    部分的
    app/build.gradle

    implementation "com.google.guava:guava:20.0"
    
  • 将其添加到
    MainActivity.java

    ImmutableList<String> foo = ImmutableList.of("A", "B", "C");
    Log.d("MainActivity", foo.get(0));
    
  • 我几乎可以肯定的是,这与戈瓦的体型过大以及在multidex上表现不佳有关,但我不确定该怎么办。以下是一些值得注意的事情,我尝试了但没有成功:

  • 在中启用多索引并指定ImmutableList

  • 禁用即时运行

  • 从设备中取出APK,并验证番石榴类是否在APK中

  • 遵循此堆栈溢出中的建议

  • TL;DR

    使用guava版本
    22.0-android
    及更高版本。确保使用
    -android
    风格,否则会遇到
    NoClassDefFoundError

    解释

    在发布了如何手动清理项目和从模拟器卸载APK的问题后,我学到了这一点。事实证明,版本
    20.0
    确实有效,但在此之前我尝试过版本
    21.0
    ,但未能清除

    21.0版起,非
    -android
    口味的番石榴正在使用Java8。在
    21.0
    之前的android版本和风格都使用Java7。这在22.0版的这些中进行了描述

    我测试了这些口味和版本:

    • 20.0(Java 7)
      -有效
    • 21.0(Java8)
      -不起作用
    • 22.0(Java8)
      -不起作用
    • 22.0-android(Java7)
      -works
    使用版本
    21.0
    22.0
    (无
    -android
    )时,
    ImmutableList
    类会被引用,但不会编译到dex文件中(因为它是斜体)。这导致了
    NoClassDefFoundError

    正如安卓所解释的那样

    在树状图中,斜体节点是没有 所选索引文件中的定义

    它进一步解释说

    DEX文件可以引用在 不同的文件。例如,System.out.println()是对 Android框架中的println()方法

    但在本例中,这些方法和类定义不应该出现在其他文件中。只是没有添加它们

    与之相比,使用
    20.0
    22.0-android
    ,其中实际上编译了ImmutableList类

    应用程序将按预期启动。

    TL;DR

    使用guava版本
    22.0-android
    及更高版本。确保使用
    -android
    风格,否则会遇到
    NoClassDefFoundError

    解释

    在发布了如何手动清理项目和从模拟器卸载APK的问题后,我学到了这一点。事实证明,版本
    20.0
    确实有效,但在此之前我尝试过版本
    21.0
    ,但未能清除

    21.0版起,非
    -android
    口味的番石榴正在使用Java8。在
    21.0
    之前的android版本和风格都使用Java7。这在22.0版的这些中进行了描述

    我测试了这些口味和版本:

    • 20.0(Java 7)
      -有效
    • 21.0(Java8)
      -不起作用
    • 22.0(Java8)
      -不起作用
    • 22.0-android(Java7)
      -works
    使用版本
    21.0
    22.0
    (无
    -android
    )时,
    ImmutableList
    类会被引用,但不会编译到dex文件中(因为它是斜体)。这导致了
    NoClassDefFoundError

    正如安卓所解释的那样

    在树状图中,斜体节点是没有 所选索引文件中的定义

    它进一步解释说

    DEX文件可以引用在 不同的文件。例如,System.out.println()是对 Android框架中的println()方法

    但在本例中,这些方法和类定义不应该出现在其他文件中。只是没有添加它们

    与之相比,使用
    20.0
    22.0-android
    ,其中实际上编译了ImmutableList类

    应用程序按预期启动

    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)