目前我面临这个奇怪的问题。
我已经创建了retrofit实例,并且有两个api接口。 ApiClientOld 接口实现了 ApiClient 接口并重写了基本方法。
我正在创建对两个接口进行改造的实例。但两个实例都引用了基本方法。
请检查下面的示例代码。
下面的示例在调试模式下工作正常,但在发布模式下无法工作。
我很好奇为什么代码会这样工作。 请有人帮我解决这个问题吗?预先感谢!
interface ApiClient {
@GET("owner/details")
suspend fun getDetails(): Response<Details>
}
interface ApiClientOld : ApiClient {
@GET("user/details")
override suspend fun getDetails(): Response<Details>
}
fun createApiClient(retrofit: Retrofit, useOld: Boolean): ApiClient {
return if (useOld)
retrofit.create(ApiClientOld::class.java)
else
retrofit.create(ApiClient::class.java)
}
suspend fun makeAPI(retrofit: Retrofit) {
val apiClient = createApiClient(retrofit, useOld=true)
val response = apiClient.getDetails()
// This should call the overridden method in ApiClientOld (user/details path)
// But It is calling the base ApiClient (owner/details path)
}
makeAPI函数应该从派生接口调用api(用户/详细信息)。但它正在调用基本接口方法(所有者/详细信息)。 -- 仅在发布模式下
发布配置:
{
debuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
请在发布配置中制作
minifyEnabled false
。再试一次
因此,由于这个问题与混淆有关,那么另一个选择是通过使用@Keep注释来自定义要防止混淆的代码。
@Keep
interface ApiClientOld : ApiClient {
@GET("user/details")
override suspend fun getDetails(): Response<Details>
}