charger: uses health HAL service.

hwservicemanager starts in charger, so directly get the health HAL
service.

Also sets up Android base kernel logging.

Bug: 142674987

Test: turn off device and charge, health HAL starts before charger, and inspect logs
      to confirm charger is reading from health HAL
Test: make health HAL start after charger, and inspect logs to confirm
      charger is reading from health HAL.

Change-Id: I5ba50a4b931735d1d14a50940e37c1e407dda34d
This commit is contained in:
Yifan Hong 2020-01-31 13:02:07 -08:00
parent 5562b076b7
commit 3aa3b3c627
5 changed files with 21 additions and 38 deletions

View file

@ -14,6 +14,8 @@
* limitations under the License.
*/
#include <android-base/logging.h>
#include "charger.sysprop.h"
#include "healthd_mode_charger.h"
#include "healthd_mode_charger_nops.h"
@ -23,6 +25,7 @@
#endif
int main(int argc, char** argv) {
android::base::InitLogging(argv, &android::base::KernelLogger);
if (CHARGER_FORCE_NO_UI || android::sysprop::ChargerProperties::no_ui().value_or(false)) {
return healthd_charger_nops(argc, argv);
} else {

View file

@ -17,50 +17,28 @@
#include "charger_utils.h"
#include <android-base/logging.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <android/hardware/health/2.1/IHealth.h>
#include <health/utils.h>
#include <health2impl/Health.h>
#include <hidl/ServiceManagement.h>
using android::hardware::getPassthroughServiceManager;
using android::hidl::base::V1_0::IBase;
using android::hidl::manager::V1_0::IServiceManager;
namespace android {
namespace hardware {
namespace health {
sp<V2_1::IHealth> GetPassthroughHealthImpl() {
// Not using getService() because there is no hwservicemanager in charger mode.
sp<IServiceManager> pm = getPassthroughServiceManager();
if (pm == nullptr) {
LOG(WARNING) << "Cannot get passthrough service manager.";
return nullptr;
}
sp<IBase> base = pm->get(V2_0::IHealth::descriptor, "default");
if (base == nullptr) {
LOG(WARNING) << "Cannot find passthrough implementation of health 2.0 HAL for instance "
"'default' on the device.";
return nullptr;
}
sp<V2_1::IHealth> service = V2_1::IHealth::castFrom(base);
if (service == nullptr) {
LOG(WARNING)
<< "Cannot cast passthrough implementation of health 2.0 HAL to 2.1 for instance "
"'default' on the device.";
return nullptr;
}
return service;
}
sp<V2_1::IHealth> GetPassthroughHealth() {
auto impl = GetPassthroughHealthImpl();
if (impl == nullptr) {
sp<V2_1::IHealth> GetHealthServiceOrDefault() {
// No need to use get_health_service from libhealthhalutils that
// checks for "backup" instance provided by healthd, since
// V2_1::implementation::Health does the same thing.
sp<V2_1::IHealth> service = V2_1::IHealth::getService();
if (service != nullptr) {
LOG(INFO) << "Charger uses health HAL service.";
} else {
LOG(WARNING) << "Charger uses system defaults.";
auto config = std::make_unique<healthd_config>();
InitHealthdConfig(config.get());
impl = new V2_1::implementation::Health(std::move(config));
service = new V2_1::implementation::Health(std::move(config));
}
return impl;
return service;
}
} // namespace health

View file

@ -21,7 +21,9 @@
namespace android {
namespace hardware {
namespace health {
sp<V2_1::IHealth> GetPassthroughHealth();
// Return health HAL service. If it is not supported on the device (with
// VINTF checks), return a default passthrough implementation.
sp<V2_1::IHealth> GetHealthServiceOrDefault();
} // namespace health
} // namespace hardware
} // namespace android

View file

@ -60,7 +60,7 @@
using namespace android;
using android::hardware::Return;
using android::hardware::health::GetPassthroughHealth;
using android::hardware::health::GetHealthServiceOrDefault;
using android::hardware::health::HealthLoop;
using android::hardware::health::V1_0::BatteryStatus;
using android::hardware::health::V2_0::Result;
@ -742,6 +742,6 @@ int healthd_charger_main(int argc, char** argv) {
}
}
Charger charger(GetPassthroughHealth());
Charger charger(GetHealthServiceOrDefault());
return charger.StartLoop();
}

View file

@ -20,10 +20,10 @@
#include "charger_utils.h"
using android::hardware::health::GetPassthroughHealth;
using android::hardware::health::GetHealthServiceOrDefault;
using android::hardware::health::V2_1::implementation::HalHealthLoop;
int healthd_charger_nops(int /* argc */, char** /* argv */) {
HalHealthLoop charger("charger", GetPassthroughHealth());
HalHealthLoop charger("charger", GetHealthServiceOrDefault());
return charger.StartLoop();
}