libui: Load a.h.graphics.mapper passthrough service on library load

Zygote loads libui, this helps complete the chain from
  zygote -> libui -> a.h.graphics.mapper -> gralloc
so that all of these libraries which are used by nearly every app are
loaded by zygote and shared.

Bug: 62353585
Test: boot to launcher, run calculator, confirm a.h.graphics.mapper
      implementation library is in /proc/`pid zygote64`/maps

Change-Id: Ib505c926a410191e3e2ad809bfe98a73b21fac90
diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp
index 87dbaf4..e149803 100644
--- a/libs/ui/Gralloc2.cpp
+++ b/libs/ui/Gralloc2.cpp
@@ -16,6 +16,7 @@
 
 #define LOG_TAG "Gralloc2"
 
+#include <hidl/ServiceManagement.h>
 #include <hwbinder/IPCThreadState.h>
 #include <ui/Gralloc2.h>
 
@@ -250,4 +251,17 @@
 
 } // namespace Gralloc2
 
+namespace {
+// Load the IMapper implementation library when this shared library is loaded, rather than when
+// we (lazily) create the Gralloc2::Mapper instance. Since these libraries will all be needed by
+// nearly all apps, this allows us to load them in Zygote rather than on each app launch.
+class PreloadMapperImpl {
+public:
+    PreloadMapperImpl() {
+        android::hardware::preloadPassthroughService<hardware::graphics::mapper::V2_0::IMapper>();
+    }
+};
+static PreloadMapperImpl preloadMapperImpl;
+} // namespace
+
 } // namespace android