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:
parent
bf31aab2c8
commit
1fd36183bf
2 changed files with 15 additions and 35 deletions
|
@ -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\"
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in a new issue