崩溃bug日志总结1

目录介绍

  • 1.1 java.lang.UnsatisfiedLinkError找不到so库异常
  • 1.2 java.lang.IllegalStateException非法状态异常
  • 1.3 android.content.res.Resources$NotFoundException
  • 1.4 java.lang.IllegalArgumentException参数不匹配异常
  • 1.5 IllegalStateException:Can't compress a recycled bitmap
  • 1.6 java.lang.NullPointerException空指针异常
  • 1.7 android.view.WindowManager$BadTokenException异常
  • 1.8 java.lang.ClassCastException类转化异常
  • 1.9 1.9 Toast运行在子线程问题,handler问题

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计47篇[近20万字],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

1.1 java.lang.UnsatisfiedLinkError

  • A.详细崩溃日志信息
    # main(1)
    java.lang.UnsatisfiedLinkError
    dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.paidian.hwmc-1/base.apk", dex file "/data/app/com.paidian.hwmc-1/base.apk"],nativeLibraryDirectories=[/data/app/com.paidian.hwmc-1/lib/arm64, /data/app/com.paidian.hwmc-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libijkffmpeg.so"
    
  • B.查看崩溃类信息
    • 这个异常类的大意是:如果Java虚拟机找不到声明为<code>本机</code>的方法的适当本机语言定义,则引发。
    public class UnsatisfiedLinkError extends LinkageError {
        private static final long serialVersionUID = -4019343241616879428L;
    
        public UnsatisfiedLinkError() {
            super();
        }
    
        public UnsatisfiedLinkError(String s) {
            super(s);
        }
    }
    
  • C.项目中异常分析
    • 根据实际项目可知,当准备播放视频时,找不到libijkffmpeg.so这个库,导致直接崩溃。
  • D.引发崩溃日志的流程分析
  • F.解决办法
    • 报这个错误通常是so库加载失败,或者找不到准备执行的JNI方法:
      • 1.建议检查so在安装的过程中是否丢失,没有放入指定的目录下;
      • 2.调用loadLibrary时检查是否调用了正确的so文件名,并对其进行捕获,进行相应的处理,防止程序发生崩溃;
      • 3.检查下so的架构是否跟设备架构一至(如在64-bit架构下调用32-bit的so)。
    • 代码展示
    ndk {
        //根据需要 自行选择添加的对应cpu类型的.so库。
        //abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'mips'
        abiFilters 'armeabi-v7a'
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        //这两个是必须要加的,其它的可供选择
        compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.4'
        compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.4'
        //其他库文件
        //compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
        //compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
        //compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
        //compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
    }
    

1.2 java.lang.IllegalStateException非法状态异常

  • A.详细崩溃日志信息
    • onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后
      再给它添加Fragment就会出错。
    IllegalStateException: Can not perform this action after onSaveInstanceState:
    
  • B.查看崩溃类信息
    • 在非法或不适当的时间调用方法的信号。换句话说,Java环境或Java应用程序没有处于请求操作的适当状态。
    public class IllegalStateException extends RuntimeException {
        public IllegalStateException() {
            super();
        }
    
        public IllegalStateException(String s) {
            super(s);
        }
    
        public IllegalStateException(String message, Throwable cause) {
            super(message, cause);
        }
    
        public IllegalStateException(Throwable cause) {
            super(cause);
        }
    
        static final long serialVersionUID = -1848914673093119416L;
    }
    
  • C.项目中异常分析
    • 分析
  • D.引发崩溃日志的流程分析
  • F.解决办法
    • 解决办法就是把commit()方法替换成 commitAllowingStateLoss()
  • G.其他延申
    • 错误类型大致为以下几种:
    java.lang.IllegalStateException:Can't change tag of fragment d{e183845 #0 d{e183845}}: was d{e183845} now d{e183845 #0 d{e183845}}
    java.lang.IllegalStateException:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 37 path $.data
    
    • 第一种:我在显示fragment的代码中使用了:fragment.show(getSupportFragmentManager, fragment.toString());而这里是因为两次toString()结果不同,导致不同的tag指向的是同一个fragment。获取fragment的tag的正确方法应该是使用其提供的fragment.getTag()方法。
    • 第二种:该异常是由于服务器错误返回的JSON字符串和服务器正常下时返回的JSON字符串结构不同,导致利用Gson解析的时候报了一个异常:本该去解析集合却强制去解析对象所致.解决办法:在使用Gson解析JSON时try cash一下,不报错按照正常逻辑继续解析,报异常则处理为请求失败逻辑即可.

