Merge "libhardware loads a module from APEX" into main am: 6ee9b599f8
Original change: https://android-review.googlesource.com/c/platform/hardware/libhardware/+/2763345 Change-Id: I3f58fc5f8777c71ebd1c5c6fac2e6e664e5d0600 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
commit
51f5a3fe8a
2 changed files with 40 additions and 11 deletions
11
Android.bp
11
Android.bp
|
@ -92,6 +92,7 @@ cc_library_shared {
|
|||
|
||||
srcs: ["hardware.c"],
|
||||
shared_libs: [
|
||||
"libapexsupport",
|
||||
"libcutils",
|
||||
"liblog",
|
||||
"libvndksupport",
|
||||
|
@ -114,10 +115,16 @@ cc_library_shared {
|
|||
},
|
||||
target: {
|
||||
host: {
|
||||
exclude_shared_libs: ["libvndksupport"],
|
||||
exclude_shared_libs: [
|
||||
"libapexsupport",
|
||||
"libvndksupport",
|
||||
],
|
||||
},
|
||||
recovery: {
|
||||
exclude_shared_libs: ["libvndksupport"],
|
||||
exclude_shared_libs: [
|
||||
"libapexsupport",
|
||||
"libvndksupport",
|
||||
],
|
||||
},
|
||||
},
|
||||
min_sdk_version: "29",
|
||||
|
|
40
hardware.c
40
hardware.c
|
@ -34,17 +34,21 @@
|
|||
#include <vndksupport/linker.h>
|
||||
#endif
|
||||
|
||||
#ifdef __ANDROID_APEX__
|
||||
#include <android/apexsupport.h>
|
||||
#endif
|
||||
|
||||
/** Base path of the hal modules */
|
||||
#if defined(__LP64__)
|
||||
#define HAL_LIBRARY_PATH1 "/system/lib64/hw"
|
||||
#define HAL_LIBRARY_PATH2 "/vendor/lib64/hw"
|
||||
#define HAL_LIBRARY_PATH3 "/odm/lib64/hw"
|
||||
#define HAL_LIBRARY_SUBDIR "lib64/hw"
|
||||
#else
|
||||
#define HAL_LIBRARY_PATH1 "/system/lib/hw"
|
||||
#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"
|
||||
#define HAL_LIBRARY_PATH3 "/odm/lib/hw"
|
||||
#define HAL_LIBRARY_SUBDIR "lib/hw"
|
||||
#endif
|
||||
|
||||
#define HAL_LIBRARY_PATH1 "/system/" HAL_LIBRARY_SUBDIR
|
||||
#define HAL_LIBRARY_PATH2 "/vendor/" HAL_LIBRARY_SUBDIR
|
||||
#define HAL_LIBRARY_PATH3 "/odm/" HAL_LIBRARY_SUBDIR
|
||||
|
||||
/**
|
||||
* There are a set of variant filename for modules. The form of the filename
|
||||
* is "<MODULE_ID>.variant.so" so for the led module the Dream variants
|
||||
|
@ -79,7 +83,7 @@ static int load(const char *id,
|
|||
int status = -EINVAL;
|
||||
void *handle = NULL;
|
||||
struct hw_module_t *hmi = NULL;
|
||||
#ifdef __ANDROID_VNDK__
|
||||
#if defined(__ANDROID_VNDK__) || defined(__ANDROID_APEX__)
|
||||
const bool try_system = false;
|
||||
#else
|
||||
const bool try_system = true;
|
||||
|
@ -97,7 +101,7 @@ static int load(const char *id,
|
|||
*/
|
||||
handle = dlopen(path, RTLD_NOW);
|
||||
} else {
|
||||
#if defined(__ANDROID_RECOVERY__) || !defined(__ANDROID__)
|
||||
#if defined(__ANDROID_RECOVERY__) || !defined(__ANDROID__) || defined(__ANDROID_APEX__)
|
||||
handle = dlopen(path, RTLD_NOW);
|
||||
#else
|
||||
handle = android_load_sphal_library(path, RTLD_NOW);
|
||||
|
@ -151,7 +155,7 @@ static int load(const char *id,
|
|||
/*
|
||||
* If path is in in_path.
|
||||
*/
|
||||
static bool path_in_path(const char *path, const char *in_path) {
|
||||
static bool __attribute__ ((unused)) path_in_path(const char *path, const char *in_path) {
|
||||
char real_path[PATH_MAX];
|
||||
if (realpath(path, real_path) == NULL) return false;
|
||||
|
||||
|
@ -174,6 +178,22 @@ static bool path_in_path(const char *path, const char *in_path) {
|
|||
static int hw_module_exists(char *path, size_t path_len, const char *name,
|
||||
const char *subname)
|
||||
{
|
||||
#ifdef __ANDROID_APEX__
|
||||
// When used in APEX, it should look only into the same APEX because
|
||||
// libhardware modules don't provide ABI stability.
|
||||
if (__builtin_available(android AAPEXSUPPORT_API, *)) {
|
||||
AApexInfo *apex_info;
|
||||
if (AApexInfo_create(&apex_info) == AAPEXINFO_OK) {
|
||||
snprintf(path, path_len, "/apex/%s/%s/%s.%s.so",
|
||||
AApexInfo_getName(apex_info), HAL_LIBRARY_SUBDIR, name, subname);
|
||||
AApexInfo_destroy(apex_info);
|
||||
if (access(path, R_OK) == 0)
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
ALOGE("hw_module_exists: libapexsupport is not supported in %d.", __ANDROID_API__);
|
||||
}
|
||||
#else // __ANDROID_APEX__
|
||||
snprintf(path, path_len, "%s/%s.%s.so",
|
||||
HAL_LIBRARY_PATH3, name, subname);
|
||||
if (path_in_path(path, HAL_LIBRARY_PATH3) && access(path, R_OK) == 0)
|
||||
|
@ -191,6 +211,8 @@ static int hw_module_exists(char *path, size_t path_len, const char *name,
|
|||
return 0;
|
||||
#endif
|
||||
|
||||
#endif // __ANDROID_APEX__
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue