国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Android】Android Framework系列---CarPower電源管理

這篇具有很好參考價(jià)值的文章主要介紹了【Android】Android Framework系列---CarPower電源管理。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Android Framework系列—CarPower電源管理

智能座艙通常包括中控系統(tǒng)、儀表系統(tǒng)、IVI系統(tǒng) 、后排娛樂、HUD、車聯(lián)網(wǎng)等。這些系統(tǒng)需要由汽車電源進(jìn)行供電。由于汽車自身的特殊供電環(huán)境(相比手機(jī)方便的充電環(huán)境,汽車的蓄電池如果沒有電是需要專業(yè)人士操作的),其電源狀態(tài)會(huì)比較復(fù)雜,既要滿足車內(nèi)的座艙系統(tǒng)啟動(dòng)足夠快,又要保證汽車蓄電池的可考性,所以出了開機(jī)(on)、關(guān)機(jī)(off)外,會(huì)多出來一些電源狀態(tài)(Suspend、STR、SLEEP等等)

所以,一般來說軟件系統(tǒng)是需要一個(gè)專門的電源管理模塊的。

CarPower電源管理

Android Automotive(基于Android平臺(tái)的車載信息娛樂系統(tǒng))提供了CarPower模塊用于管理電源狀態(tài)。CarPower Service屬于CarService,在SystemSever的startOtherService階段啟動(dòng)。
【Android】Android Framework系列---CarPower電源管理,Android,android,電源管理,CarPower,開機(jī),Car服務(wù)
CarPower Service根據(jù)來自于 Vehicle HAL(Hal層服務(wù))的電源狀態(tài)通知,進(jìn)行相關(guān)的邏輯判斷后,應(yīng)用電源策略(簡單理解成告知某些服務(wù)Enable 或者Disable)、發(fā)送狀態(tài)通知給它自身的監(jiān)聽者、回復(fù)(Report)VehcileHAL處理結(jié)果。
Vehicle HAL的電源狀態(tài)一般來講是來自于MCU的(can通信 或者以太網(wǎng)通信,具體形式由Vehicle HAL和相關(guān)供應(yīng)商決定)。電源狀態(tài)變化時(shí),MCU一般會(huì)拉低或者拉高某個(gè)引腳,然后通知事件給VehicleHAL,VehicleHAL再通過PropertyEvent通知給CarPower Service。Android系統(tǒng)處理完電源狀態(tài)后(有超時(shí)要求),再由VehiclHAL告知MCU,MCU在對(duì)某個(gè)引腳進(jìn)行相關(guān)操作。
【Android】Android Framework系列---CarPower電源管理,Android,android,電源管理,CarPower,開機(jī),Car服務(wù)

CarPower電源管理的開機(jī)流程

下面以Android車載系統(tǒng)開機(jī)為例。說明一下CarPower模塊的開機(jī)時(shí)序。代碼基于Android12.文章來源地址http://www.zghlxwxcb.cn/news/detail-734324.html

  • CarPower服務(wù)啟動(dòng):Android系統(tǒng)開機(jī)上電,在systemServer中啟動(dòng)CarService。
// frameworks/base/services/java/com/android/server/SystemServer.java

/**
 * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
 */
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
                t.traceBegin("StartCarServiceHelperService");
                final SystemService cshs = mSystemServiceManager
                        .startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
                if (cshs instanceof Dumpable) {
                    mDumper.addDumpable((Dumpable) cshs);
                }
                if (cshs instanceof DevicePolicySafetyChecker) {
                    dpms.setDevicePolicySafetyChecker((DevicePolicySafetyChecker) cshs);
                }
                t.traceEnd();
            }

}

// frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java
public void onStart() {
	EventLog.writeEvent(EventLogTags.CAR_HELPER_START, mHalEnabled ? 1 : 0);

	IntentFilter filter = new IntentFilter(Intent.ACTION_REBOOT);
	filter.addAction(Intent.ACTION_SHUTDOWN);
	mContext.registerReceiverForAllUsers(mShutdownEventReceiver, filter, null, null);
	mCarWatchdogDaemonHelper.addOnConnectionChangeListener(mConnectionListener);
	mCarWatchdogDaemonHelper.connect();
	// 啟動(dòng)了CarService------------------------------------------
	Intent intent = new Intent();
	intent.setPackage("com.android.car");
	intent.setAction(ICarConstants.CAR_SERVICE_INTERFACE);
	if (!mContext.bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE,
			UserHandle.SYSTEM)) {
		Slog.wtf(TAG, "cannot start car service");
	}
	loadNativeLibrary();
}
  • CarService啟動(dòng)后會(huì)創(chuàng)建CarPower實(shí)例。
