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

Posted 太书红叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NullPointerException-那些牛逼的大厂有哪些傻貂的操作相关的知识,希望对你有一定的参考价值。

网易(我母公司啊)即时通讯的沙雕操作

背景

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

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

发生问题

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

Glide.get(instance).clearMemory();

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

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

    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的还不判空。

解决

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

扯扯犊子

骚。真的骚。

以上是关于NullPointerException-那些牛逼的大厂有哪些傻貂的操作的主要内容,如果未能解决你的问题,请参考以下文章

盘点那些牛逼却不为人所知的软件

那些只有几行,但是却非常牛逼的代码!

web开发有那些牛逼东西可以用

盘点那些牛逼却不为人所知的软件

那些牛逼互联网公司里技术团队的博客

JME3 引擎和 nullPointerException