安卓frame层异常错误排查

45 篇文章 0 订阅

今天countly平台上出现了bug错误,日志如下:

java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.com.egova.egovamobile/cn.com.egova.egovamobile.media.CameraActivity}: android.view.InflateException: Binary XML file line #324: Error inflating class cn.com.egova.egovamobile.media.ReportAzimuthView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2193)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2243)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #324: Error inflating class cn.com.egova.egovamobile.media.ReportAzimuthView
at android.view.LayoutInflater.createView(LayoutInflater.java:620)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
at android.app.Activity.setContentView(Activity.java:1929)
at cn.com.egova.egovamobile.media.CameraActivity.b(TbsSdkJava:361)
at cn.com.egova.egovamobile.media.CameraActivity.onCreate(TbsSdkJava:279)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
... 23 more
Caused by: java.lang.NoSuchMethodError: android.widget.RelativeLayout.<init>
at cn.com.egova.egovamobile.media.ReportAzimuthView.<init>(TbsSdkJava:52)
at cn.com.egova.egovamobile.media.ReportAzimuthView.<init>(TbsSdkJava:48)
at cn.com.egova.egovamobile.media.ReportAzimuthView.<init>(TbsSdkJava:44)
... 26 more

日志有三个层级的Caused by:,说明日志向外抛出有四个层级,
(1)java.lang.RuntimeException: Unable to start activity
在这里插入图片描述
(2)Caused by: android.view.InflateException: Binary XML file line #324: Error inflating class
在这里插入图片描述

(3)Caused by: java.lang.reflect.InvocationTargetException
在这里插入图片描述
(4)Caused by: java.lang.NoSuchMethodError: android.widget.RelativeLayout.

总结:因此最下面的causedBy是最接近异常开始抛出的地方的,这也不能说明最后一个就是错误的根源所在,比如:你向一个函数传递一个空指针对象,函数里面开始向外抛出空指针异常,问题所在在于你不能传递空指针给这个函数;
而每一层级causeBy的函数调用堆栈,函数调用链从下面开始向上推进的,最下面是函数调用链的起点,最上面是链的终点。

ComponentInfo{cn.com.egova.egovamobile/cn.com.egova.egovamobile.media.CameraActivity}: android.view.InflateException: Binary XML file line #324: Error inflating class cn.com.egova.egovamobile.media.ReportAzimuthView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2193)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2243)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)

从上往下是错误越来越接近错误根源代码处。从代码调用链一级一级的跟进去,一直到最后一个causedBy的代码行处为止。
原生类LayoutInflater:
在这里插入图片描述
中间经过了原生控件的创建过程,如果都创建不了自定义控件的话,那么就会使用反射调用自定义控件的构造方法。
上面的ReportAzimuthView继承自RelativeLayout的自定义控件,在构造自己的时候会调用父类RelativeLayout的构造方法,问题就出现在这里,我自己自定义控件的时候,调用三参数构造函数的时候默认是调用的四参数构造函数,第四个参数传递0,而测试的手机是:
在这里插入图片描述
那么就是4.4系统的api了,而在5系统以下,构造函数都是三参数的没有四参数的构造函数,那么就会导致报错日志中的nosuchMethod的错误。查看安卓源码连接

修改起来也很容易,就是三参数调用三参数构造函数,四参数调用四参数构造函数,分开来。这样就不会导致方法不存在的错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值