我正在尝试构建一个使用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
所需的规则吗?
我的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
的其他东西!?
我的依赖关系看起来像这样:
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
api "com.squareup.retrofit2:converter-gson:$retrofitVersion"
我试图摆脱最后一个上的api
,因为我在使用这个库的应用程序中不需要它(或者这是不可避免的)?
嗯,也许proguard是错误的关键字。实际上问题在于使用implementation
而不是api
。因此,依赖关系不会暴露给消费者。请参阅https://stackoverflow.com/a/44493379/2170109。
但我不明白为什么只有图书馆调用converter-gson
时才需要向我的图书馆的消费者展示GsonBuilder
?
答案 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'
如果有更多错误,您可以共享错误日志以解释究竟是什么问题。