Android: проект библиотеки с результатами Retrofit в NoClassDefFoundError

Я пытаюсь создать проект библиотеки Android, который использует OkHttp и Retrofit для предоставления доступа к нашему REST-бэкэнду.

Кажется, работает, пока я использую api вместо implementation на моей зависимости от gradle для com.squareup.retrofit2:converter-gson, Кажется, что это единственная зависимость, которая нуждается в этом (все остальные могут использоваться с implementation).

Когда используешь implementation здесь также произойдет сбой вызывающего приложения NoClassDefFoundError:

java.lang.NoClassDefFoundError: Ошибка разрешения: Lcom/google/gson/GsonBuilder;


я использую consumerProguardFiles с кучей proguard-rule-files (например, один для okhttp3, retrofit2 и т. д. из этого репозитория). Все это затем будет упаковано в AAR, поэтому также следует добавить правила из зависимостей.

Кажется, что я пропускаю правило proguard для converter-gson, Может кто-нибудь опубликовать правила, необходимые для использования com.squareup.retrofit2:converter-gson в проекте библиотеки?


Редактировать 1

Мое текущее правило proguard для модернизации:

# Retrofit 2.X
## https://square.github.io/retrofit/ ##

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

Как уже упоминалось, этого кажется недостаточно. Может быть, мне нужно что-то еще для converter-gson!?

Редактировать 2

Мои зависимости выглядят так:

implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
api "com.squareup.retrofit2:converter-gson:$retrofitVersion"

И я пытаюсь избавиться от api на последнем, поскольку мне не нужно это в приложении, использующем эту библиотеку (или это не избежать)?


Редактировать 3

Хм, возможно, proguard - это не то ключевое слово. На самом деле проблема заключается в использовании implementation над api, Таким образом, зависимости не будут выставлены потребителям. См. /questions/40907559/v-chem-raznitsa-mezhdu-realizatsiej-i-kompilyatsiej-v-gradle/40907562#40907562.

Но я не понимаю, почему мне нужно разоблачить converter-gson потребителям моей библиотеки, когда звонит только библиотека GsonBuilder?

1 ответ

Согласно официальной ссылке на github:

https://github.com/square/retrofit

Для модернизации требуется как минимум Java 7 или Android 2.3.

Если вы используете ProGuard, вам нужно добавить следующие параметры:

# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain service method parameters.
-keepclassmembernames,allowobfuscation interface * {
    @retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

# My personal proguard configuration for ratrofit2
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn retrofit2.Platform$Java8

пожалуйста, проверьте вашу конфигурацию, если есть ошибки:

app-> build.gradle

// retrofit gson

implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

Если есть больше ошибок, вы можете поделиться своим журналом ошибок, чтобы объяснить вам, в чем именно проблема.

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