# main java.lang.StackOverflowError

来源:互联网 发布:bartender vb脚本示例 编辑:程序博客网 时间:2024/06/16 06:41

一、问题

某次项目新版本上线后,线上突然出现了一个新的Crash,而且频率还很高

1 android.view.InflateException:Binary XML file line #59: Error inflating class <unknown>2 android.view.LayoutInflater.createView(LayoutInflater.java:640)3 ......4 Caused by:5 java.lang.StackOverflowError:6 android.util.SparseArray.get(SparseArray.java:102)7 android.content.res.StringBlock.get(StringBlock.java:70)8 android.content.res.AssetManager.getResourceValue(AssetManager.java:202)9 android.content.res.Resources.getValue(Resources.java:1191)10 android.content.res.Resources.getDrawable(Resources.java:770)11 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)12 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)13 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)14 android.content.res.Resources.loadDrawable(Resources.java:2310)15 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)16 android.content.res.Resources.getDrawable(Resources.java:772)17 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)18 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)19 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)20 android.content.res.Resources.loadDrawable(Resources.java:2310)21 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)22 android.content.res.Resources.getDrawable(Resources.java:772)23 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)24 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)25 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)26 android.content.res.Resources.loadDrawable(Resources.java:2310)27 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)28 android.content.res.Resources.getDrawable(Resources.java:772)29 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)30 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)31 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)32 android.content.res.Resources.loadDrawable(Resources.java:2310)33 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)34 android.content.res.Resources.getDrawable(Resources.java:772)35 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)36 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)37 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)38 android.content.res.Resources.loadDrawable(Resources.java:2310)39 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)40 android.content.res.Resources.getDrawable(Resources.java:772)41 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)42 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)43 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)44 android.content.res.Resources.loadDrawable(Resources.java:2310)45 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)46 android.content.res.Resources.getDrawable(Resources.java:772)47 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)48 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)49 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)50 android.content.res.Resources.loadDrawable(Resources.java:2310)51 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)52 android.content.res.Resources.getDrawable(Resources.java:772)53 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)54 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)55 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)56 android.content.res.Resources.loadDrawable(Resources.java:2310)57 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)58 android.content.res.Resources.getDrawable(Resources.java:772)59 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)60 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)61 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)62 android.content.res.Resources.loadDrawable(Resources.java:2310)63 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)64 android.content.res.Resources.getDrawable(Resources.java:772)65 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)66 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)67 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)68 android.content.res.Resources.loadDrawable(Resources.java:2310)69 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)70 android.content.res.Resources.getDrawable(Resources.java:772)71 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)72 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)73 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)74 android.content.res.Resources.loadDrawable(Resources.java:2310)75 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)76 android.content.res.Resources.getDrawable(Resources.java:772)77 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)78 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)79 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)80 android.content.res.Resources.loadDrawable(Resources.java:2310)81 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)82 android.content.res.Resources.getDrawable(Resources.java:772)83 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)84 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)85 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)86 android.content.res.Resources.loadDrawable(Resources.java:2310)87 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)88 android.content.res.Resources.getDrawable(Resources.java:772)89 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)90 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)91 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)92 android.content.res.Resources.loadDrawable(Resources.java:2310)93 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)94 android.content.res.Resources.getDrawable(Resources.java:772)95 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)96 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)97 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)98 android.content.res.Resources.loadDrawable(Resources.java:2310)99 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)100 android.content.res.Resources.getDrawable(Resources.java:772)101 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)102 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)103 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)104 android.content.res.Resources.loadDrawable(Resources.java:2310)105 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)106 android.content.res.Resources.getDrawable(Resources.java:772)107 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)108 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)109 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)110 android.content.res.Resources.loadDrawable(Resources.java:2310)111 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)112 android.content.res.Resources.getDrawable(Resources.java:772)113 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)114 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)115 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)116 android.content.res.Resources.loadDrawable(Resources.java:2310)117 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)118 android.content.res.Resources.getDrawable(Resources.java:772)119 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)120 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)121 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)122 android.content.res.Resources.loadDrawable(Resources.java:2310)123 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)124 android.content.res.Resources.getDrawable(Resources.java:772)125 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)126 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)127 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)128 android.content.res.Resources.loadDrawable(Resources.java:2310)129 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)130 android.content.res.Resources.getDrawable(Resources.java:772)131 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)132 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)133 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)134 android.content.res.Resources.loadDrawable(Resources.java:2310)135 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)136 android.content.res.Resources.getDrawable(Resources.java:772)137 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)138 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)139 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)140 android.content.res.Resources.loadDrawable(Resources.java:2310)141 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)142 android.content.res.Resources.getDrawable(Resources.java:772)143 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)144 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)145 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)146 android.content.res.Resources.loadDrawable(Resources.java:2310)147 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)148 android.content.res.Resources.getDrawable(Resources.java:772)149 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)150 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)151 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)152 android.content.res.Resources.loadDrawable(Resources.java:2310)153 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)154 android.content.res.Resources.getDrawable(Resources.java:772)155 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)156 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)157 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)158 android.content.res.Resources.loadDrawable(Resources.java:2310)159 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)160 android.content.res.Resources.getDrawable(Resources.java:772)161 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)162 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)163 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)164 android.content.res.Resources.loadDrawable(Resources.java:2310)165 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)166 android.content.res.Resources.getDrawable(Resources.java:772)167 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)168 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)169 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)170 android.content.res.Resources.loadDrawable(Resources.java:2310)171 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)172 android.content.res.Resources.getDrawable(Resources.java:772)173 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)174 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)175 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)176 android.content.res.Resources.loadDrawable(Resources.java:2310)177 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)178 android.content.res.Resources.getDrawable(Resources.java:772)179 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)180 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)181 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)182 android.content.res.Resources.loadDrawable(Resources.java:2310)183 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)184 android.content.res.Resources.getDrawable(Resources.java:772)185 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)186 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)187 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)188 android.content.res.Resources.loadDrawable(Resources.java:2310)189 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)190 android.content.res.Resources.getDrawable(Resources.java:772)191 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)192 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)193 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)194 android.content.res.Resources.loadDrawable(Resources.java:2310)195 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)196 android.content.res.Resources.getDrawable(Resources.java:772)197 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)198 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)199 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)200 android.content.res.Resources.loadDrawable(Resources.java:2310)201 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)202 android.content.res.Resources.getDrawable(Resources.java:772)203 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)204 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)205 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)206 android.content.res.Resources.loadDrawable(Resources.java:2310)207 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)208 android.content.res.Resources.getDrawable(Resources.java:772)209 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)210 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)211 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)212 android.content.res.Resources.loadDrawable(Resources.java:2310)213 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)214 android.content.res.Resources.getDrawable(Resources.java:772)215 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)216 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)217 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)218 android.content.res.Resources.loadDrawable(Resources.java:2310)219 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)220 android.content.res.Resources.getDrawable(Resources.java:772)221 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)222 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)223 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)224 android.content.res.Resources.loadDrawable(Resources.java:2310)225 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)226 android.content.res.TypedArray.getDrawable(TypedArray.java:650)227 android.view.View.<init>(View.java:3588)228 android.widget.ImageView.<init>(ImageView.java:123)229 android.widget.ImageView.<init>(ImageView.java:119)230 java.lang.reflect.Constructor.constructNative(Native Method)231 java.lang.reflect.Constructor.newInstance(Constructor.java:423)232 android.view.LayoutInflater.createView(LayoutInflater.java:614)233 com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)234 android.view.LayoutInflater.onCreateView(LayoutInflater.java:689)235 android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:714)236 android.view.LayoutInflater.rInflate(LayoutInflater.java:775)237 android.view.LayoutInflater.rInflate(LayoutInflater.java:778)238 android.view.LayoutInflater.inflate(LayoutInflater.java:512)239 android.view.LayoutInflater.inflate(LayoutInflater.java:409)240 android.view.LayoutInflater.inflate(LayoutInflater.java:358)

