美文网首页
Android CarService关于电源管理的部分

Android CarService关于电源管理的部分

作者: 棒棒0_0 | 来源:发表于2020-04-10 16:44 被阅读0次

    在android P的CarService中关于电源管理的流程如下:
    1.VehicleService有数据变化时,会触发HalClient中的VehicleCallback的onPropertyEvent

            @Override
            public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
                mHandler.sendMessage(Message.obtain(
                        mHandler, CallbackHandler.MSG_ON_PROPERTY_EVENT, propValues));
            }
    

    2.在HalClient的CallbackHandler中处理MSG_ON_PROPERTY_EVENT,这里的mCallback指的是VehicleHal

    @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
    
                try {
                    switch (msg.what) {
                        case MSG_ON_PROPERTY_EVENT:
                            mCallback.onPropertyEvent((ArrayList<VehiclePropValue>) msg.obj);
                            break;
                        case MSG_ON_PROPERTY_SET:
                            mCallback.onPropertySet((VehiclePropValue) msg.obj);
                            break;
                        case MSG_ON_SET_ERROR:
                            PropertySetError obj = (PropertySetError) msg.obj;
                            mCallback.onPropertySetError(obj.errorCode, obj.propId, obj.areaId);
                            break;
                        default:
                            Log.e(CarLog.TAG_HAL, "Unexpected message: " + msg.what);
                    }
                } catch (RemoteException e) {
                    Log.e(CarLog.TAG_HAL, "Message failed: " + msg.what);
                }
            }
    

    3.VehicleHal中的onPropertyEvent被触发

       @Override
        public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
            synchronized (this) {
                for (VehiclePropValue v : propValues) {
                    HalServiceBase service = mPropertyHandlers.get(v.prop);
                    if(service == null) {
                        Log.e(CarLog.TAG_HAL, "HalService not found for prop: 0x"
                            + toHexString(v.prop));
                        continue;
                    }
                    service.getDispatchList().add(v);
                    mServicesToDispatch.add(service);
                    VehiclePropertyEventInfo info = mEventLog.get(v.prop);
                    if (info == null) {
                        info = new VehiclePropertyEventInfo(v);
                        mEventLog.put(v.prop, info);
                    } else {
                        info.addNewEvent(v);
                    }
                }
            }
            for (HalServiceBase s : mServicesToDispatch) {
                s.handleHalEvents(s.getDispatchList());
                s.getDispatchList().clear();
            }
            mServicesToDispatch.clear();
        }
    

    4.根据不同Value的prop属性查找那些service监听改属性的变化,然后触发不同service的handleHalEvents,比如在PowerHalService中

        @Override
        public void handleHalEvents(List<VehiclePropValue> values) {
            PowerEventListener listener;
            synchronized (this) {
                if (mListener == null) {
                    if (mQueuedEvents == null) {
                        mQueuedEvents = new LinkedList<>();
                    }
                    mQueuedEvents.addAll(values);
                    return;
                }
                listener = mListener;
            }
            dispatchEvents(values, listener);
        }
    

    5.在handleHalEvents中调用dispatchEvents进行事件的分发

        private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {
            for (VehiclePropValue v : values) {
                switch (v.prop) {
                    case AP_POWER_BOOTUP_REASON:
                        int reason = v.value.int32Values.get(0);
                        Log.i(CarLog.TAG_POWER, "Received AP_POWER_BOOTUP_REASON=" + reason);
                        listener.onBootReasonReceived(reason);
                        break;
                    case AP_POWER_STATE_REQ:
                        int state = v.value.int32Values.get(VehicleApPowerStateReqIndex.STATE);
                        int param = v.value.int32Values.get(VehicleApPowerStateReqIndex.ADDITIONAL);
                        Log.i(CarLog.TAG_POWER, "Received AP_POWER_STATE_REQ=" + state
                                + " param=" + param);
                        listener.onApPowerStateChange(new PowerState(state, param));
                        break;
                    case DISPLAY_BRIGHTNESS:
                    {
                        int maxBrightness;
                        synchronized (this) {
                            maxBrightness = mMaxDisplayBrightness;
                        }
                        int brightness = v.value.int32Values.get(0) * MAX_BRIGHTNESS / maxBrightness;
                        if (brightness < 0) {
                            Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to 0");
                            brightness = 0;
                        } else if (brightness > MAX_BRIGHTNESS) {
                            Log.e(CarLog.TAG_POWER, "invalid brightness: " + brightness + ", set to "
                                    + MAX_BRIGHTNESS);
                            brightness = MAX_BRIGHTNESS;
                        }
                        Log.i(CarLog.TAG_POWER, "Received DISPLAY_BRIGHTNESS=" + brightness);
                        listener.onDisplayBrightnessChange(brightness);
                    }
                        break;
                }
            }
        }
    

    6.比如我们关注电源状态的变化,则CarPowerManagementService中onApPowerStateChange被触发

        @Override
        public void onApPowerStateChange(PowerState state) {
            PowerHandler handler;
            synchronized (this) {
                mPendingPowerStates.addFirst(state);
                handler = mHandler;
            }
            handler.handlePowerStateChange();
        }
    

    7.在onApPowerStateChange中把数据插入到mPendingPowerStates,然后调用PowerHandler的handlePowerStateChange

        private void handlePowerStateChange() {
            Message msg = obtainMessage(MSG_POWER_STATE_CHANGE);
            sendMessage(msg);
        }
    

    8.通过sendMessage把消息插入的Looper的MessageQueue里面,然后触发PowerHandler的handleMessage

            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_POWER_STATE_CHANGE:
                        doHandlePowerStateChange();
                        break;
                    case MSG_DISPLAY_BRIGHTNESS_CHANGE:
                        doHandleDisplayBrightnessChange(msg.arg1);
                        break;
                    case MSG_MAIN_DISPLAY_STATE_CHANGE:
                        doHandleMainDisplayStateChange((Boolean) msg.obj);
                        break;
                    case MSG_PROCESSING_COMPLETE:
                        doHandleProcessingComplete(msg.arg1 == 1);
                        break;
                    case MSG_NOTIFY_POWER_ON:
                        doHandleNotifyPowerOn();
                        break;
                }
            }
    

    9.在handleMessage中触发doHandlePowerStateChange

        private void doHandlePowerStateChange() {
            PowerState state = null;
            PowerHandler handler;
            synchronized (this) {
                state = mPendingPowerStates.peekFirst();
                mPendingPowerStates.clear();
                if (state == null) {
                    return;
                }
                if (!needPowerStateChange(state)) {
                    return;
                }
                // now real power change happens. Whatever was queued before should be all cancelled.
                releaseTimerLocked();
                handler = mHandler;
            }
            handler.cancelProcessingComplete();
    
            Log.i(CarLog.TAG_POWER, "Power state change:" + state);
            switch (state.mState) {
                case PowerHalService.STATE_ON_DISP_OFF:
                    handleDisplayOff(state);
                    notifyPowerOn(false);
                    break;
                case PowerHalService.STATE_ON_FULL:
                    handleFullOn(state);
                    notifyPowerOn(true);
                    break;
                case PowerHalService.STATE_SHUTDOWN_PREPARE:
                    handleShutdownPrepare(state);
                    break;
            }
        }
    

    10.根据不同的电源状态,进行不同的处理,比如display off时,首先handleDisplayOff(state);保存当前电源状态信息,然后mSystemInterface.setDisplayState(false);这里mSystemInterface是com.android.car.systeminterface.SystemInterface。

        @Override
        public void setDisplayState(boolean on) {
            mDisplayInterface.setDisplayState(on);
        }
    

    此处的mDisplayInterface是com.android.car.systeminterface.DisplayInterface

            @Override
            public void setDisplayState(boolean on) {
                synchronized (this) {
                    mDisplayStateSet = on;
                }
                if (on) {
                    mWakeLockInterface.switchToFullWakeLock();
                    Log.i(CarLog.TAG_POWER, "on display");
                    mPowerManager.wakeUp(SystemClock.uptimeMillis());
                } else {
                    mWakeLockInterface.switchToPartialWakeLock();
                    Log.i(CarLog.TAG_POWER, "off display");
                    mPowerManager.goToSleep(SystemClock.uptimeMillis());
                }
            }
    

    在此处调用原生的PowerService设置为wakeUp或者goToSleep

    相关文章

      网友评论

          本文标题:Android CarService关于电源管理的部分

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