从 Android P 开始,Google 开始推荐厂家再定制一个 health 。前不久遇到一个定制 health 中的信息未成功反应到 Framework 的问题,在分析解决问题的过程中,学习到了一点新知识,所以就在这篇文章里根据解决问题的流程做一个小小的记录。

问题:定制 health service 中的一些 health 信息未成功反应到 Framework。

已知:定制 health 和 Google healthd 进程都运行于设备中,定制 health 主要重写 healthd_board_battery_update 函数,会通过库文件引用原生代码(system/core/healthd/)中的实现。

初步方案

简单介绍

服务创建时都编写了一个 x.rc 文件,用来描述 health service 的一些特点,其中就包括其启动时机。如下:

# system/core/healthd/android.hardware.health@2.0-service.rc

/* sevice 类型的 setction 表示一个可执行程序(进程) */

service health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service or healthd.rc

class hal

user system

group system

file /dev/kmsg w

启动顺序: hal-> core-> main -> later

尝试性修改 health service 启动时机

因为对 Framework 层的处理不熟悉,就根据经验判断定制 health 与 Google healthd 可能有时序冲突,对定制 health 做延迟启动处理,如下:

# device//health/xxx.rc

- class hal

+ class main

经过测试,此方案可行,但是这种说不出 root cause 的解决方案难以让人接受,所以也就拉通代码继续研究。

最终方案

原理分析

Framework 层

首先最大疑问就是 FW 层怎么判断使用哪一个 health 的内容。因 health 信息最终会更新到 BatteryService.java, 尝试在此文件中寻找答案,最终找到如下关键代码:

# frameworks/base/services/core/java/com/android/server/BatteryService.java

static final class HealthServiceWrapper {

private static final String TAG = "HealthServiceWrapper";

public static final String INSTANCE_HEALTHD = "backup";

public static final String INSTANCE_VENDOR = "default";

// All interesting instances, sorted by priority high -> low.

private static final List sAllInstances =

Arrays.asList(INSTANCE_VENDOR, INSTANCE_HEALTHD);

...

}

通过这段代码知道系统是根据 service 的实例名来决定使用哪一个 health。

service 的实例名

定制 health

通过查看如下代码得知定制 health 的实例名为 “default”。

# device/vendor/health/HealthService.cpp

/*通过库和如下函数引入 Google healthd 部分*/

int main(void) {

return health_service_main();

}

# hardware/interfaces/health/2.0/utils/libhealthservice/HealthServiceCommon.cpp

int health_service_main(const char* instance) {

gInstanceName = instance;

if (gInstanceName.empty()) {

gInstanceName = "default"; // 空白时实例名

}

healthd_mode_ops = &healthd_mode_service_2_0_ops;

LOG(INFO) << LOG_TAG << gInstanceName << ": Hal starting main loop...";

return healthd_main();

}

Google healthd

通过查看如下代码得知 healthd 的实例名与定制 health 相同,所以在 Framework 层面,后加载的 service 生效。

# system/core/healthd/HealthServiceDefault.cpp

/* 此 service 实例名为 “default”*/

int main(void) {

return health_service_main();

}

# system/core/healthd/HealthServiceHealthd.cpp

/* 实例名为 “backup”*/

int main() {

return health_service_main("backup");

}

# system/core/healthd/Android.bp

/* HealthServiceDefault 重写了 HealthServiceHealthd,所以 healthd 使用的实例名为“default”*/

cc_binary {

name: "android.hardware.health@2.0-service.override",

defaults: ["android.hardware.health@2.0-service_defaults"],

overrides: [

"healthd",

],

}

解决方案

因为我们需要使用定制的 health,所以将原生的实例名改为“backup”,这样这个问题就得以解决了。

花絮

我也尝试给定制 health 新建一个实例名,但是未成功,后发现似乎新添实例名需要按如下方式配置一下。但因为时间和研究的动力不足就没有继续了。

xxx.xxx

1.0

xxx

default

backup # 似乎可以这样添加实例名

