Android Health實現(xiàn)

原文:https://source.android.com/devices/tech/health/implementation

healthd的所有代碼都已重構(gòu)為health@2.0-impllibhealthservice旋恼,然后修改HAL實現(xiàn)為health@2.0棒仍。這兩個庫通過health@2.0-service靜態(tài)鏈接,使其能夠完成之前healthd的工作(如運行healthd_mainloop和執(zhí)行輪詢)。在初始化時谆刨,health@2.0-serviceIHealth的接口實現(xiàn)注冊到hwservicemanager。使用Android 8.x vendor鏡像和Android 9 Framework升級設(shè)備時邑蒋,vendor鏡像可能不提供health@2.0服務(wù)歇竟。這是由棄用計劃強(qiáng)制執(zhí)行的 。

要解決此問題:

  1. healthd注冊IHealthhwservicemanager(盡管是一個系統(tǒng)守護(hù)進(jìn)程)。IHealth添加到系統(tǒng)manifest中纲菌,實例名為“backup”挠日。
  2. Framework和storaged通過hwbinder(而不是binder)與healthd進(jìn)行通信。
  3. Framework代碼和storaged更改為獲取“default”實例(如果可用)翰舌,然后“backup”嚣潜。
    • C++端代碼使用定義在libhealthhalutils中的邏輯。
    • Java端代碼使用定義在HealthServiceWrapper中的邏輯椅贱。
  4. IHealth/default廣泛可用且Android 8.1 vendor鏡像被棄用之后郑原,IHealth/backuphealthd才被棄用。有關(guān)更多詳細(xì)信息夜涕,請參閱棄用health@1.0犯犁。

healthd的特定板構(gòu)建變量

BOARD_PERIODIC_CHORES_INTERVAL_*是用于構(gòu)建 healthd的特定板的變量。作為system/vendor構(gòu)建拆分的一部分女器,無法為系統(tǒng)模塊定義特定板的值 酸役。在health@2.0中,供應(yīng)商可以覆蓋healthd_mode_ops->init中這兩個值(通過刪除依賴于health@2.0-service.<device>libhealthservice 并重新實現(xiàn)此功能)驾胆。

靜態(tài)實現(xiàn)庫

與其他HAL實現(xiàn)庫不同涣澡,health@2.0-impl實現(xiàn)庫是一個靜態(tài)庫,其中包含health@2.0-service, charger, recovery和遺留的healthd鏈接丧诺。

如上所述health@2.0.impl實現(xiàn)IHealth入桂,旨在包裝libbatterymonitorlibhealthd.BOARD。這些health@2.0-impl的用戶不得直接使用BatteryMonitorlibhealthd中的功能 ; 相反驳阎,應(yīng)該由實現(xiàn)IHealth接口的Health類調(diào)用抗愁。為進(jìn)一步概括,healthd_common代碼也包含在health@2.0-impl中呵晚。new 的healthd_common包含health@2.0-service, chargerhealthd之間的其余的公共代碼蜘腌,并且取代BatteryMonitor調(diào)用IHealth方法。

Health2.0服務(wù)實現(xiàn)

為設(shè)備實現(xiàn)health@2.0服務(wù)時饵隙,如果默認(rèn)實現(xiàn)為:

  • 設(shè)備充足撮珠,直接使用android.hardware.health@2.0-service
  • 對于設(shè)備來說還不夠金矛,創(chuàng)建 android.hardware.health@2.0-service.(device)可執(zhí)行文件并包含:
#include <health2/service.h>
int main() { return health_service_main(); }

然后:

  • 如果 libhealthd特定板:
    • 存在芯急,鏈接到它。
    • 不存在驶俊,提供healthd_board_inithealthd_board_battery_update函數(shù)的空實現(xiàn)娶耍。
  • 如果特定板的BOARD_PERIODIC_CHORES_INTERVAL_*變量:
    • 已定義,創(chuàng)建特定設(shè)備HealthServiceCommon.cpp(復(fù)制自hardware/interfaces/health/2.0/utils/libhealthservice)并在healthd_mode_service_2_0_init中客制化废睦。
    • 未定義伺绽,靜態(tài)鏈接到libhealthservice
  • 如果設(shè)備:
    • 需要實現(xiàn)getStorageInfogetDiskStatsAPI,則在get_storage_infoget_disk_stats函數(shù)中提供實現(xiàn)奈应。
    • 不用實現(xiàn)這些API澜掩,則靜態(tài)鏈接到libstoragehealthdefault
  • 更新必要的SELinux權(quán)限杖挣。

有關(guān)詳細(xì)信息肩榕,請參閱 hardware/interfaces/health/2.0/README.md

Health客戶端

health@2.0有以下客戶端:

  • charger惩妇。libbatterymonitor和和healthd_common代碼的用法包含在health@2.0-impl中株汉。

  • recoverylibbatterymonitor的鏈接包含在health@2.0-impl中歌殃。所有BatteryMonitor的調(diào)用都被Health實現(xiàn)類的調(diào)用所取代 乔妈。

  • BatteryManagerBatteryManager.queryProperty(int id)是唯一的一個IBatteryPropertiesRegistrar.getProperty的客戶端氓皱,其由 healthd提供并直接讀/sys/class/power_supply路召。

    出于安全考慮,應(yīng)用不允許直接調(diào)用Health HAL波材。在Android 9中股淡,binder服務(wù) IBatteryPropertiesRegistrar是由BatteryService提供而不是 healthd,并且BatteryService委派通過Health的HAL調(diào)用來檢索所請求的信息廷区。

  • BatteryService唯灵。在Android 9中,BatteryService 通過HealthServiceWrapper來確定要使用的Health服務(wù)實例(來自vender的“default”實例或來自healthd的“backup”實例)隙轻。然后通過IHealth.registerCallback監(jiān)聽取Health事件埠帕。

  • Storaged。在Android 9中大脉,storaged通過 libhealthhalutils來確定要使用的Health服務(wù)實例(來自vender的“default”實例或來自healthd的“backup”實例)搞监。然后通過IHealth.registerCallback來監(jiān)聽Health事件并檢索存儲信息。

