diff options
| -rw-r--r-- | libs/graphicsenv/GraphicsEnv.cpp | 31 | ||||
| -rw-r--r-- | libs/graphicsenv/include/graphicsenv/GraphicsEnv.h | 6 |
2 files changed, 31 insertions, 6 deletions
diff --git a/libs/graphicsenv/GraphicsEnv.cpp b/libs/graphicsenv/GraphicsEnv.cpp index 8e883b33d8..0d031edfc6 100644 --- a/libs/graphicsenv/GraphicsEnv.cpp +++ b/libs/graphicsenv/GraphicsEnv.cpp @@ -115,14 +115,18 @@ static const std::string getSystemNativeLibraries(NativeLibrary type) { return env; } -void GraphicsEnv::setDriverPath(const std::string path) { - if (!mDriverPath.empty()) { - ALOGV("ignoring attempt to change driver path from '%s' to '%s'", mDriverPath.c_str(), - path.c_str()); +void GraphicsEnv::setDriverPathAndSphalLibraries(const std::string path, + const std::string sphalLibraries) { + if (!mDriverPath.empty() || !mSphalLibraries.empty()) { + ALOGV("ignoring attempt to change driver path from '%s' to '%s' or change sphal libraries " + "from '%s' to '%s'", + mDriverPath.c_str(), path.c_str(), mSphalLibraries.c_str(), sphalLibraries.c_str()); return; } - ALOGV("setting driver path to '%s'", path.c_str()); + ALOGV("setting driver path to '%s' and sphal libraries to '%s'", path.c_str(), + sphalLibraries.c_str()); mDriverPath = path; + mSphalLibraries = sphalLibraries; } void GraphicsEnv::setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths) { @@ -187,6 +191,23 @@ android_namespace_t* GraphicsEnv::getDriverNamespace() { mDriverNamespace = nullptr; return; } + + if (mSphalLibraries.empty()) return; + + // Make additional libraries in sphal to be accessible + auto sphalNamespace = android_get_exported_namespace("sphal"); + if (!sphalNamespace) { + ALOGE("Depend on these libraries[%s] in sphal, but failed to get sphal namespace", + mSphalLibraries.c_str()); + mDriverNamespace = nullptr; + return; + } + + if (!android_link_namespaces(mDriverNamespace, sphalNamespace, mSphalLibraries.c_str())) { + ALOGE("Failed to link sphal namespace[%s]", dlerror()); + mDriverNamespace = nullptr; + return; + } }); return mDriverNamespace; diff --git a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h index 784e2c8903..2e8e0998ed 100644 --- a/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h +++ b/libs/graphicsenv/include/graphicsenv/GraphicsEnv.h @@ -34,7 +34,10 @@ public: // (drivers must be stored uncompressed and page aligned); such elements // in the search path must have a '!' after the zip filename, e.g. // /data/app/com.example.driver/base.apk!/lib/arm64-v8a - void setDriverPath(const std::string path); + // Also set additional required sphal libraries to the linker for loading + // graphics drivers. The string is a list of libraries separated by ':', + // which is required by android_link_namespaces. + void setDriverPathAndSphalLibraries(const std::string path, const std::string sphalLibraries); android_namespace_t* getDriverNamespace(); void setLayerPaths(NativeLoaderNamespace* appNamespace, const std::string layerPaths); @@ -47,6 +50,7 @@ public: private: GraphicsEnv() = default; std::string mDriverPath; + std::string mSphalLibraries; std::string mDebugLayers; std::string mLayerPaths; android_namespace_t* mDriverNamespace = nullptr; |