1.3 android.content.res.Resources$NotFoundException

  • A.详细崩溃日志信息
    • Android资源不是可绘制的(颜色或路径)
    Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f040151 a=2}
    android.view.LayoutInflater.createView(LayoutInflater.java:620)
    
  • B.查看崩溃类信息
    • 当找不到请求的资源时,资源API将引发此异常。
    public static class NotFoundException extends RuntimeException {
        public NotFoundException() {
        }
    
        public NotFoundException(String name) {
            super(name);
        }
    
        public NotFoundException(String name, Exception cause) {
            super(name, cause);
        }
    }
    
  • C.项目中异常分析
    • 由于将图片资源拷贝到了drawable-land-xhdpi目录下,本来应该拷贝到drawable-xhdpi目录下。
  • D.引发崩溃日志的流程分析
  • F.解决办法
    • 1.引用的资源ID 是否能匹配到R.java文件中定义的资源;
    • 2.是否因为缓存等原因导致编译APK时未把资源文件打包进去,可以把APK反编译检查下;
    • 3.是否使用了一个错误的类型来引用了某个资源或者配置资源时存在错误;
    • 4.是否将Int等整型变量作为了参数传给了View.setText调用,这种情况下该整型变量将被认为是一个资源ID号去资源列表中查找对应的资源,导致找不到对应资源错误;解决方法是做类型转换View.setText(String.valueOf(Int id))。

1.4 java.lang.IllegalArgumentException参数不匹配异常

  • A.详细崩溃日志信息
  • B.查看崩溃类信息
    • 参数不匹配异常,通常由于传递了不正确的参数导致。
    public class IllegalArgumentException extends RuntimeException {
        public IllegalArgumentException() {
            super();
        }
    
        public IllegalArgumentException(String s) {
            super(s);
        }
    
        public IllegalArgumentException(String message, Throwable cause) {
            super(message, cause);
        }
    
    
        public IllegalArgumentException(Throwable cause) {
            super(cause);
        }
    
        private static final long serialVersionUID = -5365630128856068164L;
    }
    
  • C.项目中异常分析
  • D.引发崩溃日志的流程分析
  • F.解决办法
  • G.常见的出现场景
    • Activity、Service状态异常;
    • 非法URL;
    • UI线程操作。
    • Fragment中嵌套了子Fragment,Fragment被销毁,而内部Fragment未被销毁,所以导致再次加载时重复,在onDestroyView() 中将内部Fragment销毁即可
    • 在请求网络的回调中使用了glide.into(view),view已经被销毁会导致该错误

1.5 IllegalStateException:Can't compress a recycled bitmap

  • A.详细崩溃日志信息
    • 无法压缩回收位图
    Can't compress a recycled bitmap
    com.paidian.hwmc.utils.i.a(FileUtils.java:75)
    
  • B.查看崩溃类信息
    • 如果位图已被回收,则希望抛出异常的方法将调用此值。知道了崩溃的具体位置,就该分析具体的原因呢!
    public boolean compress(CompressFormat format, int quality, OutputStream stream) {
        checkRecycled("Can't compress a recycled bitmap");
        //省略代码
        return result;
    }
    
    //如果位图已被回收,则希望抛出异常的方法将调用此值。
    private void checkRecycled(String errorMessage) {
        if (mRecycled) {
            throw new IllegalStateException(errorMessage);
        }
    }
    
  • C.项目中异常分析
    • 使用了已经被释放过内存的对象。对于Bitmap:Bitmap bitmap=一个bitmap对象。使用过程中调用bitmap.recycle(),之后再使用bitmap就会报错。
  • D.引发崩溃日志的流程分析
    • bitmap.recycle()解释如下所示,释放与此位图关联的本机对象,并清除对像素数据的引用。这将不会同步释放像素数据;它只允许在没有其他引用的情况下对其进行垃圾收集。位图被标记为“死”,这意味着如果调用getPixels()或setPixels(),它将抛出异常,而不会绘制任何内容。此操作不能反转,因此只有在确定没有进一步使用位图的情况下才应调用该操作。这是一个高级调用,通常不需要调用,因为当没有对此位图的引用时,普通GC进程将释放此内存。
    Free the native object associated with this bitmap, and clear the reference to the pixel data
    
  • F.解决办法
    • 第一种:在使用bitmap前增加判断,if (mBitmap.isRecycled()) return null;
    • 第二种:

1.6 java.lang.NullPointerException空指针异常

  • A.详细崩溃日志信息
    Please call the AutoSizeConfig#init() first
    com.paidian.hwmc.base.BaseApplication.initAutoSizeConfig(BaseApplication.java:386)
    
  • B.查看崩溃类信息
    • 空指针异常,也是十分常见的一个异常
    public class NullPointerException extends RuntimeException {
        private static final long serialVersionUID = 5162710183389028792L;
        public NullPointerException() {
            super();
        }
        public NullPointerException(String s) {
            super(s);
        }
    }
    
  • C.项目中异常分析
    • 空指针发生场景较多,是指某一个对象报null,这个使用去使用它的话就i会报该异常。
  • D.引发崩溃日志的流程分析
  • F.解决办法
    • 空指针最为常见,也最容易规避,使用的时候一定要进行null check,采取不信任原则:
      • 1.方法形参要判空后才使用;
      • 2.全局变量容易被系统回收或者更改,使用全局变量前建议判空;
      • 3.第三方接口的调用,对返回值进行判空。
      • 4.请注意线程安全

