Компиляция ошибки сборки Xamarin не может быть завершена, потому что отсутствуют некоторые библиотечные классы - PullRequest
2 голосов
/ 04 апреля 2020

Когда я пытаюсь построить свой проект Xamarin.Droid, я получаю следующую ошибку сборки:

2>R8 : warning : Missing class: java.lang.ClassValue
2>R8 : error : Compilation can't be completed because some library classes are missing.

Я получаю эту ошибку из одного дня в другой ... Есть ли способ узнать, где java .lang.ClassValue требуется, или добавить его вручную?

Редактировать: Я провел некоторое исследование и получил новую информацию: когда я строю решение на другом компьютере (в данном случае это Microsoft AppSenter), он создается без каких-либо проблем. , Поэтому я подумал, что мое решение в порядке, может быть, есть проблемы с android SDK или JDK. Поэтому я создал новый проект Xamarin.Forms и собрал часть android, которая работала без проблем. Так что android sdk или jdk вроде бы в порядке.

1 Ответ

1 голос
/ 06 апреля 2020

Не то чтобы это точно решение, но оно может указать вам правильное направление. В настоящее время я получаю это сообщение в результате связанной Android -библиотеки под нашим собственным обслуживанием. Когда я удаляю NuGet из нашего проекта, сообщение исчезает и код компилируется. Очевидно, что и я не могу использовать возможности программы, используя эту библиотеку, но, по крайней мере, похоже, что библиотека является причиной проблемы ... Может быть, это может быть то же самое в вашем случае?


Что устранило проблему для меня

После того, как я узнал, какая библиотека вызывает проблемы, я решил немного углубиться в нее с помощью демонстрационного приложения, которое я написал специально для тестирования этой библиотеки. Отсюда я узнал, что включение d8-dexing или r8-code-shrinking вместе с multi-dexing является причиной проблемы. Вы можете использовать либо, либо, так:

  • Поворот опций сжатия кода, таких как ProGuard или r8, и использовать d8-dexing.
  • Поворот мульти-dexing, используйте d8- dexing и, возможно, усадку кода больше не требуется мультидексинг.

    Кроме того, кажется, что указанное выше разрешение не очень хорошо работает со связыванием, поэтому установите для параметров связывания значение "Нет".

    Проблемы в Ма c CI

    После того, как я исправил все вышеперечисленное, у меня возникла еще одна проблема при попытке скомпилировать наше приложение на Ma c CI, которое сообщало мне Mono. Android .dll не могло быть AOT -compiled. Это, по-видимому, проблема с файлом, слишком большим для LLVM на Ma c, хотя, как описано здесь , для решения которого нужно просто отключить LLVM.


    Лучший способ исправить это

    Сегодня я указал на другой набор потенциальных исправлений, выделенных здесь . На этой странице на самом деле упоминаются три исправления, из которых опция B является предпочтительной, поскольку она соответствует «рекомендациям восходящего потока библиотеки Google Guava » (цитируется с этот поток ).

    Для меня вариант А - возврат к dx-dexing - не совсем сработал, так как, хотя я смог удалить предупреждение, относящееся к java .lang.ClassValue, Я получил кучу других предупреждений назад. Вариант B, использующий правила ProGuard, используемые в сочетании с R8, был лучшим выбором в этом отношении, поскольку это позволило мне также избавиться от всех других предупреждений. На самом деле, однако, это устранило разницу между опциями B & C, так как их результат стал таким же. Тем не менее, просто следуя рекомендациям в этом документе, мое приложение начало падать при запуске. Чтобы решить эту проблему, я должен был проверить на наличие ошибок в Logcat, который показал мне, что необходимый класс связывался. Добавление еще одного правила для явного сохранения этого класса, а затем окончательно решило оставшуюся проблему, предоставив мне следующую конфигурацию ProGuard:

    -dontwarn java.lang.ClassValue
    -dontwarn kotlin.jvm.internal.Lambda
    -dontwarn kotlin.jvm.functions.Function1
    -dontwarn kotlin.jvm.internal.markers.KMappedMarker
    -dontwarn kotlin.jvm.functions.Function0
    -dontwarn kotlin.coroutines.jvm.internal.SuspendLambda
    -dontwarn kotlin.jvm.functions.Function2
    -keep class com.google.android.material.internal.BaselineLayout
    

    С этой конфигурацией я теперь снова могу использовать как AOT, так и LLVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...