<!-- packages/services/Car/service/AndroidManifest.xml -->
<application android:label="@string/app_title"
			 android:directBootAware="true"
			 android:allowBackup="false"
			 android:persistent="true">

	<service android:name=".CarService"
			android:singleUser="true">
		<intent-filter>
			<action android:name="android.car.ICar" />
		</intent-filter>
	</service>

// packages/services/Car/service/src/com/android/car/ICarImpl.java
public class ICarImpl extends ICar.Stub {

   public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
            CanBusErrorNotifier errorNotifier, String vehicleInterfaceName) {
        this(serviceContext, vehicle, systemInterface, errorNotifier, vehicleInterfaceName,
                /* carUserService= */ null, /* carWatchdogService= */ null);
    }

    @VisibleForTesting
    ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface,
            CanBusErrorNotifier errorNotifier, String vehicleInterfaceName,
            @Nullable CarUserService carUserService,
            @Nullable CarWatchdogService carWatchdogService) {
        mContext = serviceContext;
        mSystemInterface = systemInterface;
        mHal = new VehicleHal(serviceContext, vehicle);
        // Do this before any other service components to allow feature check. It should work
        // even without init. For that, vhal get is retried as it can be too early.
        VehiclePropValue disabledOptionalFeatureValue = mHal.getIfAvailableOrFailForEarlyStage(
                    VehicleProperty.DISABLED_OPTIONAL_FEATURES, INITIAL_VHAL_GET_RETRY);
        String[] disabledFeaturesFromVhal = null;
        if (disabledOptionalFeatureValue != null) {
            String disabledFeatures = disabledOptionalFeatureValue.value.stringValue;
            if (disabledFeatures != null && !disabledFeatures.isEmpty()) {
                disabledFeaturesFromVhal = disabledFeatures.split(",");
            }
        }
        if (disabledFeaturesFromVhal == null) {
            disabledFeaturesFromVhal = new String[0];
        }
        Resources res = mContext.getResources();
        String[] defaultEnabledFeatures = res.getStringArray(
                R.array.config_allowed_optional_car_features);
        mFeatureController = new CarFeatureController(serviceContext, defaultEnabledFeatures,
                disabledFeaturesFromVhal , mSystemInterface.getSystemCarDir());
        CarLocalServices.addService(CarFeatureController.class, mFeatureController);
        mVehicleInterfaceName = vehicleInterfaceName;
        mUserManagerHelper = new CarUserManagerHelper(serviceContext);
        if (carUserService != null) {
            mCarUserService = carUserService;
        } else {
            UserManager userManager =
                    (UserManager) serviceContext.getSystemService(Context.USER_SERVICE);
            int maxRunningUsers = res.getInteger(
                    com.android.internal.R.integer.config_multiuserMaxRunningUsers);
            mCarUserService = new CarUserService(serviceContext, mHal.getUserHal(),
                    mUserManagerHelper, userManager, ActivityManager.getService(), maxRunningUsers);
        }
        mCarOccupantZoneService = new CarOccupantZoneService(serviceContext);
        mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
		// 這里創(chuàng)建了CarPower服務(wù)實(shí)例-----------------------------------------------------------
        mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(),
                systemInterface, mCarUserService);
        if (mFeatureController.isFeatureEnabled(CarFeatures.FEATURE_CAR_USER_NOTICE_SERVICE)) {
            mCarUserNoticeService = new CarUserNoticeService(serviceContext);
        } else {
            mCarUserNoticeService = null;
        }
        mCarPropertyService = new CarPropertyService(serviceContext, mHal.getPropertyHal());
        mCarDrivingStateService = new CarDrivingStateService(serviceContext, mCarPropertyService);
        mCarUXRestrictionsService = new CarUxRestrictionsManagerService(serviceContext,
                mCarDrivingStateService, mCarPropertyService);
        if (mFeatureController.isFeatureEnabled(Car.OCCUPANT_AWARENESS_SERVICE)) {
            mOccupantAwarenessService = new OccupantAwarenessService(serviceContext);
        } else {
            mOccupantAwarenessService = null;
        }
        mCarPackageManagerService = new CarPackageManagerService(serviceContext,
                mCarUXRestrictionsService,
                mSystemActivityMonitoringService,
                mCarUserService);
        mPerUserCarServiceHelper = new PerUserCarServiceHelper(serviceContext, mCarUserService);
        mCarBluetoothService = new CarBluetoothService(serviceContext, mPerUserCarServiceHelper);
        mCarInputService = new CarInputService(serviceContext, mHal.getInputHal(), mCarUserService);
        mCarProjectionService = new CarProjectionService(
                serviceContext, null /* handler */, mCarInputService, mCarBluetoothService);
        mGarageModeService = new GarageModeService(mContext);
        mAppFocusService = new AppFocusService(serviceContext, mSystemActivityMonitoringService);
        mCarAudioService = new CarAudioService(serviceContext);
        mCarNightService = new CarNightService(serviceContext, mCarPropertyService);
        mFixedActivityService = new FixedActivityService(serviceContext);
        mInstrumentClusterService = new InstrumentClusterService(serviceContext,
                mAppFocusService, mCarInputService);
        mSystemStateControllerService = new SystemStateControllerService(
                serviceContext, mCarAudioService, this);
        mCarStatsService = new CarStatsService(serviceContext);
        mCarStatsService.init();
        if (mFeatureController.isFeatureEnabled(Car.VEHICLE_MAP_SERVICE)) {
            mVmsBrokerService = new VmsBrokerService(mContext, mCarStatsService);
        } else {
            mVmsBrokerService = null;
        }
        if (mFeatureController.isFeatureEnabled(Car.DIAGNOSTIC_SERVICE)) {
            mCarDiagnosticService = new CarDiagnosticService(serviceContext,
                    mHal.getDiagnosticHal());
        } else {
            mCarDiagnosticService = null;
        }
        if (mFeatureController.isFeatureEnabled(Car.STORAGE_MONITORING_SERVICE)) {
            mCarStorageMonitoringService = new CarStorageMonitoringService(serviceContext,
                    systemInterface);
        } else {
            mCarStorageMonitoringService = null;
        }
        mCarConfigurationService =
                new CarConfigurationService(serviceContext, new JsonReaderImpl());
        mCarLocationService = new CarLocationService(serviceContext);
        mCarTrustedDeviceService = new CarTrustedDeviceService(serviceContext);
        mCarMediaService = new CarMediaService(serviceContext, mCarUserService);
        mCarBugreportManagerService = new CarBugreportManagerService(serviceContext);
        if (!Build.IS_USER) {
            mCarExperimentalFeatureServiceController = new CarExperimentalFeatureServiceController(
                    serviceContext);
        } else {
            mCarExperimentalFeatureServiceController = null;
        }
        if (carWatchdogService == null) {
            mCarWatchdogService = new CarWatchdogService(serviceContext);
        } else {
            mCarWatchdogService = carWatchdogService;
        }
		//  將電源服務(wù),添加到Car本地服務(wù)List中-----------------------------
        CarLocalServices.addService(CarPowerManagementService.class, mCarPowerManagementService);
        CarLocalServices.addService(CarPropertyService.class, mCarPropertyService);
        CarLocalServices.addService(CarUserService.class, mCarUserService);
        CarLocalServices.addService(CarTrustedDeviceService.class, mCarTrustedDeviceService);
        CarLocalServices.addService(CarUserNoticeService.class, mCarUserNoticeService);
        CarLocalServices.addService(SystemInterface.class, mSystemInterface);
        CarLocalServices.addService(CarDrivingStateService.class, mCarDrivingStateService);
        CarLocalServices.addService(PerUserCarServiceHelper.class, mPerUserCarServiceHelper);
        CarLocalServices.addService(FixedActivityService.class, mFixedActivityService);
        CarLocalServices.addService(VmsBrokerService.class, mVmsBrokerService);
        CarLocalServices.addService(CarOccupantZoneService.class, mCarOccupantZoneService);
        CarLocalServices.addService(AppFocusService.class, mAppFocusService);

        // Be careful with order. Service depending on other service should be inited later.
        List<CarServiceBase> allServices = new ArrayList<>();
        allServices.add(mFeatureController);
        allServices.add(mCarUserService);
        allServices.add(mSystemActivityMonitoringService);
		//  將電源服務(wù),添加到Car服務(wù)List中-----------------------------
        allServices.add(mCarPowerManagementService);
        allServices.add(mCarPropertyService);
        allServices.add(mCarDrivingStateService);
        allServices.add(mCarOccupantZoneService);
        allServices.add(mCarUXRestrictionsService);
        addServiceIfNonNull(allServices, mOccupantAwarenessService);
        allServices.add(mCarPackageManagerService);
        allServices.add(mCarInputService);
        allServices.add(mGarageModeService);
        addServiceIfNonNull(allServices, mCarUserNoticeService);
        allServices.add(mAppFocusService);
        allServices.add(mCarAudioService);
        allServices.add(mCarNightService);
        allServices.add(mFixedActivityService);
        allServices.add(mInstrumentClusterService);
        allServices.add(mSystemStateControllerService);
        allServices.add(mPerUserCarServiceHelper);
        allServices.add(mCarBluetoothService);
        allServices.add(mCarProjectionService);
        addServiceIfNonNull(allServices, mCarDiagnosticService);
        addServiceIfNonNull(allServices, mCarStorageMonitoringService);
        allServices.add(mCarConfigurationService);
        addServiceIfNonNull(allServices, mVmsBrokerService);
        allServices.add(mCarTrustedDeviceService);
        allServices.add(mCarMediaService);
        allServices.add(mCarLocationService);
        allServices.add(mCarBugreportManagerService);
        allServices.add(mCarWatchdogService);
        // Always put mCarExperimentalFeatureServiceController in last.
        addServiceIfNonNull(allServices, mCarExperimentalFeatureServiceController);
        mAllServices = allServices.toArray(new CarServiceBase[allServices.size()]);
    }
}
  • CarPower服務(wù)啟動(dòng)后,會(huì)注冊(cè)成為PowerHalService的監(jiān)聽者。并主動(dòng)發(fā)出WAIT_FOR_VHALL(初始狀態(tài))告知CarPower的監(jiān)聽者,并取一下當(dāng)前的屏幕亮度發(fā)送給VHAL。并連接Native層的CarPowerPolicyService來初始化電源管理政策。
