android_system_core/libnativeloader/native_loader_lazy.cpp
Kiyoung Kim 4639f6946a Add product apk support from libnativeloader
Currently libnativeloader appends vendor lib path if apk is from vendor
partition. Similar to this we should add product lib path if apk if from product partition.

Bug: 124705551
Test: m -j && tested from crosshatch with product apps (such as Wallpaper)
Change-Id: I8c3473f1f70b1c22dcaed7eb2d5f9c3deee9e1a5
Merged-In: I8690167ca8098015c8ae4bbb4f028404c5e94dc0
2019-03-07 15:01:52 +09:00

102 lines
3.4 KiB
C++

/*
* Copyright (C) 2019 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.
*/
#include "nativeloader/native_loader.h"
#define LOG_TAG "nativeloader"
#include <dlfcn.h>
#include <errno.h>
#include <string.h>
#include <log/log.h>
namespace android {
namespace {
void* GetLibHandle() {
static void* handle = dlopen("libnativeloader.so", RTLD_NOW);
LOG_FATAL_IF(handle == nullptr, "Failed to load libnativeloader.so: %s", dlerror());
return handle;
}
template <typename FuncPtr>
FuncPtr GetFuncPtr(const char* function_name) {
auto f = reinterpret_cast<FuncPtr>(dlsym(GetLibHandle(), function_name));
LOG_FATAL_IF(f == nullptr, "Failed to get address of %s: %s", function_name, dlerror());
return f;
}
#define GET_FUNC_PTR(name) GetFuncPtr<decltype(&name)>(#name)
} // namespace
void InitializeNativeLoader() {
static auto f = GET_FUNC_PTR(InitializeNativeLoader);
return f();
}
jstring CreateClassLoaderNamespace(JNIEnv* env, int32_t target_sdk_version, jobject class_loader,
bool is_shared, jstring dex_path, jstring library_path,
jstring permitted_path) {
static auto f = GET_FUNC_PTR(CreateClassLoaderNamespace);
return f(env, target_sdk_version, class_loader, is_shared, dex_path, library_path,
permitted_path);
}
void* OpenNativeLibrary(JNIEnv* env, int32_t target_sdk_version, const char* path,
jobject class_loader, const char* caller_location, jstring library_path,
bool* needs_native_bridge, char** error_msg) {
static auto f = GET_FUNC_PTR(OpenNativeLibrary);
return f(env, target_sdk_version, path, class_loader, caller_location, library_path,
needs_native_bridge, error_msg);
}
bool CloseNativeLibrary(void* handle, const bool needs_native_bridge, char** error_msg) {
static auto f = GET_FUNC_PTR(CloseNativeLibrary);
return f(handle, needs_native_bridge, error_msg);
}
void NativeLoaderFreeErrorMessage(char* msg) {
static auto f = GET_FUNC_PTR(NativeLoaderFreeErrorMessage);
return f(msg);
}
struct android_namespace_t* FindNamespaceByClassLoader(JNIEnv* env, jobject class_loader) {
static auto f = GET_FUNC_PTR(FindNamespaceByClassLoader);
return f(env, class_loader);
}
struct NativeLoaderNamespace* FindNativeLoaderNamespaceByClassLoader(JNIEnv* env,
jobject class_loader) {
static auto f = GET_FUNC_PTR(FindNativeLoaderNamespaceByClassLoader);
return f(env, class_loader);
}
void* OpenNativeLibraryInNamespace(struct NativeLoaderNamespace* ns, const char* path,
bool* needs_native_bridge, char** error_msg) {
static auto f = GET_FUNC_PTR(OpenNativeLibraryInNamespace);
return f(ns, path, needs_native_bridge, error_msg);
}
void ResetNativeLoader() {
static auto f = GET_FUNC_PTR(ResetNativeLoader);
return f();
}
#undef GET_FUNC_PTR
} // namespace android