跑monkey过程中,出现systemserver重启现象

08-27 18:36:58.131318   900   921 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: ActivityManager
08-27 18:36:58.131318   900   921 E AndroidRuntime: java.lang.IllegalArgumentException: No display found with id: -1
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.am.ActivityStackSupervisor.getDisplayOverrideConfiguration(ActivityStackSupervisor.java:477)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.am.ActivityStackSupervisor.ensureVisibilityAndConfig(ActivityStackSupervisor.java:1670)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:3941)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1602)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1568)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.am.ActivityStack$ActivityStackHandler.handleMessage(ActivityStack.java:399)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:193)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at android.os.HandlerThread.run(HandlerThread.java:65)
08-27 18:36:58.131318   900   921 E AndroidRuntime: 	at com.android.server.ServiceThread.run(ServiceThread.java:44)

sys log中可以看到要执行finish org.chromium.chrome.browser.firstrun.FirstRunActivity时在paused阶段发现它对应的displayid为INVALID_DISPLAY

通过以上mobilelog可知com.android.chrome被killing了,这里会先执行removeTask的流程把displayId 设置为了INVALID_DISPLAY即 -1
接着继续执行finishCurrentActivityLocked的ensureVisibilityAndConfig().

08-27 18:17:57.409427   900  3567 W ActivityManager: Force-killing crashed app com.android.chrome at watcher's request
08-27 18:17:57.425458   900  3567 W ActivityManager:   Force finishing activity com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity
08-27 18:17:57.459139   900 25330 W DropBoxManagerService: Dropping: system_app_crash (1525 > 0 bytes)
08-27 18:17:57.471247   900  1322 I WindowManager: WIN DEATH: Window{90b4c99 u0 com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity}
08-27 18:17:57.497804   900   921 W ActivityManager: Failed to set scheduling policy, thread does not exist:
08-27 18:17:57.497804   900   921 W ActivityManager: java.lang.IllegalArgumentException: Given thread 25326 does not exist
08-27 18:17:57.514717   900  4284 I ActivityManager: Process com.android.chrome (pid 24971) has died: vis  +99TOP
08-27 18:36:57.451874   900   900 W ActivityManager: Failed to set scheduling policy, thread does not exist:
08-27 18:36:57.451874   900   900 W ActivityManager: java.lang.IllegalArgumentException: Given thread 15698 does not exist
08-27 18:36:57.906290   900   921 W ActivityManager: Activity pause timeout for ActivityRecord{34c13ff u0 com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity t540 f}

event log中

08-27 18:36:57.255642 14205 14205 I am_on_create_called: [0,org.chromium.chrome.browser.firstrun.FirstRunActivity,performCreate]
08-27 18:36:57.260193 14205 14205 I am_on_start_called: [0,org.chromium.chrome.browser.firstrun.FirstRunActivity,handleStartActivity]
08-27 18:36:57.262499 14205 14205 I am_on_resume_called: [0,org.chromium.chrome.browser.firstrun.FirstRunActivity,RESUME_ACTIVITY]
08-27 18:36:57.362941   900   913 I am_crash: [14205,0,com.android.chrome,-1597260091,java.io.FileNotFoundException,/data/user/0/com.android.chrome/app_chrome/paks/en-GB.pak@1481298e.tmp (No space left on device),FileOutputStream.java,-2]
08-27 18:36:57.394676   900   913 I am_finish_activity: [0,55317503,540,com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity,force-crash]
08-27 18:36:57.402853   900   913 I am_focused_stack: [0,265,521,finishActivity adjustFocus adjustFocusToNextFocusableStack]
08-27 18:36:57.404310   900   913 I am_pause_activity: [0,55317503,com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity,userLeaving=false]

具体处理流程跟踪如下

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()
08-27 18:36:57.382979   900   913 W ActivityManager: Force-killing crashed app com.android.chrome at watcher's request

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()
08-27 18:36:57.385981   900   913 W ActivityManager:   Force finishing activity com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()
08-27 18:36:57.394676   900   913 I am_finish_activity: [0,55317503,540,com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity,force-crash]

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->adjustFocusedActivityStack()-->adjustFocusToNextFocusableStack()
//这里focus切换到了265 android ui, FirstRunActivity521丢失focus
08-27 18:36:57.402853   900   913 I am_focused_stack: [0,265,521,finishActivity adjustFocus adjustFocusToNextFocusableStack]
//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->startPausingLocked()
08-27 18:36:57.404310   900   913 I am_pause_activity: [0,55317503,com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity,userLeaving=false]

08-27 18:36:57.474179   493   493 I Zygote  : Process 14205 exited due to signal (9)

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->startPausingLocked()-->schedulePauseTimeout()-->handleMessage(PAUSE_TIMEOUT_MSG)
08-27 18:36:57.906290   900   921 W ActivityManager: Activity pause timeout for ActivityRecord{34c13ff u0 com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity t540 f}

