资讯专栏INFORMATION COLUMN

如何定位framework层崩溃

Olivia / 2296人阅读

摘要:例如上例,只能定位到崩溃在这个方法中,而具体是由于哪个变量为空导致的空指针,则无能为力了。前提简单来说,用上述方法需要两个前提条件有崩溃发生的设备崩溃栈中有行数信息

在我们的漫漫解bug的路上,有一类bug是比较头疼的:崩溃在SDK实现代码中,例如下面这个:

  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)

这类bug往往是开发中的使用API不当,只是崩溃在SDK实现中。

头疼的是,虽然崩溃栈上有行数,但是由于Android版本和各种手机对源码都有修改,这个行数不是准确的,所以,从这个地方只能定位到函数。例如上例,只能定位到崩溃在ViewGroup#dispatchDraw这个方法中,而具体是由于哪个变量为空导致的空指针,则无能为力了。

如果是在开发中遇到这样的崩溃,能够复现,最简单的办法就是用Nexus系列手机,SDK版本能对上就能准确定位到问题出现的代码行数。这里不再详述。#Android开发一定要有亲儿子

如果实在后台发现这样的崩溃数据,如果你手上有产生这个崩溃的设备的话,那么下面的方法也许可以帮助定位问题。

找到SDK实现,反编译

这一步需要相应的设备,因为设备上是有SDK实现,有可能是jar包,有可能是odex,通常在 /system/framework里,在上述例子中,/system/framework/framework.jar就是要找的jar包。
根据找到的是jar包还是odex,选择不同的工具反编译。
反编译出来的smali代码中,会保留如下的行数信息:

.line 134
new-instance v0, Landroid/graphics/PointF;

invoke-direct {v0}, Landroid/graphics/PointF;->()V

iput-object v0, p0, Landroid/view/ViewGroup;->mLocalPoint:Landroid/graphics/PointF;

.line 147
const/4 v0, -0x1

iput v0, p0, Landroid/view/ViewGroup;->mLastTouchDownIndex:I

.line 178
iput v1, p0, Landroid/view/ViewGroup;->mLayoutMode:I
阅读smali代码,对比源码

找到smali代码中的行数,阅读附近的源码,对比一份版本相近的SDK源码,就算是定制的rom,源码也不会修改太多。根据这个,能找到具体崩溃在什么地方。

通过上述方法,找到崩溃对应的代码:

for (int i = 0; i < childrenCount; i++) {
    int childIndex = customOrder ? getChildDrawingOrder(childrenCount, i) : i;
    final View child = (preorderedList == null)
            ? children[childIndex] : preorderedList.get(childIndex);
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
        more |= drawChild(canvas, child, drawingTime);
    }
}

这个时候再定位问题就方便很多了。

前提

简单来说,用上述方法需要两个前提条件:

有崩溃发生的设备

崩溃栈中有行数信息

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12852.html

相关文章

  • 由浅入深 | 如何优雅地写一个Mesos Framework

    摘要:从的源代码可以看出实现得比较优雅它是一个代码。它最优的特点是消息在不同的之间传递,它抽象了,消息传递其实是一个事件的库。底层实际上依赖于,为了保证分布式存储最终一致性。如果想写一个,其实大部分时间在如何写好一个实现这一部分。 上周小数羞涩出镜,和数人云架构师春明一起为大家进行了在线直播的干货分享,今天小数抱来了实录,大家可以一睹为快啦!本文从Mesos的基础概念讲起,不懂Mesos的小...

    jzzlee 评论0 收藏0
  • 在 ReactNative 的 App 中,集成 Bugly 你会遇到的一些坑

    摘要:对于崩溃的收集,我主要关心两个部分是需要统计到正确的崩溃栈。统计到的崩溃栈要是易于阅读的。最方便的是,你直接点击崩溃栈的代码,会自动打开对应的文件。但是正是因为会在模式下,住我们的崩溃栈,从而会导致无法搜集到对应的崩溃也就无法进行上报。 showImg(https://segmentfault.com/img/remote/1460000011982644?w=900&h=500); ...

    ermaoL 评论0 收藏0
  • [Android]如何做一个崩溃率少于千分之三噶应用app(1)-module工程架构&&a

    摘要:如何做一个崩溃率少于千分之三噶应用章节列表看到这个标题,可能有人会耻笑,认为这应该很简单吧。就以现在的手机为例吧,他们的日活超过百万,他们的崩溃率是千分之七。我们现在研发的经过六个月的迭代,崩溃率却依然低于千分之三。 以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。 [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表 看到这个标题,可能...

    lbool 评论0 收藏0
  • TestBird 崩溃分析(Artisan) iOS SDK 使用指南

    摘要:最新版本更新内容支持插件,收集异常支持语言一快速集成崩溃分析,支持及以上版本。上传符号化文件将符号化文件压缩成包,通过崩溃分析应用设置中的版本管理上传。手动上报的将单独显示在分析报表的异常栏目中。 最新版本1.04 更新内容 支持H5插件,收集H5 JS异常; 支持Swift语言 一、快速集成 TestBird 崩溃分析(Artisan) iOS SDK,支持iOS 6.0 及以上版...

    Null 评论0 收藏0
  • 美团外卖Android Crash治理之路

    摘要:通过团队的全力全策,美团外卖的平均率从千分之三降到了万分之二,最优值万一左右率统计方式次数。美团外卖自年创建以来,业务就以指数级的速度发展。目前美团外卖日完成订单量已突破万,成为美团点评最重要的业务之一。 面试中常常问到的是Android的性能优化以及Crash处理。 今天我们来学习一下啊美团App的Crash处理。更多参考《Android性能优化:手把手带你全面实现内存优化》 原为地...

    sshe 评论0 收藏0

发表评论

0条评论

Olivia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<