Android:带有Retrofit的库项目导致NoClassDefFoundError

时间:2018-02-28 12:55:17

标签: android gradle retrofit2 maven-publish

我正在尝试构建一个使用OkHttp和Retrofit来授予对我们REST后端的访问权限的android库项目。

只要我对api的gradle-dependency使用implementation而不是com.squareup.retrofit2:converter-gson,它似乎正常工作。似乎这是唯一需要这个的依赖(所有其他的都可以与implementation一起使用)。

在此处使用implementation时,调用应用会因NoClassDefFoundError而崩溃:

  

java.lang.NoClassDefFoundError:解析失败:Lcom / google / gson / GsonBuilder;

我使用consumerProguardFiles和一堆proguard规则文件(例如,一个用于okhttp3,翻译等来自此repo)。然后将所有这些打包到AAR中,因此也应该添加依赖项中的规则。

似乎我错过了converter-gson的proguard规则。有人可以发布在库项目中使用com.squareup.retrofit2:converter-gson所需的规则吗?

编辑1

我的current proguard-rule改造是:

# 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。因此,依赖关系不会暴露给消费者。请参阅https://stackoverflow.com/a/44493379/2170109

但我不明白为什么只有图书馆调用converter-gson时才需要向我的图书馆的消费者展示GsonBuilder

1 个答案:

答案 0 :(得分:0)

根据官方改造github链接:

https://github.com/square/retrofit

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-&GT;的build.gradle

// retrofit gson

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

如果有更多错误,您可以共享错误日志以解释究竟是什么问题。