hidl 原理分析_一个 health service 不生效问题引出的一点知识相关推荐

  1. hidl 原理分析_AIDL原理分析

    季春初始,天气返暖,新冠渐去,正值学习好时机.在Android系统中,AIDL一直在Framework和应用层上扮演着很重要的角色,今日且将其原理简单分析.(文2020.03.30) 一.开篇介绍 1 ...

  2. 原理分析_变色近视眼镜原理分析

    随着眼镜的发展,眼镜的外型变得越来越好看,并且眼镜的颜色也变得多姿多彩,让佩戴眼镜的你变得越来越时尚.变色近视眼镜就是由此产生的新型眼镜.变色镜可以随着阳光的强弱变换不同的色彩. 变色眼镜的原理分析 ...

  3. 蓝屏含义原理分析处理方法代码电脑计算机故障系统安全 - 蓝屏知识大全

    目录 1含义2原理分析3处理方法4代码含义和解决-5原因分析6预防电脑蓝屏的-   含义 引蓝屏解释 1.故障检查信息 ***STOP 0x0000001E(0xC0000005,0xFDE38AF9 ...

  4. hidl 原理分析_HIDL模型分析

    一 HIDL的结构体关系 以 Light的HIDL为例,class之间的关系如下 HIDL_0525.png 二 client端 if ((sLight == nullptr && ! ...

  5. 原理分析_生化分析仪原理结构及参数对比

    生化分析仪又叫生化仪,是由电脑控制,将生化分析中的取样.加试剂.混匀.保温反应.检测.结果计算.可靠性判断.显示和打印.以及清洗等步骤组合在一起自动进行操作的分析仪器. 一.生化分析仪的工作原理 生化 ...

  6. java虚拟机线程调优与底层原理分析_啃碎并发(七):深入分析Synchronized原理...

    原标题:啃碎并发(七):深入分析Synchronized原理 前言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇 ...

  7. binder机制原理分析(一):ServiceManager 进程启动

    binder机制原理分析一共分5个部分,其实省了一点,但是分析到后面都差不多了,以后再补充吧. 1.ServiceManager 进程启动 2.普通Service注册到ServiceManager 3 ...

  8. 普通下载url与迅雷快车旋风下载地址转换原理分析

    例如华军winrar 3.71的下载地址是普通下载url与迅雷快车旋风下载地址转换原理分析_千里疯狂 http://p2s.newhua.com/down/wrar371sc.exe 1.普通地址转换 ...

  9. android 实例源码解释,Android Handler 原理分析及实例代码

    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...

最新文章

  1. 在Ubuntu服务器上使用python3+selenium模块
  2. 用Python turtle库绘制蟒蛇
  3. 操作系统学习笔记-05-中断和异常
  4. 组策略 之 恢复默认组策略对象命令
  5. Asp.net页面生命周期详解任我行(3)-服务器处理请求详细过程
  6. VMware Pro16 安装MacOS 11/12教程
  7. C#|图像快速傅立叶变换与反变换
  8. JavaScript设计模式----装饰者模式
  9. 最新上架 App Store 全流程
  10. 什么是计算机网络体系结构?
  11. php随机给文字拼音,给文字加上拼音_php
  12. 极限脱出 量子计算机,《极限脱出3:零时困境》难点解密攻略 剧情通关密码一览...
  13. iOS客户端monkey测试
  14. Python 注册表作业制作
  15. 一切发生的事,都是好事(19年总结)
  16. python语言可以处理数据文件吗_Python语言读取Marc后处理文件基础知识.pdf
  17. 自学玩编程需要具备哪些能力
  18. 网络文件夹目前是以其他用户名和密码进行映射的——映射盘更换登录用户名问题
  19. 霍尼韦尔门禁说明书_霍尼韦尔智能家居 门禁密码锁怎么改密码
  20. 【Web】html+js 制作小游戏

热门文章

  1. git解除与远程分支的关联
  2. 【Python】如何判断一个字符串为空
  3. java上传rar文件_java实现上传zip/rar压缩文件,自动解压
  4. java ejb jsp 架构_JavaEE架构
  5. [django]django模型中auto_now和auto_now_add
  6. Downloader Middlewares反反爬虫【学习笔记04】
  7. 当前系统时间与服务器时间,操作系统时间和服务器时间
  8. 能设值多个rowkey吗_顶楼送了露台,悄悄搭建阳光房,偏偏我家露台多个帽子,能拆吗?...
  9. php处理form多文件上传,ajax利用FormData、FileReader实现多文件上传php获取
  10. 动态规划之91 decode ways