# main java.lang.StackOverflowError

一、问题

某次项目新版本上线后,线上突然出现了一个新的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,也一直没当回事,以至于真的要解决这个问题时,也是心不在焉的,没有仔细看堆栈日志,多花了不少时间。引以为鉴!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值