// packages/services/Car/service/src/com/android/car/CarPowerManagementService.java

/**
 * Power Management service class for cars. Controls the power states and interacts with other
 * parts of the system to ensure its own state.
 */
public class CarPowerManagementService extends ICarPower.Stub implements
        CarServiceBase, PowerHalService.PowerEventListener {
    public CarPowerManagementService(Context context, PowerHalService powerHal,
            SystemInterface systemInterface, CarUserService carUserService) {
        this(context, context.getResources(), powerHal, systemInterface, UserManager.get(context),
                carUserService, new InitialUserSetter(context,
                        (u) -> carUserService.setInitialUser(u),
                        context.getString(R.string.default_guest_name)),
                IVoiceInteractionManagerService.Stub.asInterface(
                        ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)));
    }

    @VisibleForTesting
    public CarPowerManagementService(Context context, Resources resources, PowerHalService powerHal,
            SystemInterface systemInterface, UserManager userManager, CarUserService carUserService,
            InitialUserSetter initialUserSetter,
            IVoiceInteractionManagerService voiceInteractionService) {
        mContext = context;
        mHal = powerHal;
        mSystemInterface = systemInterface;
        mUserManager = userManager;
        mDisableUserSwitchDuringResume = resources
                .getBoolean(R.bool.config_disableUserSwitchDuringResume);
        mShutdownPrepareTimeMs = resources.getInteger(
                R.integer.maxGarageModeRunningDurationInSecs) * 1000;
        mSwitchGuestUserBeforeSleep = resources.getBoolean(
                R.bool.config_switchGuestUserBeforeGoingSleep);
        if (mShutdownPrepareTimeMs < MIN_MAX_GARAGE_MODE_DURATION_MS) {
            Slog.w(TAG,
                    "maxGarageModeRunningDurationInSecs smaller than minimum required, resource:"
                    + mShutdownPrepareTimeMs + "(ms) while should exceed:"
                    +  MIN_MAX_GARAGE_MODE_DURATION_MS + "(ms), Ignore resource.");
            mShutdownPrepareTimeMs = MIN_MAX_GARAGE_MODE_DURATION_MS;
        }
        mUserService = carUserService;
        mInitialUserSetter = initialUserSetter;
        mVoiceInteractionManagerService = voiceInteractionService;
        mWifiManager = context.getSystemService(WifiManager.class);
        mWifiStateFile = new AtomicFile(
                new File(mSystemInterface.getSystemCarDir(), WIFI_STATE_FILENAME));
    }
}

