我们经常看到Android的ART代码崩溃。我们正在索引一个int数组,而没有进行边界检查,然后捕获Java的ArrayIndexOutOfBoundsException并正确地对其进行处理。
我们在具有各种Java版本的PC上运行此代码,并且该代码可以正常运行。但是,在Android上,代码有时会爆炸。
我们的一些源代码:
1. <#assign array=[0]>
2. <#list array as a>
3. ${a}
4. <#assign array = array + [1]><#assign array = array + [1]><#assign array = array + [1]>
5. <#list array as c>
6. ${c}
7. </#list>
8. </#list>
我无法创建一个简单的测试用例,因为我期望Android ART库中存在某种多线程竞争条件。
“ I / ObjectDBSet:changesComplete”来自不同的线程(请参阅“消息处理器”线程),但是可以触摸调用getFieldTraits()的对象之一。 int tmp []是最终的,因此将不会更改。此外,不会替换或更改DataObjectInfo和IdToIndexData对象。
无论哪种方式,另一个线程都不应导致Android的ART库崩溃。
Android版本/设备:
具有Android 7.0内部版本号NRD90M.T580UEU2BQL1的三星Galaxy Tab A。
从Android Studio:
内部版本:3.1.4,AI-173.4907809、201807232114,
AI-173.4907809,JRE 1.8.0_152-release-1024-b01x64 JetBrains s.r.o,OS Linux(amd64)v4.15.0-34(未知),屏幕1920x1080、2560x1600
Android Gradle插件:3.1.4 摇篮:4.4 NDK:来自local.properties :(未指定);最新的SDK :(未找到); LLDB:找不到固定的修订版3.1; SDK的最新消息:(未找到软件包); CMake:来自local.properties :(未指定);最新的SDK :(未找到);来自PATH :(未找到);
崩溃的完整输出:
class IdToIndexData {
private final int tmap[]; // Contents are set elsewhere
int getTraitsIndexUnchecked(int id) {
return tmap[id];
}
}
class DataObjectInfo {
public Integer getFieldTraits(Class1 map, int id) {
int traitsIndex=map.getTraitsIndexUnchecked(id);
return traitsIndex;
} catch (ArrayIndexOutOfBoundsException e) {
return null;
}
}
}
注意:删除了一些刚刚等待达到StackOverFlow的30,000 char限制以下的线程。
更新1
我的问题是不寻找解决方法(我们可以实现自己的边界检查,但不能这样做,因为几年前的分析表明我们需要改进此代码,这是一种方法去做)。
相反,我正在寻找有关我的代码可能如何导致此问题(即这确实是我的错误)或它是否是已知的Android错误的解释。
答案 0 :(得分:1)
我发现这是一个Android错误:
https://issuetracker.google.com/issues/116246633
使用边界检查作为解决方法,而不是依靠Android正确引发ArrayIndexOutOfBoundsException。