Merge changes from topic "health_service_common"

* changes:
  health: add README.
  health: move duplicate HealthServiceCommon
  health: move util modules to utils/
This commit is contained in:
Yifan Hong
2018-01-23 02:55:40 +00:00
committed by Android (Google) Code Review
11 changed files with 270 additions and 0 deletions

99
health/2.0/README Normal file
View File

@@ -0,0 +1,99 @@
Upgrading from health@1.0 HAL
0. Remove android.hardware.health@1.0* from PRDOUCT_PACKAGES
in device/<manufacturer>/<device>/device.mk
1. If the device does not have a vendor-specific libhealthd AND does not
implement storage-related APIs, just add the following to PRODUCT_PACKAGES:
android.hardware.health@2.0-service
Otherwise, continue to Step 2.
2. Create directory
device/<manufacturer>/<device>/health
3. Create device/<manufacturer>/<device>/health/Android.bp
(or equivalent device/<manufacturer>/<device>/health/Android.mk)
cc_binary {
name: "android.hardware.health@2.0-service.<device>",
init_rc: ["android.hardware.health@2.0-service.<device>.rc"],
proprietary: true,
relative_install_path: "hw",
srcs: [
"HealthService.cpp",
],
cflags: [
"-Wall",
"-Werror",
],
static_libs: [
"android.hardware.health@2.0-impl",
"android.hardware.health@1.0-convert",
"libhealthservice",
"libbatterymonitor",
],
shared_libs: [
"libbase",
"libcutils",
"libhidlbase",
"libhidltransport",
"libutils",
"android.hardware.health@2.0",
],
header_libs: ["libhealthd_headers"],
}
4. Create device/<manufacturer>/<device>/health/android.hardware.health@2.0-service.<device>.rc
service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.<device>
class hal
user system
group system
5. Create device/<manufacturer>/<device>/health/HealthService.cpp:
#include <health2/service.h>
int main() { return health_service_main(); }
6. libhealthd dependency:
6.1 If the device has a vendor-specific libhealthd.<soc>, add it to static_libs.
6.2 If the device does not have a vendor-specific libhealthd, add the following
lines to HealthService.cpp:
#include <healthd/healthd.h>
void healthd_board_init(struct healthd_config*) {}
int healthd_board_battery_update(struct android::BatteryProperties*) {
// return 0 to log periodic polled battery status to kernel log
return 0;
}
7. Storage related APIs:
7.1 If the device does not implement IHealth.getDiskStats and
IHealth.getStorageInfo, add libstoragehealthdefault to static_libs.
7.2 If the device implements one of these two APIs, add and implement the
following functions in HealthService.cpp:
void get_storage_info(std::vector<struct StorageInfo>& info) {
// ...
}
void get_disk_stats(std::vector<struct DiskStats>& stats) {
// ...
}
8. Update necessary SELinux permissions. For example,
# 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 Step 6.2 or Step 7.2 is done.

28
health/2.0/utils/README Normal file
View File

@@ -0,0 +1,28 @@
* libhealthhalutils
A convenience library for (hwbinder) clients of health HAL to choose between
the "default" instance (served by vendor service) or "backup" instance (served
by healthd). C++ clients of health HAL should use this library instead of
calling IHealth::getService() directly.
Its Java equivalent can be found in BatteryService.HealthServiceWrapper.
* libhealthservice
Common code for all (hwbinder) services of the health HAL, including healthd and
vendor health service android.hardware.health@2.0-service(.<vendor>). main() in
those binaries calls health_service_main() directly.
* libhealthstoragedefault
Default implementation for storage related APIs for (hwbinder) services of the
health HAL. If an implementation of the health HAL do not wish to provide any
storage info, include this library. Otherwise, it should implement the following
two functions:
void get_storage_info(std::vector<struct StorageInfo>& info) {
// ...
}
void get_disk_stats(std::vector<struct DiskStats>& stats) {
// ...
}

View File

@@ -0,0 +1,29 @@
// Reasonable defaults for android.hardware.health@2.0-service.<device>.
// Vendor service can customize by implementing functions defined in
// libhealthd and libhealthstoragedefault.
cc_library_static {
name: "libhealthservice",
vendor_available: true,
srcs: ["HealthServiceCommon.cpp"],
export_include_dirs: ["include"],
cflags: [
"-Wall",
"-Werror",
],
shared_libs: [
"android.hardware.health@2.0",
],
static_libs: [
"android.hardware.health@2.0-impl",
"android.hardware.health@1.0-convert",
],
export_static_lib_headers: [
"android.hardware.health@1.0-convert",
],
header_libs: ["libhealthd_headers"],
export_header_lib_headers: ["libhealthd_headers"],
}

View File

@@ -0,0 +1,92 @@
/*
* Copyright 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "health@2.0/"
#include <android-base/logging.h>
#include <android/hardware/health/1.0/types.h>
#include <hal_conversion.h>
#include <health2/Health.h>
#include <health2/service.h>
#include <healthd/healthd.h>
#include <hidl/HidlTransportSupport.h>
using android::hardware::IPCThreadState;
using android::hardware::configureRpcThreadpool;
using android::hardware::handleTransportPoll;
using android::hardware::setupTransportPolling;
using android::hardware::health::V2_0::HealthInfo;
using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
using android::hardware::health::V2_0::IHealth;
using android::hardware::health::V2_0::implementation::Health;
extern int healthd_main(void);
static int gBinderFd = -1;
static std::string gInstanceName;
static void binder_event(uint32_t /*epevents*/) {
if (gBinderFd >= 0) handleTransportPoll(gBinderFd);
}
void healthd_mode_service_2_0_init(struct healthd_config* config) {
LOG(INFO) << LOG_TAG << gInstanceName << " Hal is starting up...";
gBinderFd = setupTransportPolling();
if (gBinderFd >= 0) {
if (healthd_register_event(gBinderFd, binder_event))
LOG(ERROR) << LOG_TAG << gInstanceName << ": Register for binder events failed";
}
android::sp<IHealth> service = Health::initInstance(config);
CHECK_EQ(service->registerAsService(gInstanceName), android::OK)
<< LOG_TAG << gInstanceName << ": Failed to register HAL";
LOG(INFO) << LOG_TAG << gInstanceName << ": Hal init done";
}
int healthd_mode_service_2_0_preparetowait(void) {
IPCThreadState::self()->flushCommands();
return -1;
}
void healthd_mode_service_2_0_heartbeat(void) {
// noop
}
void healthd_mode_service_2_0_battery_update(struct android::BatteryProperties* prop) {
HealthInfo info;
convertToHealthInfo(prop, info.legacy);
Health::getImplementation()->notifyListeners(&info);
}
static struct healthd_mode_ops healthd_mode_service_2_0_ops = {
.init = healthd_mode_service_2_0_init,
.preparetowait = healthd_mode_service_2_0_preparetowait,
.heartbeat = healthd_mode_service_2_0_heartbeat,
.battery_update = healthd_mode_service_2_0_battery_update,
};
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();
}

View File

@@ -0,0 +1,22 @@
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
#define ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON
int health_service_main(const char* instance = "");
#endif // ANDROID_HARDWARE_HEALTH_V2_0_SERVICE_COMMON