Android设备 显示充电速度流程
整体逻辑:设备充电速度的判断
系统通过读取充电器的最大电流(Current)与最大电压(Voltage),计算最大充电功率(Wattage),以此判断当前是慢充、普通充还是快充:
-
如果
maxChargingWattage <= 0
:返回CHARGING_UNKNOWN
,说明未插电或读取失败; -
如果
maxChargingWattage < slowThreshold
:返回CHARGING_SLOWLY
; -
如果
maxChargingWattage > fastThreshold
:返回CHARGING_FAST
; -
否则:返回
CHARGING_REGULAR
。
1. Framework 层判断逻辑
public final int getChargingSpeed(Context context) {final int slowThreshold = context.getResources().getInteger(R.integer.config_chargingSlowlyThreshold);final int fastThreshold = context.getResources().getInteger(getFastChargingThresholdResId());return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :maxChargingWattage > fastThreshold ? CHARGING_FAST :CHARGING_REGULAR;
}
-
根据从 HAL 层传来的
maxChargingWattage
判断充电速度; -
阈值由资源文件
config.xml
提供(如下所示):
<!-- config.xml -->
<integer name="config_chargingSlowlyThreshold">3000000</integer> <!-- 3W -->
<integer name="config_chargingFastThreshold">12000000</integer> <!-- 12W -->
<integer name="config_chargingFastThreshold_v2">21000000</integer> <!-- 21W (用于新设备) -->
2. 最大充电功率的计算逻辑
frameworks/base/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java
从 Intent 提取电流电压并计算功率
private static int calculateMaxChargingMicroWatt(Intent batteryChangedIntent) {final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT, -1);int maxChargingMicroVolt = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);return calculateMaxChargingMicroWatt(maxChargingMicroAmp, maxChargingMicroVolt);
}
-
作用: 从
batteryChangedIntent
(电池广播 Intent)中读取两个字段:-
EXTRA_MAX_CHARGING_CURRENT
:最大充电电流,单位为 微安(µA) -
EXTRA_MAX_CHARGING_VOLTAGE
:最大充电电压,单位为 微伏(µV)
-
-
若读取失败(无此字段),会返回默认值
-1
。 -
然后调用重载的
calculateMaxChargingMicroWatt(int, int)
方法进行功率计算。
根据电流电压计算功率
private static int calculateMaxChargingMicroWatt(int maxChargingMicroAmp, int maxChargingMicroVolt) {if (maxChargingMicroVolt <= 0) {maxChargingMicroVolt = DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT;}if (maxChargingMicroAmp > 0) {return (int) Math.round(maxChargingMicroAmp * 0.001 * maxChargingMicroVolt * 0.001); // 转换为 mA * mV = µW} else {return -1;}
}
-
电压校验:
if (maxChargingMicroVolt <= 0)
-
若未获取到有效电压(为0或负数),使用默认值
DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT
(通常为 5000000,即 5V)。
-
-
功率计算:
return (int) Math.round(maxChargingMicroAmp * 0.001 * maxChargingMicroVolt * 0.001);
-
先将 µA 和 µV 转换成 mA 和 mV:
-
maxChargingMicroAmp * 0.001
:µA ➝ mA -
maxChargingMicroVolt * 0.001
:µV ➝ mV
-
-
计算公式:
PuW=ImA×VmVP_{uW} = I_{mA} \times V_{mV}PuW=ImA×VmV单位为微瓦(µW)
-
-
返回无效值:
-
若电流无效(
≤ 0
),则返回-1
,表示无法计算有效功率。
-
3. 数据来源:HAL 层读取电流/电压
void BatteryMonitor::updateValues(void) {...for (每个充电器 charger) {读取 charger 的 current_max 节点 -> ChargingCurrent读取 charger 的 voltage_max 节点 -> ChargingVoltagedouble power = (ChargingCurrent / 1_000_000.0) * (ChargingVoltage / 1_000_000.0);如果 power 比之前最大值大:保存该电流电压到 mHealthInfo}
}
-
HAL 遍历
/sys/class/power_supply/
下的所有充电器节点; -
从每个 charger 的
current_max
和voltage_max
读取最大支持值; -
计算每个充电器功率并取最大值填入
mHealthInfo
; -
mHealthInfo.maxChargingCurrentMicroamps
和maxChargingVoltageMicrovolts
将最终传给 Framework 层。
4. Kernel 层提供节点值
#define NORMAL_CHARGING_CURR_UA 500000 // 普通 USB:500mA
#define FAST_CHARGING_CURR_UA 1500000 // 快充口:1.5Astatic int mt6375_chg_get_property(...) {switch (psp) {case POWER_SUPPLY_PROP_CURRENT_MAX:if (type == USB) val->intval = NORMAL_CHARGING_CURR_UA;else if (type == USB_DCP) val->intval = FAST_CHARGING_CURR_UA;break;case POWER_SUPPLY_PROP_VOLTAGE_MAX:val->intval = vbus_global; // 动态返回当前 vbus 电压break;}
}
-
Kernel 驱动根据充电口类型(如 USB、USB_DCP)返回对应最大电流;
-
电压通过变量
vbus_global
实时获取; -
这些值最终通过 power_supply 框架上传给 HAL 层读取。
流程总结
[Kernel] 驱动读取 current_max & voltage_max 节点
↓
[HAL] BatteryMonitor 计算最大功率并存入 mHealthInfo
↓
[Framework] BatteryStatus 读取 Intent 中传来的最大 µA/µV,换算为 µW
↓
getChargingSpeed() 对比 config 阈值,判断是快充/慢充/普通