@Override
public void init() {
	mPolicyReader.init();
	mPowerComponentHandler.init();
	mHal.setListener(this);
	if (mHal.isPowerStateSupported()) {
		// 發(fā)出初始化狀態(tài)-------------------------------------------
		// Initialize CPMS in WAIT_FOR_VHAL state
		onApPowerStateChange(CpmsState.WAIT_FOR_VHAL, CarPowerStateListener.WAIT_FOR_VHAL);
	} else {
		Slogf.w(TAG, "Vehicle hal does not support power state yet.");
		onApPowerStateChange(CpmsState.ON, CarPowerStateListener.ON);
	}
	//  監(jiān)控屏幕狀態(tài),這個(gè)函數(shù)中會(huì)將屏幕亮度發(fā)給Vehicle HAL
	mSystemInterface.startDisplayStateMonitoring(this);
	//  連接Car PowerPolicy服務(wù),初始化電源政策
	connectToPowerPolicyDaemon();
}
  • CarPower啟動(dòng)會(huì)立刻向監(jiān)聽者和VehicleHAL發(fā)出WAIT_FOR_VHAL這個(gè)狀態(tài)
// packages/services/Car/service/src/com/android/car/power/CarPowerManagementService.java
private void doHandlePowerStateChange() {
	CpmsState state;
	synchronized (mLock) {
		state = mPendingPowerStates.peekFirst();
		mPendingPowerStates.clear();
		if (state == null) {
			Slogf.e(TAG, "Null power state was requested");
			return;
		}
		Slogf.i(TAG, "doHandlePowerStateChange: newState=%s", state.name());
		if (!needPowerStateChangeLocked(state)) {
			return;
		}
		// now real power change happens. Whatever was queued before should be all cancelled.
		releaseTimerLocked();
		mCurrentState = state;
	}
	mHandler.cancelProcessingComplete();
	Slogf.i(TAG, "setCurrentState %s", state);
	CarStatsLogHelper.logPowerState(state.mState);
	switch (state.mState) {
		case CpmsState.WAIT_FOR_VHAL:
			//  處理WAIT_FOR_VHAL狀態(tài)----------------------------
			handleWaitForVhal(state);
			break;
		case CpmsState.ON:
			handleOn();
			break;
		case CpmsState.SHUTDOWN_PREPARE:
			handleShutdownPrepare(state);
			break;
		case CpmsState.SIMULATE_SLEEP:
			simulateShutdownPrepare();
			break;
		case CpmsState.WAIT_FOR_FINISH:
			handleWaitForFinish(state);
			break;
		case CpmsState.SUSPEND:
			// Received FINISH from VHAL
			handleFinish();
			break;
		default:
			// Illegal state
			// TODO:  Throw exception?
			break;
	}
}


