作者:宋金山
1.耗电统计服务简介:
1.1.统计耗电量分两个方面:
1.1.1软件耗电统计:统计每个应用或者软件的耗电情况,包括不限于下面几项:cpu的耗电、持锁运行带来的耗电、移动无线的耗电 、wifi耗电 、gps耗电、传感器的耗电 、相机耗电、 闪光灯耗电等。
1.1.2硬件耗电统计:软件耗电之外的耗电都归属到硬件耗电,包括不限于如下几项:用户功耗 、通话功耗、屏幕功耗 、Wifi功耗 、蓝牙消耗等等
1.2.耗电统计基本流程:
1.2.1.耗电统计服务启动时注册监听回调,当软件或硬件状态发生变化时更新耗电量,如手电筒开关,wifi搜索等。
1.2.2.耗电服务启动后 解析"/system/etc/profile/power_average.json"文件内容,将一些耗电行为平均值保存起来,如蓝牙扫描的电流为5ma,为以后的电量计算提供基本的数据
1.2.3. 耗电量服务在收到关机通知时将本次记录的信息保存在 /data/system/battery_stats.json
1.2.4. 再次开机启动耗电量服务后load “/data/system/battery_stats.json “值进行初始化耗电量数据
1.2.5. 依赖监听函数,更新耗电量,提供数据给上层应用
本文重点分析耗电统计服务功能,包括NAPI接口、耗电统计服务重要类接口的实现。
1.3.耗电服务子系统架构图

2. 源代码目录结构

3. 整体流程代码
3.1.NAPI接口
本文以GetAppStatsPercent() 和GetAppStatsMah()接口为例子,分析调用过程
static napi_value BatteryStatsInit(napi_env env, napi_value exports)
{
STATS_HILOGD(STATS_MODULE_JS_NAPI, "Enter");
napi_property_descriptor desc[] = {
DECLARE_NAPI_FUNCTION("getBatteryStats", GetBatteryStats),
DECLARE_NAPI_FUNCTION("getAppPowerValue", GetAppStatsMah),
DECLARE_NAPI_FUNCTION("getAppPowerPercent", GetAppStatsPercent),
DECLARE_NAPI_FUNCTION("getHardwareUnitPowerValue", GetPartStatsMah),
DECLARE_NAPI_FUNCTION("getHardwareUnitPowerPercent", GetPartStatsPercent),
};
NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
CreateEnumStatsType(env, exports);
STATS_HILOGD(STATS_MODULE_JS_NAPI, "Exit");
return exports;
}
EXTERN_C_END
static napi_value GetAppStatsMah(napi_env env, napi_callback_info info)
{
STATS_HILOGD(STATS_MODULE_JS_NAPI, "Enter");
size_t argc = 1;
napi_value argv[1];
napi_value thisVar;
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
napi_valuetype type1;
napi_typeof(env, argv[0], &type1);
NAPI_ASSERT(env, type1 == napi_number, "Wrong argument type. napi_number expected.");
int32_t uid;
napi_get_value_int32(env, argv[0], &uid);
double appStatsMah = BatteryStatsClient::GetInstance().GetAppStatsMah(uid);
napi_value result;
napi_create_double(env, appStatsMah, &result);
STATS_HILOGD(STATS_MODULE_JS_NAPI, "Got stats mah: %{public}lf for uid: %{public}d", appStatsMah, uid);
return result;
}
static napi_value GetAppStatsPercent(napi_env env, napi_callback_info info)
{
STATS_HILOGD(STATS_MODULE_JS_NAPI, "Enter");
size_t argc = 1;
napi_value argv[1];
napi_value thisVar;
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
NAPI_ASSERT(env, argc == 1, "Wrong number of arguments");
napi_valuetype type1;
napi_typeof(env, argv[0], &type1);
NAPI_ASSERT(env, type1 == napi_number, "Wrong argument type. napi_number expected.");
int32_t uid;
napi_get_value_int32(env, argv[0], &uid);
double appStatsPercent = BatteryStatsClient::GetInstance().GetAppStatsPercent(uid);
napi_value result;
napi_create_double(env, appStatsPercent, &result);
STATS_HILOGD(STATS_MODULE_JS_NAPI, "Got stats percent: %{public}lf for uid: %{public}d", appStatsPercent, uid);
return result;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
3.2.BatteryStatsClient接口实现
整体调用架构比较统一,在client里调用proxy接口
3.3.BatteryStatsProxy 接口实现
BatteryStatsProxy通过SendRequest发送消息到BatteryStatsStub
3.4.BatteryStatsStub 接口实现
BatteryStatsStub 直接调用BatteryStatsService的函数实现
3.5.BatteryStatsService接口实现
3.6.BatteryStatsCore 接口实现
3.6.1 ComputePower()函数分别调用不同的Entity 计算耗电量,以phoneEntity_为例计算耗电量的过程为如下:
3.6.1.1. 在1.2.2中提到电话的平均电流保存在 /system/etc/profile/power_average.json中,值为 “radio_active”: 50,
3.6.1.2. phoneEntity的Calculate()函数先得到Call时的电流为 50ma
3.6.1.3. phone activie的时间乘以电流值就计算出打电话时的耗电量
3.6.1.4. 计算出的耗电量保存到totalPowerMah_ 全局变量中
3.6.1.5. 按照phone类型存储到 全局变量statsInfoList_,提供给get接口使用
总结
本文主要和大家分享了OpenHarmony电源管理子系统中关于耗电量服务的实现细节,包括NAPI接口、部分重要类的接口的实现等,做了较为详细的代码说明,希望通过本文您能初步掌握电源管理子系统中耗电量服务模块的关键功能和核心流程。关于OpenHarmony其它子系统的分析,请关注后续文章。
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
没想到关于电量有这么多的知识。