libhardware: sensors: update multi hal to support 64bit builds

To get multi hal working on both 32 & 64 bit targets,
removing hardcoded paths & checks in multi HAL.

Sensor HAL libs must be installed path that is available through
LD_LIBRARY_PATH.
/system/lib & /system/vendor/lib for 32-bit targets.
/system/lib64 & /system/vendor/lib64 for 64-bit targets.

Change-Id: Ib1c1f25f08855c4584d53cc04fbe82a3a768b180
This commit is contained in:
Satya Durga Srinivasu Prabhala 2015-01-20 18:53:35 -08:00
parent bf31aab2c8
commit 1fd36183bf
2 changed files with 15 additions and 35 deletions

View file

@ -20,9 +20,9 @@ ifeq ($(USE_SENSOR_MULTI_HAL),true)
include $(CLEAR_VARS)
LOCAL_MODULE := sensors.$(TARGET_DEVICE)
LOCAL_MODULE := sensors.$(TARGET_BOARD_PLATFORM)
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_CFLAGS := -DLOG_TAG=\"MultiHal\"

View file

@ -27,6 +27,8 @@
#include <cutils/log.h>
#include <vector>
#include <string>
#include <fstream>
#include <map>
#include <string>
@ -36,8 +38,6 @@
static const char* CONFIG_FILENAME = "/system/etc/sensors/hals.conf";
static const char* LEGAL_SUBHAL_PATH_PREFIX = "/system/lib/hw/";
static const char* LEGAL_SUBHAL_ALTERNATE_PATH_PREFIX = "/system/vendor/lib/";
static const int MAX_CONF_LINE_LENGTH = 1024;
static pthread_mutex_t init_modules_mutex = PTHREAD_MUTEX_INITIALIZER;
@ -463,39 +463,19 @@ static bool starts_with(const char* s, const char* prefix) {
* Adds valid paths from the config file to the vector passed in.
* The vector must not be null.
*/
static void get_so_paths(std::vector<char*> *so_paths) {
FILE *conf_file = fopen(CONFIG_FILENAME, "r");
if (conf_file == NULL) {
static void get_so_paths(std::vector<std::string> *so_paths) {
std::string line;
std::ifstream conf_file(CONFIG_FILENAME);
if(!conf_file) {
ALOGW("No multihal config file found at %s", CONFIG_FILENAME);
return;
}
ALOGV("Multihal config file found at %s", CONFIG_FILENAME);
char *line = NULL;
size_t len = 0;
int line_count = 0;
while (getline(&line, &len, conf_file) != -1) {
// overwrite trailing eoln with null char
char* pch = strchr(line, '\n');
if (pch != NULL) {
*pch = '\0';
}
ALOGV("config file line #%d: '%s'", ++line_count, line);
char *real_path = realpath(line, NULL);
if (starts_with(real_path, LEGAL_SUBHAL_PATH_PREFIX) ||
starts_with(real_path, LEGAL_SUBHAL_ALTERNATE_PATH_PREFIX)) {
ALOGV("accepting valid path '%s'", real_path);
char* compact_line = new char[strlen(real_path) + 1];
strcpy(compact_line, real_path);
so_paths->push_back(compact_line);
} else {
ALOGW("rejecting path '%s' because it does not start with '%s' or '%s'",
real_path, LEGAL_SUBHAL_PATH_PREFIX, LEGAL_SUBHAL_ALTERNATE_PATH_PREFIX);
}
free(real_path);
while (std::getline(conf_file, line)) {
ALOGV("config file line: '%s'", line.c_str());
so_paths->push_back(line);
}
free(line);
fclose(conf_file);
ALOGV("hals.conf contained %d lines", line_count);
}
/*
@ -508,15 +488,15 @@ static void lazy_init_modules() {
pthread_mutex_unlock(&init_modules_mutex);
return;
}
std::vector<char*> *so_paths = new std::vector<char*>();
std::vector<std::string> *so_paths = new std::vector<std::string>();
get_so_paths(so_paths);
// dlopen the module files and cache their module symbols in sub_hw_modules
sub_hw_modules = new std::vector<hw_module_t *>();
dlerror(); // clear any old errors
const char* sym = HAL_MODULE_INFO_SYM_AS_STR;
for (std::vector<char*>::iterator it = so_paths->begin(); it != so_paths->end(); it++) {
char* path = *it;
for (std::vector<std::string>::iterator it = so_paths->begin(); it != so_paths->end(); it++) {
const char* path = it->c_str();
void* lib_handle = dlopen(path, RTLD_LAZY);
if (lib_handle == NULL) {
ALOGW("dlerror(): %s", dlerror());