1.7 android.view.WindowManager$BadTokenException异常,Toast报错Unable to add window

  • A.详细崩溃日志信息
    android.view.WindowManager$BadTokenException
        Unable to add window -- token android.os.BinderProxy@7f652b2 is not valid; is your activity running?
    
  • B.查看崩溃类信息
    • 查询报错日志是从哪里来的
    • image
  • C.项目中异常分析
  • D.引发崩溃日志的流程分析
    • 这个异常发生在Toast显示的时候,原因是因为token失效。通常情况下,一般是不会出现这种异常。但是由于在某些情况下, Android进程某个UI线程的某个消息阻塞。导致 TN 的 show 方法 post 出来 0 (显示) 消息位于该消息之后,迟迟没有执行。这时候,NotificationManager 的超时检测结束,删除了 WMS 服务中的 token 记录。删除 token 发生在 Android 进程 show 方法之前。这就导致了上面的异常。
    • 测试代码。模拟一下异常的发生场景,其实很容易,只需要这样做就可以出现上面这个问题
     Toast.makeText(this,"潇湘剑雨-yc",Toast.LENGTH_SHORT).show();
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
  • F.解决办法
    • 目前见过好几种,思考一下那种比较好……
    • 第一种,既然是报is your activity running,那可以不可以在吐司之前先判断一下activity是否running呢?
    • 第二种,抛出异常增加try-catch,代码如下所示,最后仍然无法解决问题
      • 按照源码分析,异常是发生在下一个UI线程消息中,因此在上一个ui线程消息中加入try-catch是没有意义的。而且用到吐司地方这么多,这样做也不方便啦!
    • 第三种,那就是自定义类似吐司Toast的view控件。个人建议除非要求非常高,不然不要这样做。毕竟发生这种异常还是比较少见的
  • G.哪些情况会发生该问题?
    • UI 线程执行了一条非常耗时的操作,比如加载图片等等,就类似上面用 sleep 模拟情况
    • 进程退后台或者息屏了,系统为了减少电量或者某种原因,分配给进程的cpu时间减少,导致进程内的指令并不能被及时执行,这样一样会导致进程看起来”卡顿”的现象
    • 当TN抛出消息的时候,前面有大量的 UI 线程消息等待执行,而每个 UI 线程消息虽然并不卡顿,但是总和如果超过了 NotificationManager 的超时时间,还是会出现问题

1.8 java.lang.ClassCastException类转化异常

  • A.详细崩溃日志信息
    android.widget.FrameLayout cannot be cast to android.widget.RelativeLayout
    com.paidian.hwmc.goods.activity.GoodsDetailsActivity.initView(GoodsDetailsActivity.java:712)
    
  • B.查看崩溃类信息
    • 抛出以指示代码试图将对象强制转换为它不是实例的子类。
    public class ClassCastException extends RuntimeException {
        private static final long serialVersionUID = -9223365651070458532L;
    
    
        public ClassCastException() {
            super();
        }
    
        public ClassCastException(String s) {
            super(s);
        }
    }
    
  • C.项目中异常分析
    • 该异常表示类型转换异常,通常是因为一个类对象转换为其他不兼容类对象抛出的异常,检查你要转换的类对象类型。
  • D.引发崩溃日志的流程分析
  • F.解决办法
    • 一般在强制类型转换时出现,例如如果A向B转换,而A不是B的父类时,将产生java.lang.ClassCastException异常。一般建议做这时要使用instanceof做一下类型判断,再做转换。
    • 该案例中,需要把FrameLayout更改成RelativeLayout就可以呢

1.9 Toast运行在子线程问题,handler问题

  • A.详细崩溃日志信息
    • 先来看看问题代码,会出现什么问题呢?
    new Thread(new Runnable() {
        @Override
        public void run() {
            ToastUtils.showRoundRectToast("潇湘剑雨-杨充");
        }
    }).start();
    
    • 报错日志如下所示:
    • image
  • 然后找找报错日志从哪里来的
    • image
      image
  • 子线程中吐司的正确做法,代码如下所示
    new Thread(new Runnable() {
        @Override
        public void run() {
            Looper.prepare();
            ToastUtils.showRoundRectToast("潇湘剑雨-杨充");
            Looper.loop();
        }
    }).start();
    
  • 得出的结论
    • Toast也可以在子线程执行,不过需要手动提供Looper环境的。
    • Toast在调用show方法显示的时候,内部实现是通过Handler执行的,因此自然是不阻塞Binder线程,另外,如果addView的线程不是Loop线程,执行完就结束了,当然就没机会执行后续的请求,这个是由Hanlder的构造函数保证的。可以看看handler的构造函数,如果Looper==null就会报错,而Toast对象在实例化的时候,也会为自己实例化一个Hanlder,这就是为什么说“一定要在主线程”,其实准确的说应该是 “一定要在Looper非空的线程”。
    • Handler的构造函数如下所示:
    • image
    • image

关于其他内容介绍

01.关于博客汇总链接

02.关于我的博客

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,363评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • Given two binary strings, return their sum (also a binary...
    ShutLove阅读 196评论 0 0
  • 刚开始知道双十一光棍节这个东西的时候,刚好恋爱半年,就想着,嘿嘿,我要过光棍节啊,过光棍节啊。 “邵先生,咱俩...
    滕小七阅读 446评论 0 1