Moshi/retrofit 启用 R8 缩小后单个 Int 字段出错
Moshi/retrofit error with one single Int field after enabling R8 minify
在启用 minify 后解析来自 JSON 响应的单个字段时遇到问题,禁用 minify 后一切正常:
改造API调用:
@FormUrlEncoded
@POST("/api/test")
fun test(@Field <some String fields>
): Observable<Response<TestListing>>
包装在 repo
override fun test(<some String fields>): Observable<Response<TestListing>> {
return api.test(<some String fields>)
.subscribeOn(schedulers.io())
}
型号:
data class TestListing (
@Json(name = "success") val success:Int,
@Json(name = "user") val user: TestUser?
)
测试用户class
data class TestUser(
@Json(name = "id") val id: Int,
@Json(name = "email") val email: String,
@Json(name = "name") val name: String,
@Json(name = "key") val remix_userkey: String,
@Json(name = "downloads_limit") val downloads_limit: Int?,
<some other fields>
)
最后在 viewModel 中调用它
fun test(<some String fields>){
compositeDisposable.add(testRepo.test(<some String variables>)
.subscribeOn(schedulers.io())
.observeOn(schedulers.main())
.subscribe ({ testList ->
testListDebug.postValue(testList)
if (testList.isSuccessful) user.postValue(userList.body()?.user)
else {<some error posting>}
})
{ throwable -> <some actions>})
}
所以没有 minifyEnabled 它解析这个 JSON
{"success":1,"user":{"id":"123456","email":"test@test.com","name":"Test","remix_userkey":"abcd123abcd","downloads_limit":15}}
正确地,在我启用 minify 之后 - id 字段始终为 0。
相同JSON,但它以某种方式包装在正文中 id=0 的改造响应中(所有其他字段都已正确解析)
API 调用后调试器的 testListDebug 值示例
尝试在 proguard-rules.pro 文件中添加所有库规则,但没有效果;还尝试将 @Keep 注释添加到 TestUser class 并重命名 id 字段
我可以从这里挖掘哪里?是关于Moshi还是Retrofit/Okhttp?
弄清楚了 - 需要保留自定义 moshi 注释 class,它用于在其他 API 调用中解析某些字段(有时是 Int,有时是 Boolean),但未使用这里。添加 keep 注释后,id 解析正常
非常奇怪的行为,因为这里没有使用这个注释
在启用 minify 后解析来自 JSON 响应的单个字段时遇到问题,禁用 minify 后一切正常:
改造API调用:
@FormUrlEncoded
@POST("/api/test")
fun test(@Field <some String fields>
): Observable<Response<TestListing>>
包装在 repo
override fun test(<some String fields>): Observable<Response<TestListing>> {
return api.test(<some String fields>)
.subscribeOn(schedulers.io())
}
型号:
data class TestListing (
@Json(name = "success") val success:Int,
@Json(name = "user") val user: TestUser?
)
测试用户class
data class TestUser(
@Json(name = "id") val id: Int,
@Json(name = "email") val email: String,
@Json(name = "name") val name: String,
@Json(name = "key") val remix_userkey: String,
@Json(name = "downloads_limit") val downloads_limit: Int?,
<some other fields>
)
最后在 viewModel 中调用它
fun test(<some String fields>){
compositeDisposable.add(testRepo.test(<some String variables>)
.subscribeOn(schedulers.io())
.observeOn(schedulers.main())
.subscribe ({ testList ->
testListDebug.postValue(testList)
if (testList.isSuccessful) user.postValue(userList.body()?.user)
else {<some error posting>}
})
{ throwable -> <some actions>})
}
所以没有 minifyEnabled 它解析这个 JSON
{"success":1,"user":{"id":"123456","email":"test@test.com","name":"Test","remix_userkey":"abcd123abcd","downloads_limit":15}}
正确地,在我启用 minify 之后 - id 字段始终为 0。
相同JSON,但它以某种方式包装在正文中 id=0 的改造响应中(所有其他字段都已正确解析)
API 调用后调试器的 testListDebug 值示例
尝试在 proguard-rules.pro 文件中添加所有库规则,但没有效果;还尝试将 @Keep 注释添加到 TestUser class 并重命名 id 字段
我可以从这里挖掘哪里?是关于Moshi还是Retrofit/Okhttp?
弄清楚了 - 需要保留自定义 moshi 注释 class,它用于在其他 API 调用中解析某些字段(有时是 Int,有时是 Boolean),但未使用这里。添加 keep 注释后,id 解析正常
非常奇怪的行为,因为这里没有使用这个注释