Приложение для Android аварийно завершилось с ошибкой java.lang.NoClassDefFoundError: не удалось разрешить: [Ljava/nio/file/LinkOption;

Я получаю следующее исключение после запуска моего приложения с помощью minifyEnabled true. Но если я прокомментирую это, приложение открывается просто отлично.

Ошибка

AndroidRuntime             E  FATAL EXCEPTION: main
Process: my.app.android, PID: 24808
java.lang.NoClassDefFoundError: Failed resolution of: [Ljava/nio/file/LinkOption;
    at af.h.<clinit>(JavaFlexibleTypeDeserializer.kt:18)
    at pl.h.onCreate(MyApp.java:302)
    at my.app.android.MyBaseApp.onCreate(MyBaseApp.kt:1)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4707)
    at android.app.ActivityThread.-wrap1(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.nio.file.LinkOption" on path: DexPathList[[zip file "/data/app/my.app.android-2/base.apk"],nativeLibraryDirectories=[/data/app/my.app.android-2/lib/x86, /data/app/my.app.android-2/base.apk!/lib/x86, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at af.h.<clinit>(JavaFlexibleTypeDeserializer.kt:18) 
    at pl.h.onCreate(MyApp.java:302) 
    at my.app.android.MyBaseApp.onCreate(MyBaseApp.kt:1) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4707) 
    at android.app.ActivityThread.-wrap1(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Suppressed: java.lang.ClassNotFoundException: java.nio.file.LinkOption
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 14 more
    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

Расследования

Сохранение классов в Proguard

Я уже пробовал эти строки в своем файле proguard, но не смог решить проблему.

-keep class java.nio.file.** { *; }

-keep class java.nio.file.LinkOption { *; }

-keepclassmembers class java.nio.file.* {
    <fields>;
    <init>();
    <methods>;
}

Обновление версий Firebase

Я попытался обновить Firebase до последней версии, поскольку более ранняя трассировка стека показывает строку из FirebaseInitProvider, но ошибка Failed resolution of: [Ljava/nio/file/LinkOption; все еще отображается. Он был изменен на трассировку стека выше после того, как я обновил classpath "com.google.gms:google-services:4.3.14"

Обессахаривание

Я пробовал Desugaring с помощью Java 11 nio на основе: https://developer.android.com/studio/write/java11-default-support-table с использованием coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.1', но столкнулся с другой проблемой, когда FakeDependency.jar пуст. Вот ссылка на переполнение стека для этой проблемы: Дешугаринг Android с помощью nio Не удалось преобразовать FakeDependency.jar для соответствия атрибутам

Но Дешугаринг с помощью coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.1' отлично строит проект, но все еще имеет LinkOption трассировку стека, показанную выше.

Окружающая среда

Эта проблема возникает только тогда, когда я создаю приложение и устанавливаю его на устройство Android на уровне API 23 с помощью minifyEnabled true. Но запустить его на уровне API 33 — это нормально.

Ниже приведена таблица различных уровней API с настройкой minifyEnabled и их статусом после запуска установленного приложения.

| API Lvl | minifyEnabled | Status    |
| ------- | ------------- | --------- |
|      23 | true          | Crashed   |
|      23 | false         | Succeeded |
|      24 | true          | Crashed   |
|      24 | false         | Succeeded |
|      33 | true          | Succeeded |
|      33 | false         | Succeeded |

Я буду тестировать с уровнями API 25, 26 и 27 и обновлю таблицу выше.


Любые мысли о том, что я мог пропустить или не сделать?

Класс java.nio.file.LinkOption не является частью приложения, а является частью Android API, поэтому вы не можете его сохранить. Дело не в том, что класс доступен только в API 26+, поэтому вам нужно установить для minSDK значение 26, чтобы иметь возможность использовать этот класс. developer.android.com/reference/java/nio/file/LinkOption поскольку вы не используете версию nio для дешугаринга, этот класс отсутствует.

Robert 26.05.2023 23:35

@ Роберт, мне кажется странным, что он падает только тогда, когда он запутан, но не падает, когда я устанавливаю minifyEnabled false. Приложение работает на предыдущей версии, но эта новая версия не работает. Я также добавил новые зависимости.

Dhagz 27.05.2023 05:20
1
2
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, проблема с версией инструментов сборки gradle.

В нашем предыдущем выпуске мы использовали это:

dependencies {
    classpath "com.android.tools.build:gradle:7.0.2"
    ...
}

Но в нашем последнем выпуске мы использовали это:

dependencies {
    classpath "com.android.tools.build:gradle:7.4.2"
    ...
}

Мы возвращаемся к 7.0.2, чтобы обойти эту проблему для более ранних версий API.

Я до сих пор не уверен, почему это так, мне придется исследовать. Но если у вас есть информация. Пожалуйста, прокомментируйте.

Другие вопросы по теме