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 解析正常

非常奇怪的行为,因为这里没有使用这个注释