微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > addAppToken到window array list时发生数组越界IndexOutOfBoundsException是什么原因

addAppToken到window array list时发生数组越界IndexOutOfBoundsException是什么原因

时间:10-02 整理:3721RD 点击:
[DESCRIPTION]
addAppToken到window array list时发生数组越界IndexOutOfBoundsException是什么原因?
[SOLUTION]
手机系统重启,通过log查看是有以下exception:
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.add(ArrayList.java:143)
at com.android.server.wm.WindowManagerService.addAppToken
(WindowManagerService.java:4117)
at com.android.server.am.ActivityStack.startActivityLocked
(ActivityStack.java:2216)
. . . . . .
此exception是表示,向app tokens 这个array list 添加一个app token时,发现array的
大小是0,但我们却要向index为1的位置添加,所以会有out of bounds exception。
这个问题,是因为multi-thread对array list做add/remove的操作,导致里面的index乱掉了
,所以目前的db里抓到的并非发生问题的现场,只是发生exception这个结果。
解决方法:
WindowManagerService.java中共有四处调用mAppTokens.remove的地方,前两处调用是有直
接在本函数中添加同步处理的,第三处是在上一层callstack中添加了同步锁,所以,前三处调用
removeAppTokensLocked是有在上一层callstack处(moveAppTokensToTop)加入同步处理
的。只有最后一处 mAppTokens.remove调用时没有添加同步锁处理的,请加上并测试(用mtk
added标记):
performLayoutAndPlaceSurfaceLockedInner方法中:
{

for (i=mExitingAppTokens.size()-1; i>=0; i--) {
AppWindowToken token = mExitingAppTokens.get(i);
synchronized (mWindowMap) { //mtk added
if (!token.hasVisible && !mClosingApps.contains(token)) {
// Make sure there is no animation running on this token,
// so any windows associated with it will be removed as
// soon as their animations are complete
token.mAppAnimator.clearAnimation();
token.mAppAnimator.animating = false;
if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
"performLayout: App token exiting now removed" + token);
mAppTokens.remove(token);
mAnimatingAppTokens.remove(token);
mExitingAppTokens.remove(i);
}
} //mtk added
}

}

学习了~~~~~~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top