二、原因分析

一开始也是一头雾水,无处下手。静下心来,仔细分析了堆栈日志之后

214 android.content.res.Resources.getDrawable(Resources.java:772)215 android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:176)216 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)217 android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)218 android.content.res.Resources.loadDrawable(Resources.java:2310)219 com.huawei.android.content.res.ResourcesEx.loadDrawable(ResourcesEx.java:724)

我看到堆栈中,这些日志重复了N遍。也就是说,在加载xml格式的drawable文件时,该文件被重复加载了N次,直到抛出StackOverFlowError异常。
有了思路之后,我根据堆栈日志中的提示,从layout文件中找到了罪魁祸首。原来,layout布局文件中,有个ImageView引用了如下图片:iv_more.xml

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:drawable="@drawable/iv_more_press" android:state_pressed="true"/>    <item android:drawable="@drawable/iv_more_press" android:state_focused="true"/>    <item android:drawable="@drawable/iv_more"/></selector>

而iv_more.png图片放在drawable-xhdpi中,这样一来,对于低dpi的手机,在显示该图片时,会由于加载iv_more.xml时,内部循环引用了iv_more.xml(因为低dpi的手机,会直接使用drawable中的图片资源而非drawable-xhdpi文件夹中的),形成死循环,由此引发StackOverflow异常。

三、解决

既然该问题是由于xml文件和png图片重名所致,只需要将图片名称改了就好了。比如将该例子中的iv_more.png更名为iv_more_nor.png。完美!

反思:

该Bug是由一同事改出来的,当时我看到这个crash,也一直没当回事,以至于真的要解决这个问题时,也是心不在焉的,没有仔细看堆栈日志,多花了不少时间。引以为鉴!

原创粉丝点击