美文网首页
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关于电源管理的部分

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

  • 电源 | PowerManagerService框架解析

    一、电源管理框架 PowerManagerServcie是android系统电源管理的核心服务,它在Framewo...

  • 14.6 PowerManager

    简介 电源服务,用于 管理CPU运行,键盘或屏幕亮起来。 PowerManager Android提供的电源管理的...

  • 电源管理芯片有哪些,常用电源管理芯片!

    电源管理半导体本中的主导部分是电源管理IC,电源管理芯片有哪些,常用电源管理芯片大致可归纳为下述8种。 1、AC/...

  • Android电源管理

    原文:https://source.android.com/devices/tech/power/mgmt 电池寿...

  • CarService 中运行逻辑

    CarService 中运行逻辑 在Android O中,Google在原有的Framework架构中引入了And...

  • 关于电源管理

    本文重点介绍Linux下面电源管理的一些基本的以及经常用到的容易混淆的一些概念,作为一个参考,便于进行相关领域学习...

  • 关于电源管理_01电源管理IC

    电源管理IC 如果电源系统设计不合理,则会影响到整个系统的架构、产品的特性组合、元件的选择、软件的设计和功率分配架...

  • Android CarService 源码分析

    第一部分 Android Automative的整体架构 从这幅图中我们可以看出,Android Automati...

  • Android 电源管理分析

    一 简述 手机不同于PC,手机使用的是可移动电源,由于电源的电量有限,因此如何做到既让“马儿跑又要马儿不吃草”,电...

网友评论

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

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