1

我有一个 Android 应用程序,它通过 JSON Api 接收数据。然后我使用 Jackson ObjectMapper 转换数据。我还包含com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0在我的 build.gradle 中以确保正确处理 LocalDates。

重要提示:只要我通过 Android-Studio(通过 RUN 或 DEBUG)运行应用程序,一切都会按预期工作。

但是,如果我在发布模式下生成一个签名的 APK 并在电话上手动安装它,杰克逊会抱怨 LocalDate 类缺少构造函数。它的行为好像 datatype-jsr310 中的附加时间反序列化器没有包含在 Build 中?!

我也在调试模式下启用了proguard(正是为了测试这种东西)。还分析 APK 表明包含 jsr310 类。

这是我的gradle构建部分:

   buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            //debuggable = true
        }
        debug {
            debuggable true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

我还尝试将 Proguard 配置为忽略杰克逊:

-keep interface com.fasterxml** {
    <fields>;
    <methods>;
}
-keep class com.fasterxml** {
    <fields>;
    <methods>;
}

运行发布 apk 的 LogCat 中的 Stacktrace:

2020-06-15 14:25:15.732 14035-14082/? W/System.err: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDate` (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('2019-02-28')
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.my.model.modules.Timeline["dates"]->java.util.ArrayList[0])
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(Unknown Source:2)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(Unknown Source:4)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(Unknown Source:124)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(Unknown Source:73)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(Unknown Source:4)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(Unknown Source:47)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(Unknown Source:63)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(Unknown Source:40)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(Unknown Source:55)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(Unknown Source:48)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(Unknown Source:0)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(Unknown Source:26)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(Unknown Source:31)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(Unknown Source:14)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(Unknown Source:56)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.fasterxml.jackson.databind.ObjectReader.readValue(Unknown Source:21)
2020-06-15 14:25:15.732 14035-14082/? W/System.err:     at com.my.android.app.net.ws.WsQueueManager.transformFacade(Unknown Source:52)

DTO 是一个带有日期列表的简单类:

public class Timeline implements Serializable {

    // @JsonDeserialize(contentAs = LocalDate.class)
    // @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    // ^
    // | tried both annotations separated and together with same result
    public List<LocalDate> dates;

    public LevelTimeline() {
    }

    public List<LocalDate> getDates() {
        return dates;
    }

    public void setDates(List<LocalDate> dates) {
        this.dates = dates;
    }
}

最后的问题

发布版本与调试版本有何不同。
Proguard 缩小似乎并非如此,因为课程可用?!
这可能是与proguard相关的其他东西吗?
任何帮助或提示表示赞赏!

4

0 回答 0