SELinux變化

新的health@2.0 HAL中SELinux的改動如下:

  • 添加health@2.0-servicefile_contexts镰矿。
  • 允許system_serverstoraged使用hal_health
  • 允許system_serverBatteryService)注冊 batteryproperties_serviceIBatteryPropertiesRegistrar)俘种。
  • 允許healthd提供hal_health秤标。
  • 移除允許system_server/storaged通過binder調(diào)用healthd的規(guī)則。
  • 移除允許healthd注冊batteryproperties_service(IBatteryPropertiesRegistrar)的規(guī)則宙刘。

對于有自己實現(xiàn)的設(shè)備苍姜,某些供應(yīng)商的SELinux改動可能是有必要的。例如:

# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0

# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.

Kernel接口

healthd守護(hù)進(jìn)程和 android.hardware.health@2.0-service的默認(rèn)實現(xiàn)訪問以下Kernel接口來獲取電池信息:

  • /sys/class/power_supply/*/capacity
  • /sys/class/power_supply/*/charge_counter
  • /sys/class/power_supply/*/charge_full
  • /sys/class/power_supply/*/current_avg
  • /sys/class/power_supply/*/current_max
  • /sys/class/power_supply/*/current_now
  • /sys/class/power_supply/*/cycle_count
  • /sys/class/power_supply/*/health
  • /sys/class/power_supply/*/online
  • /sys/class/power_supply/*/present
  • /sys/class/power_supply/*/status
  • /sys/class/power_supply/*/technology
  • /sys/class/power_supply/*/temp
  • /sys/class/power_supply/*/type
  • /sys/class/power_supply/*/voltage_max
  • /sys/class/power_supply/*/voltage_now

否則任何特定設(shè)備的Health HAL實現(xiàn)都會默認(rèn)使用libbatterymonitor訪問這些內(nèi)核接口悬包,除非在healthd_board_init(struct healthd_config*)中被重寫衙猪。

如果這些文件缺失,或者healthd或默認(rèn)服務(wù)從無法訪問(如:文件是特定供應(yīng)商文件夾的符號鏈接,由于SELinux的策略配置錯誤而拒絕訪問)垫释,它們可能無法正常運行丝格。因此,即使使用默認(rèn)實現(xiàn)棵譬,也可能需要進(jìn)行其他特定供應(yīng)商的SELinux更改显蝌。

測試

Android 9包含專為health@2.0 HAL編寫的新VTS測試。如果設(shè)備聲明在設(shè)備manifest中提供health@2.0 HAL订咸,則必須通過相應(yīng)的VTS測試曼尊。default實例(確保設(shè)備正確實現(xiàn)HAL)和backup實例(確保healthd 在刪除之前繼續(xù)正常運行)兩者都要編寫測試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脏嚷,一起剝皮案震驚了整個濱河市骆撇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌父叙,老刑警劉巖神郊,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異高每,居然都是意外死亡屿岂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鲸匿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爷怀,“玉大人,你說我怎么就攤上這事带欢≡耸冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵乔煞,是天一觀的道長吁朦。 經(jīng)常有香客問我,道長渡贾,這世上最難降的妖魔是什么逗宜? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮空骚,結(jié)果婚禮上纺讲,老公的妹妹穿的比我還像新娘。我一直安慰自己囤屹,他們只是感情好熬甚,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肋坚,像睡著了一般乡括。 火紅的嫁衣襯著肌膚如雪肃廓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天诲泌,我揣著相機(jī)與錄音盲赊,去河邊找鬼。 笑死档礁,一個胖子當(dāng)著我的面吹牛角钩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呻澜,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼递礼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羹幸?” 一聲冷哼從身側(cè)響起脊髓,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栅受,沒想到半個月后将硝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡屏镊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年依疼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片而芥。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡律罢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棍丐,到底是詐尸還是另有隱情误辑,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布歌逢,位于F島的核電站巾钉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秘案。R本人自食惡果不足惜砰苍,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阱高。 院中可真熱鬧师骗,春花似錦、人聲如沸讨惩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荐捻。三九已至黍少,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間处面,已是汗流浹背厂置。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留魂角,地道東北人昵济。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像野揪,于是被迫代替她去往敵國和親访忿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 Android Treble HAL 為了更好的了解Treble 架構(gòu)里面的HAL斯稳,首先了解一下Android...
    做機(jī)人閱讀 23,762評論 4 9
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,696評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理海铆,服務(wù)發(fā)現(xiàn),斷路器挣惰,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 01 俗話說卧斟,大難不死,必有后福憎茂。后福沒見到珍语,但是接下來的一年多,倒是平平靜靜竖幔。相安無事板乙,就是萬福了。 妻子帶著女...
    晚來舟閱讀 1,014評論 20 22
  • “有些東西你注視它越久赏枚,你就會越來越陌生亡驰,這座城市,這條街道饿幅,街道上來來往往的人凡辱,你身邊熟悉的人,你的親人栗恩,甚至是...
    丫是老段閱讀 362評論 0 1