一、背景
在发贝壳2.1.1版本第一次灰度时遇到了一个崩溃(崩溃在租房),第二次灰度版本时发生了相同原因的崩溃(崩在了二手)。 当时的做法是发现一处解决一处, 但没发现的隐藏问题是个定时炸弹。
日志:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.homelink.customer.host.manage.model.response.HostCommentBean) at android.os.Parcel.writeSerializable(Parcel.java:1823) at android.os.Parcel.writeValue(Parcel.java:1771) at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)
二、问题原因
这个crash的原因是当前类实现了Serializable接口,但成员数据类型未实现Serializable接口, 导致Activity/Fragment在用Intent传值时出现序列化错误,最终崩在了1823行。
try {
1817 ObjectOutputStream oos = new ObjectOutputStream(baos);
1818 oos.writeObject(s);
1819 oos.close();
1820
1821 writeByteArray(baos.toByteArray());
1822 } catch (IOException ioe) {
1823 throw new RuntimeException("Parcelable encountered " +
1824 "IOException writing serializable object (name = " + name +
1825 ")", ioe);
1826 }
###三、解决思路
现有项目代码存在序列化崩溃的潜在风险,如何使用技术手段找出来呢? 以后如何不再犯相同错误? 现有的Lint、FindBugs、CheckStyle是备选方案, 最终因为Lint可以实时检查并智能提醒而选择使用Lint实现,即用工具实时提醒开发人员潜在风险。