//completePauseLocked()中执行了prev.setState(PAUSED, "completePausedLocked");

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->startPausingLocked()-->schedulePauseTimeout()-->handleMessage(PAUSE_TIMEOUT_MSG)-->completePauseLocked()-->finishCurrentActivityLocked()--->destroyActivityLocked(x,x,x)
08-27 18:36:57.906986   900   921 I am_destroy_activity: [0,55317503,540,com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity,finish-imm:completedPausedLocked]
!!!!!!!!!!!!!!!!!
//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->startPausingLocked()-->schedulePauseTimeout()-->handleMessage(PAUSE_TIMEOUT_MSG)-->completePauseLocked()-->finishCurrentActivityLocked()--->destroyActivityLocked(x,x,x)-->removeActivityFromHistoryLocked()-->r.removeWindowContainer();
//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->startPausingLocked()-->schedulePauseTimeout()-->handleMessage(PAUSE_TIMEOUT_MSG)-->completePauseLocked()-->finishCurrentActivityLocked()--->destroyActivityLocked(x,x,x)-->removeActivityFromHistoryLocked()-->removeTask()-->removeActivitiesFromLRUListLocked()-->remove()-->removeFromDisplay()

//onRemovedFromDisplay()
08-27 18:36:57.940855   900   921 V WindowManager: Removing focused app token:AppWindowToken{775b015 token=Token{bb665cc ActivityRecord{34c13ff u0 com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity t540}}} mIsExiting=

08-27 18:36:57.966817   900   921 I am_remove_task: [540,521]

08-27 18:36:58.180758   900   921 W ActivityManager: Force-killing crashed app null at watcher's request

//handleApplicationCrash-->handleApplicationCrashInner()-->crashApplicationInner()-->handleAppCrashInActivityController()-->makeAppCrashingLocked()-->handleAppCrashLocked()-->finishTopCrashedActivitiesLocked()-->finishTopCrashedActivityLocked()-->finishActivityLocked()-->startPausingLocked()-->schedulePauseTimeout()-->handleMessage(PAUSE_TIMEOUT_MSG)-->completePauseLocked()-->finishCurrentActivityLocked()-->ensureVisibilityAndConfig()-->getDisplayOverrideConfiguration()
08-27 18:36:58.164256   900   921 I am_crash: [900,0,system_server,-1,java.lang.IllegalArgumentException,No display found with id: -1,ActivityStackSupervisor.java,477]

根据以上原因分析: google原生bug
执行finishCurrentActivityLocked时先执行了destroyActivityLocked(),后再执行ensureVisibilityAndConfig(),具体代码如下:

3914          final boolean finishingActivityInNonFocusedStack
3915                  = r.getStack() != mStackSupervisor.getFocusedStack()
3916                  && prevState == PAUSED && mode == FINISH_AFTER_VISIBLE;

