Я получаю следующее исключение после запуска моего приложения с помощью 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, но не смог решить проблему.
-keep class java.nio.file.** { *; }
-keep class java.nio.file.LinkOption { *; }
-keepclassmembers class java.nio.file.* {
<fields>;
<init>();
<methods>;
}
Я попытался обновить 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 и обновлю таблицу выше.
Любые мысли о том, что я мог пропустить или не сделать?
@ Роберт, мне кажется странным, что он падает только тогда, когда он запутан, но не падает, когда я устанавливаю minifyEnabled false
. Приложение работает на предыдущей версии, но эта новая версия не работает. Я также добавил новые зависимости.
Оказывается, проблема с версией инструментов сборки 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.
Я до сих пор не уверен, почему это так, мне придется исследовать. Но если у вас есть информация. Пожалуйста, прокомментируйте.
Класс
java.nio.file.LinkOption
не является частью приложения, а является частью Android API, поэтому вы не можете его сохранить. Дело не в том, что класс доступен только в API 26+, поэтому вам нужно установить для minSDK значение 26, чтобы иметь возможность использовать этот класс. developer.android.com/reference/java/nio/file/LinkOption поскольку вы не используете версию nio для дешугаринга, этот класс отсутствует.