安卓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的。怎么办,那不改了。