private void handleWaitForVhal(CpmsState state) {
	int carPowerStateListenerState = state.mCarPowerStateListenerState;
	// TODO(b/177478420): Restore Wifi, Audio, Location, and Bluetooth, if they are artificially
	// modified for S2R.
	mSilentModeHandler.querySilentModeHwState();
	// 給CarPower服務(wù)的監(jiān)聽者發(fā)送狀態(tài)
	sendPowerManagerEvent(carPowerStateListenerState);
	// Inspect CarPowerStateListenerState to decide which message to send via VHAL
	switch (carPowerStateListenerState) {
		case CarPowerStateListener.WAIT_FOR_VHAL:
			// 通過PowerHAlService向VehicleHAL發(fā)送狀態(tài)
			mHal.sendWaitForVhal();
			break;
		case CarPowerStateListener.SHUTDOWN_CANCELLED:
			mShutdownOnNextSuspend = false; // This cancels the "NextSuspend"
			mHal.sendShutdownCancel();
			break;
		case CarPowerStateListener.SUSPEND_EXIT:
			mHal.sendSleepExit();
			break;
	}
	if (mWifiAdjustmentForSuspend) restoreWifi();
}

  • 接下來,MCU會(huì)給VehicleHAL發(fā)送電源通知,VehicleHAL通知(AP_POWER_STATE_REQ= ON) 給CarPower服務(wù)。
@Override
public void onHalEvents(List<VehiclePropValue> values) {
	PowerEventListener listener;
	synchronized (mLock) {
		if (mListener == null) {
			if (mQueuedEvents == null) {
				mQueuedEvents = new LinkedList<>();
			}
			mQueuedEvents.addAll(values);
			return;
		}
		listener = mListener;
	}
	dispatchEvents(values, listener);
}

