美文网首页
一个AMS相关的稳定性问题

一个AMS相关的稳定性问题

作者: weiinter105 | 来源:发表于2019-01-17 13:52 被阅读0次

一个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,我们什么情况下会走到那里呢?

首先这里有一个问题,在start SearchActivity的过程中,会将其visible属性置为true,然后start SearchNowActivity调用到这里的时候,一般而言SearchActivity对应的visible属性应该还是true SearchActivity.visible.png
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了;但是再调时确实有一次进了这个栈 调用堆栈1.png

很遗憾没有看出必现的路径,怀疑是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

发现这里做了清理工作


清理工作.png

再次运行,发现果然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时会发生重启(对比栈的不同就可以很明显的发现了)


pause_timeout.png
"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线程

相关文章

网友评论

      本文标题:一个AMS相关的稳定性问题

      本文链接:https://www.haomeiwen.com/subject/nohidqtx.html