在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
网友评论