一个AMS相关的稳定性问题
问题初探
首先根据提供的logcat和event log来判断当时的情况,首先这里有个scheduleTransaction时失败的log,这个报错基本上很明显是对端挂了
01-09 19:34:34.783 2728 2728 I Zygote : Process 4281 exited due to signal (9)
01-09 19:34:34.825 4324 4891 I FirebaseCrash: Sending crashes
01-09 19:34:34.874 3519 3560 W ActivityManager: Exception when starting activity com.google.android.googlequicksearchbox/com.google.android.apps.gsa.searchnow.SearchNowActivity
01-09 19:34:34.874 3519 3560 W ActivityManager: android.os.DeadObjectException
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.os.BinderProxy.transactNative(Native Method)
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.os.BinderProxy.transact(Binder.java:1131)
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.app.IApplicationThread$Stub$Proxy.scheduleTransaction(IApplicationThread.java:1783)
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.app.servertransaction.ClientTransaction.schedule(ClientTransaction.java:129)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ClientLifecycleManager.scheduleTransaction(ClientLifecycleManager.java:47)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1596)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1755)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStack.makeVisibleAndRestartIfNeeded(ActivityStack.java:2226)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStack.ensureActivitiesVisibleLocked(ActivityStack.java:2029)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.ensureActivitiesVisibleLocked(ActivityStackSupervisor.java:3929)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.ensureVisibilityAndConfig(ActivityStackSupervisor.java:1697)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:4091)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1649)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1613)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.am.ActivityStack$ActivityStackHandler.handleMessage(ActivityStack.java:407)
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.os.Handler.dispatchMessage(Handler.java:106)
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.os.Looper.loop(Looper.java:193)
01-09 19:34:34.874 3519 3560 W ActivityManager: at android.os.HandlerThread.run(HandlerThread.java:65)
01-09 19:34:34.874 3519 3560 W ActivityManager: at com.android.server.ServiceThread.run(ServiceThread.java:44)
01-09 19:34:34.881 3519 3563 W libprocessgroup: kill(-4281, 9) failed: No such process
紧接下面就有一个空指针的报错,应该会使得系统重启
01-09 19:34:34.995 3519 3560 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: ActivityManager
01-09 19:34:34.995 3519 3560 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.server.wm.AppWindowContainerController.setVisibility(boolean, boolean)' on a null object reference
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityRecord.setVisibility(ActivityRecord.java:1848)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2660)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2413)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2336)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1693)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1613)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.am.ActivityStack$ActivityStackHandler.handleMessage(ActivityStack.java:407)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at android.os.Looper.loop(Looper.java:193)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:65)
01-09 19:34:34.995 3519 3560 E AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:44)
结合Process 4281 exited due to signal (9),很容易想到是因为对端进程被杀了导致调用到removeActivityFromHistoryLocked中的r.removeWindowContainer(),导致出现上面的堆栈;
4195 private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) {
4196 finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
4197 r.makeFinishingLocked();
4198 if (DEBUG_ADD_REMOVE) Slog.i(TAG_ADD_REMOVE,
4199 "Removing activity " + r + " from stack callers=" + Debug.getCallers(5));
4200
4201 r.takeFromHistory();
4202 removeTimeoutsForActivityLocked(r);
4203 if (DEBUG_STATES) Slog.v(TAG_STATES,
4204 "Moving to DESTROYED: " + r + " (removed from history)");
4205 r.setState(DESTROYED, "removeActivityFromHistoryLocked");
4206 if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during remove for activity " + r);
4207 r.app = null;
4208 r.removeWindowContainer();
4209 final TaskRecord task = r.getTask();
4210 final boolean lastActivity = task != null ? task.removeActivity(r) : false;
4211 // If we are removing the last activity in the task, not including task overlay activities,
4212 // then fall through into the block below to remove the entire task itself
4213 final boolean onlyHasTaskOverlays = task != null
4214 ? task.onlyHasTaskOverlayActivities(false /* excludingFinishing */) : false;
4215
4216 if (lastActivity || onlyHasTaskOverlays) {
4217 if (DEBUG_STACK) {
4218 Slog.i(TAG_STACK,
4219 "removeActivityFromHistoryLocked: last activity removed from " + this
4220 + " onlyHasTaskOverlays=" + onlyHasTaskOverlays);
4221 }
4222
4223 // The following block can be executed multiple times if there is more than one overlay.
4224 // {@link ActivityStackSupervisor#removeTaskByIdLocked} handles this by reverse lookup
4225 // of the task by id and exiting early if not found.
4226 if (onlyHasTaskOverlays) {
4227 // When destroying a task, tell the supervisor to remove it so that any activity it
4228 // has can be cleaned up correctly. This is currently the only place where we remove
4229 // a task with the DESTROYING mode, so instead of passing the onlyHasTaskOverlays
4230 // state into removeTask(), we just clear the task here before the other residual
4231 // work.
4232 // TODO: If the callers to removeTask() changes such that we have multiple places
4233 // where we are destroying the task, move this back into removeTask()
4234 mStackSupervisor.removeTaskByIdLocked(task.taskId, false /* killProcess */,
4235 !REMOVE_FROM_RECENTS, PAUSE_IMMEDIATELY, reason);
4236 }
4237
4238 // We must keep the task around until all activities are destroyed. The following
4239 // statement will only execute once since overlays are also considered activities.
4240 if (lastActivity) {
4241 removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
4242 }
4243 }
4244 cleanUpActivityServicesLocked(r);
4245 r.removeUriPermissionsLocked();
4246 }
1074 void removeWindowContainer() {
1075 // Do not try to remove a window container if we have already removed it.
1076 if (mWindowContainerController == null) {
1077 return;
1078 }
1079
1080 // Resume key dispatching if it is currently paused before we remove the container.
1081 resumeKeyDispatchingLocked();
1082
1083 mWindowContainerController.removeContainer(getDisplayId());
1084 mWindowContainerController = null;
1085 }
在这里会将mWindowContainerController置空,再调用setVisibility就会抛出空指针异常;下面需要验证下我们的猜想
问题复现
jira中所提供的log是不完整的,只能给我们大致一个猜测,发生问题到底发生了什么
01-09 19:34:34.114 3519 8656 I wm_task_created: [343,345]
01-09 19:34:34.118 3519 8656 I wm_task_moved: [343,0,2147483647]
01-09 19:34:34.126 3519 8656 I am_focused_stack: [0,345,344,reuseOrNewTask]
01-09 19:34:34.128 3519 8656 I am_create_task: [0,343]
01-09 19:34:34.128 3519 8656 I am_create_activity: [0,153591149,343,com.google.android.googlequicksearchbox/com.google.android.apps.gsa.searchnow.SearchNowActivity,android.search.action.GLOBAL_SEARCH,NULL,agsa:/data?type=search.TYPE_SEARCHNOW&inputProto=CAgQA0ABiAEBmgENY29tLm1pdWkuaG9tZaIBMxIxCAAQABj/////ByAAOAFIAFABWABgAGgAcAB4
01-09 19:34:34.128 3519 8656 I am_create_activity: AIABAIgBAJABAJgBAKABAKgBALABAagBAcgBAQ==
01-09 19:34:34.128 3519 8656 I am_create_activity: ,268468224]
01-09 19:34:34.129 3519 8656 I wm_task_moved: [343,0,2147483647]
01-09 19:34:34.151 3519 8656 I am_pause_activity: [4281,253136694,com.google.android.googlequicksearchbox/.SearchActivity,userLeaving=true]
首先通过一个action,com.google.android.googlequicksearchbox/com.google.android.apps.gsa.searchnow.SearchNowActivity,android.search.action.GLOBAL_SEARCH启动一个Activity,SearchActivity
01-09 19:34:34.251 3519 8656 I am_finish_activity: [4281,253136694,342,com.google.android.googlequicksearchbox/.SearchActivity,app-request] SearchActivity中finish掉自己
同时另外启动一个Activity,SearchNowActivity
01-09 19:34:34.098 3519 8656 I wm_stack_created: 345
01-09 19:34:34.114 3519 8656 I wm_task_created: [343,345]
01-09 19:34:34.118 3519 8656 I wm_task_moved: [343,0,2147483647]
01-09 19:34:34.126 3519 8656 I am_focused_stack: [0,345,344,reuseOrNewTask]
01-09 19:34:34.128 3519 8656 I am_create_task: [0,343]
01-09 19:34:34.128 3519 8656 I am_create_activity: [0,153591149,343,com.google.android.googlequicksearchbox/com.google.android.apps.gsa.searchnow.SearchNowActivity,android.search.action.GLOBAL_SEARCH,NULL,agsa:/data?type=search.TYPE_SEARCHNOW&inputProto=CAgQA0ABiAEBmgENY29tLm1pdWkuaG9tZaIBMxIxCAAQABj/////ByAAOAFIAFABWABgAGgAcAB4
感觉SearchActivity是起到一个缓冲界面的作用;这份log已经打的很明显了,我们找台国际版的机器执行 adb shell am start -a android.search.action.GLOBAL_SEARCH,
抓出相应时间的event log,发现大致流程相同;找到了当时的情况,就要找出当时有什么异常;
首先看堆栈1,我们什么情况下会走到那里呢?

final ActivityRecord finishCurrentActivityLocked(ActivityRecord r, int mode, boolean oomAdj,
String reason) {
// First things first: if this activity is currently visible,
// and the resumed activity is not yet visible, then hold off on
// finishing until the resumed one becomes visible.
// The activity that we are finishing may be over the lock screen. In this case, we do not
// want to consider activities that cannot be shown on the lock screen as running and should
// proceed with finishing the activity if there is no valid next top running activity.
final ActivityRecord next = mStackSupervisor.topRunningActivityLocked(
true /* considerKeyguardState */);
if (mode == FINISH_AFTER_VISIBLE && (r.visible || r.nowVisible)
&& next != null && !next.nowVisible) {
if (!mStackSupervisor.mStoppingActivities.contains(r)) {
addToStopping(r, false /* scheduleIdle */, false /* idleDelayed */);
}
if (DEBUG_STATES) Slog.v(TAG_STATES,
"Moving to STOPPING: "+ r + " (finish requested)");
r.setState(STOPPING, "finishCurrentActivityLocked");
if (oomAdj) {
mService.updateOomAdjLocked();
}
return r;
}
// make sure the record is cleaned out of other places.
mStackSupervisor.mStoppingActivities.remove(r);
mStackSupervisor.mGoingToSleepActivities.remove(r);
mStackSupervisor.mActivitiesWaitingForVisibleActivity.remove(r);
final ActivityState prevState = r.getState();
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to FINISHING: " + r);
r.setState(FINISHING, "finishCurrentActivityLocked");
final boolean finishingActivityInNonFocusedStack
= r.getStack() != mStackSupervisor.getFocusedStack()
&& prevState == PAUSED && mode == FINISH_AFTER_VISIBLE;
if (mode == FINISH_IMMEDIATELY
|| (prevState == PAUSED
&& (mode == FINISH_AFTER_PAUSE || inPinnedWindowingMode()))
|| finishingActivityInNonFocusedStack
|| prevState == STOPPING
|| prevState == STOPPED
|| prevState == ActivityState.INITIALIZING) {
r.makeFinishingLocked();
boolean activityRemoved = destroyActivityLocked(r, true, "finish-imm:" + reason);
if (finishingActivityInNonFocusedStack) {
// Finishing activity that was in paused state and it was in not currently focused
// stack, need to make something visible in its place.
mStackSupervisor.ensureVisibilityAndConfig(next, mDisplayId,
false /* markFrozenIfConfigChanged */, true /* deferResume */); //调到这里来了
}
if (activityRemoved) {
mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
"destroyActivityLocked: finishCurrentActivityLocked r=" + r +
" destroy returned removed=" + activityRemoved);
return activityRemoved ? null : r;
}
// Need to go through the full pause cycle to get this
// activity into the stopped state and then finish it.
if (DEBUG_ALL) Slog.v(TAG, "Enqueueing pending finish: " + r);
mStackSupervisor.mFinishingActivities.add(r);
r.resumeKeyDispatchingLocked();
mStackSupervisor.resumeFocusedStackTopActivityLocked();
return r;
}
但是要调用到堆栈1里面,这个值应该当为false;这个值要为false只能在ensureActivitiesVisibleLocked中makeInvisible(r)这里赋值,但是SearchActivity的finishing又为false,决定了一般不会再将visible置为false了;但是再调时确实有一次进了这个栈

很遗憾没有看出必现的路径,怀疑是ensureActivitiesVisibleLocked和finishing赋值的顺序问题导致的;不过这里应该不是本问题的重点,我们手动将r.visible的值改为false,就可以进入栈中,一路单步调试到realStartActivityLocked中的mService.getLifecycleManager().scheduleTransaction(clientTransaction);这里,停住,手动
lavender:/ # ps -ef | grep com.google.android.googlequicksearchbox
u0_a58 3339 1087 0 14:28:03 ? 00:00:00 com.google.android.googlequicksearchbox:interactor
u0_a58 6826 1087 0 14:36:43 ? 00:00:05 com.google.android.googlequicksearchbox:search
root 9311 9307 2 15:29:58 pts/0 00:00:00 grep com.google.android.googlequicksearchbox
lavender:/ # kill -9 6826
发现这里做了清理工作

再次运行,发现果然logcat中同步出现了如下栈:
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: Exception when starting activity com.google.android.googlequicksearchbox/com.google.android.apps.gsa.searchnow.SearchNowActivity
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: android.os.DeadObjectException
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.os.BinderProxy.transactNative(Native Method)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.os.BinderProxy.transact(Binder.java:1131)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.app.IApplicationThread$Stub$Proxy.scheduleTransaction(IApplicationThread.java:1783)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.app.servertransaction.ClientTransaction.schedule(ClientTransaction.java:129)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ClientLifecycleManager.scheduleTransaction(ClientLifecycleManager.java:47)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1598)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1757)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStack.makeVisibleAndRestartIfNeeded(ActivityStack.java:2236)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStack.ensureActivitiesVisibleLocked(ActivityStack.java:2039)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.ensureActivitiesVisibleLocked(ActivityStackSupervisor.java:3931)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStackSupervisor.ensureVisibilityAndConfig(ActivityStackSupervisor.java:1699)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:4101)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1659)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1623)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.am.ActivityStack$ActivityStackHandler.handleMessage(ActivityStack.java:407)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.os.Handler.dispatchMessage(Handler.java:106)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.os.Looper.loop(Looper.java:201)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at android.os.HandlerThread.run(HandlerThread.java:65)
01-16 14:04:14.141 1000 2325 2340 W ActivityManager: at com.android.server.ServiceThread.run(ServiceThread.java:44)
证明了上面所说的,确实是因为com.google.android.googlequicksearchbox:search接收到了signal 9信号被杀导致的问题,继续往下调试,发现会出现两种情况:
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: Activity Manager Crash. UID:1000 PID:2325 TRANS:16
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.server.wm.AppWindowContainerController.setVisibility(boolean, boolean)' on a null object reference
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityRecord.setVisibility(ActivityRecord.java:1849)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2670)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2423)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2338)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1703)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1623)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:8495)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:225)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3383)
01-16 13:44:05.677 1000 2325 5853 E ActivityManager: at android.os.Binder.execTransact(Binder.java:735)
栈是类似的,但是没有重启;
不过也出现过:
--------- beginning of crash
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: ActivityManager
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.server.wm.AppWindowContainerController.setVisibility(boolean, boolean)' on a null object reference
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityRecord.setVisibility(ActivityRecord.java:1849)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2670)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2423)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2338)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1703)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1623)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.am.ActivityStack$ActivityStackHandler.handleMessage(ActivityStack.java:407)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at android.os.Looper.loop(Looper.java:201)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:65)
01-16 14:06:35.213 1000 2325 2340 E AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:44)
此时机器重启了;很遗憾暂时也没找到出现重启现象的必现路径,但是对这个问题而言,我们已经能复现栈了,并且证明了是进程被杀导致的问题;因此我们可以做一些修复,增加系统的健壮性
问题修复
针对ActivityRecord的app属性做判空操作,若为空,则不做setVisible调用
问题拓展
还有两个问题没有找到必现路径
1.SearchActivity什么情况下能必现false?(暂时未确定必现路径)
2.什么情况下空指针会触发AndroidRuntime exception?
答:
当SearchActivity发生pause操作发生超时时,ActivityStackHandler执行startPausingLocked中的schedulePauseTimeout发送消息PAUSE_TIMEOUT_MSG时会发生重启(对比栈的不同就可以很明显的发现了)

"ActivityManager" prio=5 tid=12 Native
| group="main" sCount=2 dsCount=0 flags=1 obj=0x13c42360 self=0x7408cf9c00
| sysTid=3529 nice=-2 cgrp=default sched=0/0 handle=0x73f5afb4f0
| state=S schedstat=( 8286251403 3553236883 13625 ) utm=420 stm=408 core=0 HZ=100
| stack=0x73f59f8000-0x73f59fa000 stackSize=1041KB
| held mutexes=
at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2423)
at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2338)
at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1703)
at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1623)
at com.android.server.am.ActivityStack$ActivityStackHandler.handleMessage(ActivityStack.java:407)
- locked <0x0d969413> (a com.android.server.am.ActivityManagerService)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.os.HandlerThread.run(HandlerThread.java:65)
at com.android.server.ServiceThread.run(ServiceThread.java:44)
运行在ActivityManager线程
网友评论