private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {
	for (VehiclePropValue v : values) {
		switch (v.prop) {
			case AP_POWER_STATE_REPORT:
				// Ignore this property event. It was generated inside of CarService.
				break;
			case AP_POWER_STATE_REQ:
				// 發(fā)送的是這個(gè)狀態(tài)------ AP_POWER_STATE_REQ=ON
				int state = v.value.int32Values.get(VehicleApPowerStateReqIndex.STATE);
				int param = v.value.int32Values.get(VehicleApPowerStateReqIndex.ADDITIONAL);
				Slog.i(CarLog.TAG_POWER, "Received AP_POWER_STATE_REQ="
						+ powerStateReqName(state) + " param=" + param);
				listener.onApPowerStateChange(new PowerState(state, param));
				break;
			case DISPLAY_BRIGHTNESS:
			{
				int maxBrightness;
				synchronized (mLock) {
					maxBrightness = mMaxDisplayBrightness;
				}
				int brightness = v.value.int32Values.get(0) * MAX_BRIGHTNESS / maxBrightness;
				if (brightness < 0) {
					Slog.e(CarLog.TAG_POWER, "invalid brightness: " + brightness
							+ ", set to 0");
					brightness = 0;
				} else if (brightness > MAX_BRIGHTNESS) {
					Slog.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to "
							+ MAX_BRIGHTNESS);
					brightness = MAX_BRIGHTNESS;
				}
				Slog.i(CarLog.TAG_POWER, "Received DISPLAY_BRIGHTNESS=" + brightness);
				listener.onDisplayBrightnessChange(brightness);
			}
				break;
		}
	}
}
  • CarPowerService接收到 AP_POWER_STATE_REQ= ON,認(rèn)為當(dāng)前是電源ON的狀態(tài)。應(yīng)用電源策略(告知機(jī)能模塊可以使能)、通知觀察者電源狀態(tài)為ON,然后向VehicleHAL進(jìn)行回復(fù)(也叫report)
packages/services/Car/service/src/com/android/car/power/CarPowerManagementService.java


@Override
public void onApPowerStateChange(PowerState state) {
	synchronized (mLock) {
		mPendingPowerStates.addFirst(new CpmsState(state));
		mLock.notify();
	}
	// 發(fā)給handler,在單獨(dú)的線程中處理。最終調(diào)用的是自身的doHandlePowerStateChange函數(shù)
	mHandler.handlePowerStateChange();
}


private void doHandlePowerStateChange() {
	CpmsState state;
	synchronized (mLock) {
		state = mPendingPowerStates.peekFirst();
		mPendingPowerStates.clear();
		if (state == null) {
			Slogf.e(TAG, "Null power state was requested");
			return;
		}
		Slogf.i(TAG, "doHandlePowerStateChange: newState=%s", state.name());
		if (!needPowerStateChangeLocked(state)) {
			return;
		}
		// now real power change happens. Whatever was queued before should be all cancelled.
		releaseTimerLocked();
		mCurrentState = state;
	}
	mHandler.cancelProcessingComplete();
	Slogf.i(TAG, "setCurrentState %s", state);
	CarStatsLogHelper.logPowerState(state.mState);
	switch (state.mState) {
		case CpmsState.WAIT_FOR_VHAL:
			handleWaitForVhal(state);
			break;
		case CpmsState.ON:
			// 處理電源ON----------------------------------------------------------------
			handleOn();
			break;
		case CpmsState.SHUTDOWN_PREPARE:
			handleShutdownPrepare(state);
			break;
		case CpmsState.SIMULATE_SLEEP:
			simulateShutdownPrepare();
			break;
		case CpmsState.WAIT_FOR_FINISH:
			handleWaitForFinish(state);
			break;
		case CpmsState.SUSPEND:
			// Received FINISH from VHAL
			handleFinish();
			break;
		default:
			// Illegal state
			// TODO:  Throw exception?
			break;
	}
}


