NullPointerException-那些牛逼的大厂有哪些傻貂的操作

网易即时通讯的沙雕操作

背景

很久以前的事了。造成了崩溃率上升。

APP发现有很多oom,于是做个优化吧,优化里有这么一个操作,低内存的时候清除一下内存中图片glide的缓存。

发生问题

于是在application里的onLowMemory方法里:
(我记得是这个方法,已经很久远了,可能记得不太清,总之是调的glide的方法)

Glide.get(instance).clearMemory();

可惜万万没想到,APP内集成了网易即时通讯的uikit这个demo,连改都没有改。

这个demo里也引用了Glide图片缓存库,有这么一个类:NIMGlideModule
他做了这么个操作:

    private static final String TAG = "NIMGlideModule";

    private static final int M = 1024 * 1024;
    private static final int MAX_DISK_CACHE_SIZE = 256 * M;

    /**
     * ************************ Memory Cache ************************
     */

    static void clearMemoryCache(Context context) {
        Glide.get(context).clearMemory();
    }

    /**
     * ************************ GlideModule override ************************
     */
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // sdcard/Android/data/com.netease.nim.demo/glide
        final String cachedDirName = "glide";
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cachedDirName, MAX_DISK_CACHE_SIZE));
        LogUtil.i(TAG, "NIMGlideModule apply options, disk cached path=" + context.getExternalCacheDir() + File.pathSeparator + cachedDirName);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

乍一看,没什么问题是吧。但是APP上线之后问题就出在这里了。
为什么呢,先记住这里的LogUtil,打印日志的tag是static的。可能说到这里,有些人就知道怎么回事了。我们看一下网易的LogUtil:

 public static void d(String tag, String msg) {
        log.d(buildTag(tag), buildMessage(msg));
    }
    protected static String buildTag(String tag) {
        return TextUtils.isEmpty(process) ? tag : "[" + process + "]" + tag;
    }

logutil后面还有很多内容就不需要看了,他从来没有对tag进行非空判断。

看吧,低内存的时候,Android系统会干什么?

没错,优先清除static变量,呵呵?。

于是低内存的时候,我在清理Glide中内存的缓存,而网易即时通讯的uikit,却在配置Glide的地方,打印了一个static修饰的tag的日志,并且这个tag被回收,变为null。

于是造成了空指针崩溃。

我尼玛骚操作。tag能用static的还不判空。

解决

崩溃率上升了,怎么办?发版本修复啊,没有热更新我能怎么办,我也很崩溃啊。

扯扯犊子

骚。真的骚。

你可能感兴趣的:(趟坑,Android,大厂,网易即时通讯,空指针,程序人生)