3918          if (mode == FINISH_IMMEDIATELY
3919                  || (prevState == PAUSED
3920                      && (mode == FINISH_AFTER_PAUSE || inPinnedWindowingMode()))
3921                  || finishingActivityInNonFocusedStack
3922                  || prevState == STOPPING
3923                  || prevState == STOPPED
3924                  || prevState == ActivityState.INITIALIZING) {
3925              r.makeFinishingLocked();
3926           boolean activityRemoved = destroyActivityLocked(r, true, "finish-imm:" + reason);
3927

3928              if (finishingActivityInNonFocusedStack) {
3929                  // Finishing activity that was in paused state and it was in not currently focused
3930                  // stack, need to make something visible in its place.
3931             mStackSupervisor.ensureVisibilityAndConfig(next, mDisplayId,
3932                     false /* markFrozenIfConfigChanged /, true / deferResume */);

3933              }

1,跟踪destroyActivityLocked的调用流程:
destroyActivityLocked(x,y,z) --> removeActivityFromHistoryLocked() --> removeTask() --> removeActivitiesFromLRUListLocked() --> remove() --> removeFromDisplay()
最终执行了如下代码

721      private void removeFromDisplay() {
722          final ActivityDisplay display = getDisplay();
723          if (display != null) {
724              display.removeChild(this);
725          }
726          mDisplayId = INVALID_DISPLAY;

727      }

2,跟踪ensureVisibilityAndConfig的执行:
ensureVisibilityAndConfig() -->getDisplayOverrideConfiguration()
最终出错代码:

467    Configuration getDisplayOverrideConfiguration(int displayId) {
468        final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
469        if (activityDisplay == null) {
470            throw new IllegalArgumentException("No display found with id: " + displayId);
471        }
472
473        return activityDisplay.getOverrideConfiguration();
474    }

原因分析:google原生bug, handleappcrash流程中先执行了removetask 及removewindow的操作会把ActivityDisplay 的displayid置为invalid_display (-1), 之后要去设置view的visible状态要用到对应的displayid去获取ActivityDisplay对象时发生JE 
修改方案:如果执行了activitydisplay的remove操作会把windowcontroller置为null,这里要设置view的visible状态时检查对应的windowcontroller是否存在 。

在ActivityStack.java中

3914          final boolean finishingActivityInNonFocusedStack
3915                  = r.getStack() != mStackSupervisor.getFocusedStack()
3916                  && prevState == PAUSED && mode == FINISH_AFTER_VISIBLE;

3918          if (mode == FINISH_IMMEDIATELY
3919                  || (prevState == PAUSED
3920                      && (mode == FINISH_AFTER_PAUSE || inPinnedWindowingMode()))
3921                  || finishingActivityInNonFocusedStack
3922                  || prevState == STOPPING
3923                  || prevState == STOPPED
3924                  || prevState == ActivityState.INITIALIZING) {
3925              r.makeFinishingLocked();
3926           boolean activityRemoved = destroyActivityLocked(r, true, "finish-imm:" + reason);
3927

3928              ///if (finishingActivityInNonFocusedStack) {
                  //添加mWindowContainerController != null
                  if (finishingActivityInNonFocusedStack && mWindowContainerController != null) {
3929                  // Finishing activity that was in paused state and it was in not currently focused
3930                  // stack, need to make something visible in its place.
3931             mStackSupervisor.ensureVisibilityAndConfig(next, mDisplayId,
3932                     false /* markFrozenIfConfigChanged /, true / deferResume */);

3933              }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SystemServer 是 Android 系统启动过程的关键组件之一,它负责启动和管理系统的各种服务和进程。SystemServer 的主要功能如下: 1. 启动 Android 系统的各种系统服务,如 ActivityManagerService、PackageManagerService、WindowManagerService 等; 2. 初始化和启动 Zygote 进程,该进程将作为应用程序进程的父进程; 3. 启动系统的各种进程,如系统进程、系统应用进程等; 4. 加载和初始化 Android 系统的各种服务和组件。 下面是 SystemServer 的源码解析: 1. SystemServer 的入口 SystemServer 的入口在 frameworks/base/services/java/com/android/server/SystemServer.java 文件。在该文件,SystemServer 类继承了 Binder 和 Runnable 接口,并且实现了 Runnable 接口的 run() 方法,该方法是 SystemServer 的入口。 在 run() 方法,SystemServer 执行了以下操作: 1.1. 初始化 SystemServer 的环境 SystemServer 首先初始化自己的环境,包括设置系统属性、设置线程优先级等。 1.2. 启动各种系统服务 SystemServer 启动 Android 系统的各种系统服务,包括 ActivityManagerService、PackageManagerService、WindowManagerService 等。这些服务都是在 SystemServer 的构造方法创建的。 1.3. 初始化和启动 Zygote 进程 SystemServer 初始化和启动 Zygote 进程,该进程将作为应用程序进程的父进程。具体而言,SystemServer 调用 Zygote 的 main() 方法启动 Zygote 进程,并且设置 Zygote 的命令行参数。 1.4. 启动系统的各种进程 SystemServer 启动 Android 系统的各种进程,包括系统进程、系统应用进程等。具体而言,SystemServer 调用 ActivityManagerService 的 startSystemServer() 方法启动系统进程,并且调用 PackageManagerService 的 scanDirTracedLI() 方法扫描系统应用。 1.5. 加载和初始化 Android 系统的各种服务和组件 SystemServer 加载和初始化 Android 系统的各种服务和组件,包括 SystemUI、Launcher、InputMethodService 等。具体而言,SystemServer 调用 ActivityManagerService 的 startHomeActivity() 方法启动 Launcher,并且调用 PackageManagerService 的 packageInstalled() 方法加载和初始化应用程序。 2. SystemServer 的启动流程 SystemServer 的启动流程如下: 2.1. 启动 init 进程 在 Android 系统启动过程init 进程是第一个进程。init 进程启动时,会执行 init.rc 脚本的命令,并且启动 SystemServer 进程。 2.2. 创建 SystemServer 进程 SystemServer 进程是在 init.rc 脚本通过 service 命令创建的。具体而言,init.rc 脚本会执行以下命令: ``` service system_server /system/bin/app_process -Xbootclasspath:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/core-junit.jar -classpath /system/framework/services.jar com.android.server.SystemServer ``` 该命令会启动 SystemServer 进程,并且设置 SystemServer 的启动参数。 2.3. 执行 SystemServer 的 run() 方法 当 SystemServer 进程启动后,会执行 SystemServer 的 run() 方法。在 run() 方法,SystemServer 完成了 Android 系统的初始化和启动过程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值