@VisibleForTesting
void handleOn() {
	if (factoryResetIfNeeded()) return;

	// If current user is a Guest User, we want to inform CarUserNoticeService not to show
	// notice for current user, and show user notice only for the target user.
	if (!mSwitchGuestUserBeforeSleep) {
		updateCarUserNoticeServiceIfNecessary();
	}

	boolean isPreemptive;
	synchronized (mLock) {
		isPreemptive = mPolicyReader.isPreemptivePowerPolicy(mCurrentPowerPolicyId);
	}
	if (!mSilentModeHandler.isSilentMode() && isPreemptive) {
		cancelPreemptivePowerPolicy();
	} else {
		// 應(yīng)用電源策略---------------------------------
		applyDefaultPowerPolicyForState(VehicleApPowerStateReport.ON,
				PolicyReader.POWER_POLICY_ID_ALL_ON);
	}
	// 通知觀察者電源狀態(tài)為ON------------------------
	sendPowerManagerEvent(CarPowerStateListener.ON);
	// 通過PowerHAlServicee,回復(fù)Vehicle HAL(VehicleApPowerStateReport.ON)
	mHal.sendOn();

	synchronized (mLock) {
		if (mIsBooting) {
			Slogf.d(TAG, "handleOn(): called on boot");
			mIsBooting = false;
			return;
		}
	}

	try {
		mUserService.onResume();
	} catch (Exception e) {
		Slogf.e(TAG, e, "Could not switch user on resume");
	}
}
  • 到這里,CarPower主要的開機(jī)處理流程完畢。實(shí)際上可以看出來,主要是接收Vehicle HAl Event(包括回復(fù)VehicleHAL狀態(tài)),告知監(jiān)聽者電源狀態(tài)、應(yīng)用電源政策使能相關(guān)機(jī)能。并且在啟動(dòng)階段,取了一下當(dāng)前的屏幕亮度,告知VehicleHAL(最終是告知MCU)。當(dāng)然還有一些其他的處理,比如用戶服務(wù)的恢復(fù),有興趣的可以讀一下這部分代碼。
  • CarPowerService上電時(shí)序圖。
    【Android】Android Framework系列---CarPower電源管理,Android,android,電源管理,CarPower,開機(jī),Car服務(wù)

