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'
Если есть больше ошибок, вы можете поделиться своим журналом ошибок, чтобы объяснить вам, в чем именно проблема.