记一次诡异的Bug

本文约 800 字,阅读需 2 分钟。

背景

上周四的时候,发了一个maven,结果报ExceptionInInitializerError错误:

java.lang.ExceptionInInitializerError
        at repackage.aw.̍(ProGuard:43)
        at com.tencent.sandbox.PluginHelper.applicationAttachBaseContext(ProGuard:160)
        ......
 Caused by: java.lang.IllegalArgumentException: Illegal pattern character 'V'
        at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:870)
        at java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:684)
        at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:623)
        at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:598)
        at repackage.aw.<clinit>(ProGuard:31)
        at repackage.aw.̍(ProGuard:43)
        at com.tencent.sandbox.PluginHelper.applicationAttachBaseContext(ProGuard:160)

当时由于别人需要提测,就把StringFog给关了(因为从错误信息来看是SimpleDateFormat的参数错误了),果然好了。

分析

由于StringFog最后上线必须要用,于是便打开了这个开关,继续排查这个问题。蛋疼的是这个问题再也无法出现了。 于是就把那天下午上传过的十几次aar包,一个一个尝试,终于找到了有问题那次,反编译发现那一次的dex包,加密后的字符串都是错的,所以解密之后自然不对,进而导致了上面的问题,这个异常虽然陌生,但其实完全不是本质,本质是Dex加密后的字符串都是错的,无法解密。

但是从各方面看,当次加密的key也是没变的,那么为什么单单就这一次不行了呢? 很可惜,由于是本地编译上传的,已经没有了当时的代码现场,所以这个问题到底是怎么制造出来的也无从考证了。

而且,这次依赖编出来的包覆盖安装,首次启动时,会有以下错误:

E/zygote: Dex checksum does not match for dex: /data/data/com.example.******/app_dex/******.dex.Expected: 2160062742, actual: 2571835326
W/zygote: Skipping duplicate class check due to unrecognized classloader

一开始以为是这个问题导致的,后来发现只有第一次会,并不影响,这个错误是说dex的checksum字段也有问题,说明这次产生的dex文件完全就是错的,不知道这个抽了什么风。

当前虽然加了一个字段,用来标记发布人、发布时间、发布的最近commit id,但是由于可能本地修改还没提交就发布依赖了,所以帮助不大~

    public static final String BUILD_UNIQUE_ID = "vimerzhao/2020-04-10/10:33:59/89a0fdbd27";

反思

即使是几个人的创新项目,也要注重开发流程的建设,比如每次发布必须都在CI上做,这样每次的源代码和编译产物都有快照,方便复现问题,以后要吸取教训,注重问题现场的保留和可重现

总阅读量次。