我正在将一个旧的Android项目更新为新的项目,但是我在API 22及以下设备上遇到问题。
我已经在应用程序级别build.gradle
文件中启用了Java 8,并且使用番石榴编写了一些代码来过滤列表,该列表在API级别22或以下设备的应用程序上崩溃了。
下面是我创建的用于测试问题的函数,它也像在Initializing predicate
中打印logcat
之后的原始崩溃一样崩溃:
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
...
private void testCrashFunction() {
Log.d("log", "Initializing predicate");
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean apply(@NullableDecl String input) {
return input.startsWith("A") || input.startsWith("J");
}
};
Log.d("log", "Created predicate");
List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
Log.d("log", "Filtering List...");
List<String> filteredList = Lists.newArrayList(Collections2.filter(names, predicate));
Log.d("log", "Filtered List");
}
我在主要活动中调用此函数。
下面是崩溃日志:
04-30 15:03:28.364 11555-11555/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp, PID: 11555
java.lang.NoClassDefFoundError: com.example.myapp.MainActivity$e
at com.example.myapp.MainActivity.F(MyApplication:440)
at com.example.myapp.MainActivity.onCreate(MyApplication:95)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
我也尝试过使用流而不是番石榴,但仍然没有用。
下面是我用于流的代码
private void testCrashFunction() {
List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
List<String> filteredList = names.stream().filter(input -> input.startsWith("A") || input.startsWith("J")).collect(Collectors.toList());
}
下面是我得到的错误:
04-30 15:23:41.476 11818-11818/com.example.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapp, PID: 11818
java.lang.NoSuchMethodError: No interface method stream()Ljava/util/stream/Stream; in class Ljava/util/List; or its super classes (declaration of 'java.util.List' appears in /system/framework/core-libart.jar)
at com.example.myapp.MainActivity.F(MyApplication:456)
at com.example.myapp.MainActivity.onCreate(MyApplication:96)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
启用Java 8后,番石榴可能会崩溃的问题。它以前工作正常,但在我将项目更新为java8和androidx之后,现在崩溃了(我认为这可能不是问题。
[如果您需要其他详细信息,请告诉我。
提前感谢:)
好。我想出了什么问题,这归功于@AmniX。
我相信最好把它放在这里,因为有人可能会在这个问题上浪费像我一样的时间。
在我正在从事的项目中,使用了番石榴jre代替了番石榴android
因此,请确保您是否遇到这种情况。只需将jre替换为android,如下所示
// don't use jre version in android
api 'com.google.guava:guava:29.0-jre'
// replace jre with android
api 'com.google.guava:guava:29.0-android'