framework奔溃思考

 安卓bug尤其是crash,一旦测出来肯定得改。这种遗留bug让人痛苦不堪,下面就framework框架bug导致思考一下人生。

改bug很多时候想复现,但是框架层bug一般都是这样的

java.lang.NullPointerException: java.lang.NullPointerException
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2803)
        at android.view.View.getDisplayList(View.java:12709)
        at android.view.View.getDisplayList(View.java:12755)
        ...
        at android.widget.FrameLayout.draw(FrameLayout.java:467)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2211)
        at android.view.View.getDisplayList(View.java:12711)
        at android.view.View.getDisplayList(View.java:12755)
        at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1205)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2193)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2065)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1874)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1009)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4418)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
        at android.view.Choreographer.doCallbacks(Choreographer.java:562)
        at android.view.Choreographer.doFrame(Choreographer.java:532)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5063)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
你发现奔溃了,但是你自己项目代码一个都没有。

这里面很简单。就是你使用framework一些api,但是很明显踩到坑了。所以奔溃了。

定位问题所在

1.现象

2代码

如果测试发现可以复现,找他们复现,再看你代码哪儿动了。

如果不可以复现,自己想办法复现。

去monkey跑一跑,看看行不行。如果可以,那太好了。把安卓项目导入debug模式,在uncaughtexception打断点。

如果不可以的话,看看线上奔溃样本多不多。看看用户入口出口在哪。


下面再列出比较好分析的地方。

1.framework打断点,不过断点可以加一些条件,条件符合才断下。这个时候你可以看现场任何信息,参考Activity信息。堆栈调用情况。

2dump内存信息,对OOMbug非常爽。一般应用层不做图片视频处理OOM原因大多数是内存泄露。dump内存看看引用关系

3如果自己对framework不是特别熟悉,可以学习一下再改这个bug

4比如一开始列出一个堆栈奔溃,你无法知道谁调的。可以先学习一下framework,Choregrapher。如果你压根不知道他是干什么的,最好不要改这个bug。

然后学习一下,完了发现这个Handler是事件驱动模型,所以真正调用的情况还是再在Framework里面断点一下Message消息,其实Handler断点,知道一个

驱动模型也是Framework里面的,所以这种bug最好还是懂framework的人改比较好


最后,如果一个bug,monkey无法复现。线上无法复现,堆栈全是framework的。怎么办,那不改了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值