android - Android:带翻新功能的库项目导致NoClassDefFoundError

标签 android gradle retrofit2 maven-publish

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

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

同样在此处使用implementation时,调用应用程序也会因NoClassDefFoundError而崩溃:

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/gson/GsonBuilder;



我正在将consumerProguardFiles与一堆proguard-rule文件一起使用(例如,来自repo的okhttp3,retrofit2等文件)。然后将所有这些内容打包到AAR中,因此也应添加依赖项中的规则。

看来我缺少converter-gson的保护规则。有人可以在图书馆项目中发布使用com.squareup.retrofit2:converter-gson所需的规则吗?

编辑1

我的current proguard-rule用于 retrofit :
# 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吗?

最佳答案

根据官方改造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'

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

关于android - Android:带翻新功能的库项目导致NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49030115/

相关文章:

java - 使用 Retrofit 库将嵌套 JSON 解析为 RecyclerView : Having a load data error

android - 改造-处理搜索选项中的无效数据

php - 2个用户同时更新mysql表数据

android - 使用 Google Fit 的 Android 应用程序中的 OAuth 同意屏幕空白

安卓 : How to set onClick event for Button in List item of ListView

java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

java - 使用 Gson 和改造的 Java 的 Json 错误 [预期为 BEGIN_ARRAY,但在第 1 行第 70 列路径 $.Data 处为 BEGIN_OBJECT]

android - 更新谷歌播放服务后,应用程序不会在非 4.4 设备上构建

android - 如何从build.gradle文件动态设置自定义权限的protectionLevel?

java - 从Grails2.x迁移后,Grails3 Java代码不能包含在项目中