安卓frame层异常错误排查

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

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

你可能感兴趣的:(java,android)