Análisis de problemas de apagado / reinicio de prueba de mono (3)

artículos anteriores

Análisis de motivo de apagado/reinicio de Android
prueba de mono análisis de problema de apagado/reinicio (1)
análisis de problema de apagado/reinicio de prueba de mono (2)
análisis de problema de apagado/reinicio de prueba de mono (3)

proceso de apagado

El proceso de cierre puede consultar los siguientes artículos de otras personas https://blog.csdn.net/qq_29413633/article/details/120848128

El proceso de activación puede ser diferente, como presionar prolongadamente para cerrar, hacer clic en el botón de cierre del cuadro de diálogo para cerrar, etc.
1. Proceso de apagado de la capa superior

Finalmente volvemos a ShutdowmThread.

Esta pregunta sigue al análisis del problema de apagado/reinicio de la prueba del mono (2) y continúa hacia abajo, llamando a mBarService.shutdown() desde systemui; finalmente vaya a frameworks/base/services/core/java/com/android/server/statusbar /StatusBarManagerService. Java

1.1、Servicio de administrador de barra de estado

    public void shutdown() {
    
    
        enforceStatusBarService();
        String reason = PowerManager.SHUTDOWN_USER_REQUESTED;
        ShutdownCheckPoints.recordCheckPoint(Binder.getCallingPid(), reason);//这里就是ShutdownCheckPoints log打印的地方,用来跟踪是哪个进程调用了关机
        final long identity = Binder.clearCallingIdentity();
        try {
    
    
            mNotificationDelegate.prepareForPossibleShutdown();
            // ShutdownThread displays UI, so give it a UI context.
            mHandler.post(() ->
                    ShutdownThread.shutdown(getUiContext(), reason, false));//这里调用到ShutdownThread
        } finally {
    
    
            Binder.restoreCallingIdentity(identity);
        }
    }

1.2、ShutdowmThread.run()

    public void run() {
    
    
        TimingsTraceLog shutdownTimingLog = newTimingsLog();
        shutdownTimingLog.traceBegin("SystemServerShutdown");
        ...
        //关机之前关掉其它service等一系列操作。
        ...
        // Remaining work will be done by init, including vold shutdown
        rebootOrShutdown(mContext, mReboot, mReason);
    }

1.3、ShutdownThread.rebootOrShutdown()

    public static void rebootOrShutdown(final Context context, boolean reboot, String reason) {
    
    
        //add for sreen off earlier
        if (sInstance.mPowerManager != null) {
    
    
            Log.i(TAG, "rebootOrShutdown:goToSleep");
            sInstance.mPowerManager.goToSleep(SystemClock.uptimeMillis());
        }

        if (reboot) {
    
    
            Log.i(TAG, "Rebooting, reason: " + reason);
            PowerManagerService.lowLevelReboot(reason);//重启
            Log.e(TAG, "Reboot failed, will attempt shutdown instead");
            reason = null;
        } else if (SHUTDOWN_VIBRATE_MS > 0 && context != null) {
    
    
            // vibrate before shutting down
            Vibrator vibrator = new SystemVibrator(context);
            try {
    
    
                vibrator.vibrate(SHUTDOWN_VIBRATE_MS, VIBRATION_ATTRIBUTES);
            } catch (Exception e) {
    
    
                // Failure to vibrate shouldn't interrupt shutdown.  Just log it.
                Log.w(TAG, "Failed to vibrate during shutdown.", e);
            }

            // vibrator is asynchronous so we need to wait to avoid shutting down too soon.
            try {
    
    
                Thread.sleep(SHUTDOWN_VIBRATE_MS);
            } catch (InterruptedException unused) {
    
    
            }
        }
        // Shutdown power
        Log.i(TAG, "Performing low-level shutdown...");
        PowerManagerService.lowLevelShutdown(reason);//关机
    }

1.4、PowerManagerService.lowLevelShutdown(motivo);

    public static void lowLevelShutdown(String reason) {
    
    
        if (reason == null) {
    
    
            reason = "";
        }
        String chargeTypeString = "";
        if(mChargeType) {
    
    
            chargeTypeString  = ",charging";
        }
        //通过设置系统属性关机
        SystemProperties.set("sys.powerctl", "shutdown," + reason + chargeTypeString);
    }

El código Java de nivel superior está aquí. Después de apagar y reiniciar, se establecen las propiedades del sistema, el código C subyacente escucha el nodo para realizar operaciones reales.

SystemProperties.set("sys.powerctl", "reboot," + reason);//重启
SystemProperties.set("sys.powerctl", "shutdown," + reason + chargeTypeString);//关机

2. El proceso de cierre subyacente

Supongo que te gusta

Origin blog.csdn.net/a396604593/article/details/131195882
Recomendado
Clasificación