到了這里,關(guān)于【Android】Android Framework系列---CarPower電源管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Android Framework系列】第7章 WMS原理

    【Android Framework系列】第7章 WMS原理

    前面【Android Framework系列】第5章 AMS啟動(dòng)流程和【Android Framework系列】第6章 AMS原理之Launcher啟動(dòng)流程我們分析了 AMS啟動(dòng) 以及 Launcher啟動(dòng) 的整體流程,那 Launcher(Activity啟動(dòng))后 , UI 是如 何渲染到屏幕 并且 展示 出來的呢?我們這章節(jié)來探討一下。 WindowManagerService 簡稱 WMS ,是

    2024年02月16日
    瀏覽(25)
  • 【Android Framework系列】5章 AMS啟動(dòng)流程

    【Android Framework系列】5章 AMS啟動(dòng)流程

    AMS(Activity Manager Service) 是 Android 中最核心的服務(wù),管理著 四大組件的啟動(dòng) 、 切換 、 調(diào)度 及 應(yīng)用進(jìn)程的管理和調(diào)度 等工作。AndroidQ將Activity移到了 ActivityTaskManagerService 中,但也和AMS相關(guān)聯(lián)。 AMS 通過使用一些系統(tǒng)資源和數(shù)據(jù)結(jié)構(gòu)(如進(jìn)程、任務(wù)棧、記錄四大組件生命周期

    2024年02月15日
    瀏覽(26)
  • 【Android12】Android Framework系列---Adb和PMS安裝apk源碼流程

    【Android12】Android Framework系列---Adb和PMS安裝apk源碼流程

    通過adb install命令可以將apk安裝到Android系統(tǒng)(注意:特定類型的apk,比如persist類型是無法通過adb安裝的) 下述命令中adb解析install命令,并調(diào)用Android PackageManagerService進(jìn)行apk安裝。 基于Android12,分析從adb install到 PakcageManagerService安裝apk的流程。 adb install命令的源碼實(shí)現(xiàn) Andro

    2024年01月22日
    瀏覽(45)
  • 【Android Framework系列】第11章 LayoutInflater源碼分析

    【Android Framework系列】第11章 LayoutInflater源碼分析

    本章節(jié)我們主要目目的是了解 Activity 的 xml 布局解析、對(duì) LayoutInfater 源碼進(jìn)行分析。 我們知道Android界面上的每一個(gè)控件都是一個(gè)個(gè) View ,但是Android也提供了通過 xml 文件來進(jìn)行布局控制,那么 xml 布局文件如何轉(zhuǎn)成最終的 View 的呢?轉(zhuǎn)換利器就是 LayoutInflater 。在分析 Layout

    2024年02月12日
    瀏覽(27)
  • 【Android Framework系列】第2章 Binder機(jī)制大全

    【Android Framework系列】第2章 Binder機(jī)制大全

    ?? Binder是Android中主要的跨進(jìn)程通信方式 。Android系統(tǒng)中,每個(gè)應(yīng)用程序是由Android的Activity,Service,BroadCast,ContentProvider這四劍客中一個(gè)或多個(gè)組合而成,這四劍客所涉及的多進(jìn)程間的通信底層都是依賴于BinderIPC機(jī)制。例如當(dāng)進(jìn)程A中的Activity要向進(jìn)程B中的Service通信,這便需

    2024年02月10日
    瀏覽(23)
  • 【Android Framework系列】第3章 Zygote進(jìn)程相關(guān)

    【Android Framework系列】第3章 Zygote進(jìn)程相關(guān)

    Zygote是Android中最重要的一個(gè)進(jìn)程, Zygote進(jìn)程和Init進(jìn)程、SystemServer進(jìn)程是Android最重要的三大進(jìn)程 。 Zygote是Android系統(tǒng)創(chuàng)建新進(jìn)程的核心進(jìn)程,負(fù)責(zé)啟動(dòng)Dalvik虛擬機(jī),加載一些必要的系統(tǒng)資源和系統(tǒng)類,啟動(dòng)system_server進(jìn)程,隨后進(jìn)入等待處理app應(yīng)用請(qǐng)求。 在Android系統(tǒng)中,應(yīng)用

    2024年02月11日
    瀏覽(21)
  • android framework之AMS的啟動(dòng)管理與職責(zé)

    AMS是什么? AMS管理著activity,Service, Provide, BroadcastReceiver android10后:出現(xiàn)ATMS,ActivityTaskManagerService:ATMS是從AMS中抽出來,單獨(dú)管理著原來AMS中的Activity組件 。 現(xiàn)在我們對(duì)AMS的分析,也就包含對(duì)ATMS的分析了。 AMS如何被別人管理?---被SystemServer的SystemServiceManager所管理 AMS如何被人

    2024年02月10日
    瀏覽(24)
  • 【Android Framework系列】第10章 PMS之Hook實(shí)現(xiàn)廣播的調(diào)用

    【Android Framework系列】第10章 PMS之Hook實(shí)現(xiàn)廣播的調(diào)用

    前面章節(jié)我們學(xué)習(xí)了【Android Framework系列】第4章 PMS原理我們了解了PMS原理,【Android Framework系列】第9章 AMS之Hook實(shí)現(xiàn)登錄頁跳轉(zhuǎn)我們知道AMS可以Hook攔截下來實(shí)現(xiàn)未注冊(cè)Activity頁面的跳轉(zhuǎn),本章節(jié)我們來嘗試一下 HookPMS實(shí)現(xiàn)廣播的發(fā)送 。 這里我們只簡單介紹一下HookPMS思路和重

    2024年02月13日
    瀏覽(22)
  • 【Android Framework系列】第13章 SVG矢量圖形自定義組件(繪制中國地圖)

    【Android Framework系列】第13章 SVG矢量圖形自定義組件(繪制中國地圖)

    本章節(jié)我們來了解下什么是 SVG 矢量圖形,怎么通過 SVG 實(shí)現(xiàn)圖形的繪制,通過 SVG 實(shí)現(xiàn)不規(guī)則的自定義控件,項(xiàng)目實(shí)現(xiàn)一個(gè)中國地圖,實(shí)現(xiàn)每個(gè)省都能夠點(diǎn)擊,項(xiàng)目地址在文末請(qǐng)自取。 SVG 指可伸縮矢量圖形 (Scalable Vector Graphics) SVG 用來定義用于網(wǎng)絡(luò)的基于矢量的圖形 SVG 使用

    2024年02月10日
    瀏覽(25)
  • 2、電源管理入門之開機(jī)詳解

    2、電源管理入門之開機(jī)詳解

    目錄 1.?硬件上電 2. ATF運(yùn)行 3. Linux啟動(dòng) 3.1 內(nèi)核啟動(dòng)start_kernel 3.2?平臺(tái)啟動(dòng)setup_arch 3.4 DTS初始化psci_dt_init 3.5?系統(tǒng)rest創(chuàng)建kernel_init線程 3.6 SMP初始化smp_init 3.7 PSCI接口psci_cpu_on 3.8 SMC返回secondary_entry ? ?? 系統(tǒng)開機(jī) 牽扯到:“ 我是誰,我從哪里來,要到哪里去 ”的問題。在冰冷

    2024年02月21日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包