libbinder: Choose the binder driver at runtime based on system/vendor process.

This is needed since llndk libraries may cause the system variant of libbinder (and therefore
compile time checks are not enough) to be loaded in a vendor process. In that case, it should not be
initing the driver with /dev/binder. It should use /dev/vndbinder instead.

Bug: 124128212

Test: Device boots
Test: play YouTube videos, use camera to take pictures / record video (sanity) on devices supporting
      legacy vndk(sailfish) and also devices supporting current vndk.

Change-Id: Ia5581efa04c8d4adc6af39668b0aa98e84324a27
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp
index 3798b61..86afffc 100644
--- a/libs/binder/ProcessState.cpp
+++ b/libs/binder/ProcessState.cpp
@@ -26,6 +26,7 @@
 #include <utils/String8.h>
 #include <utils/String8.h>
 #include <utils/threads.h>
+#include <vndksupport/linker.h>
 
 #include <private/binder/binder_module.h>
 #include <private/binder/Static.h>
@@ -43,16 +44,22 @@
 #define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)
 #define DEFAULT_MAX_BINDER_THREADS 15
 
-#ifdef __ANDROID_VNDK__
-const char* kDefaultDriver = "/dev/vndbinder";
-#else
+const char* kDefaultVendorDriver = "/dev/vndbinder";
 const char* kDefaultDriver = "/dev/binder";
-#endif
 
 // -------------------------------------------------------------------------
 
 namespace android {
 
+static const char *getDefaultBinderDriver() {
+    // Some libs might have their system variants loaded in a vendor process, so
+    // we cannot depend on a compile time check.
+    if (android_is_in_vendor_process()) {
+        return kDefaultVendorDriver;
+    }
+    return kDefaultDriver;
+}
+
 class PoolThread : public Thread
 {
 public:
@@ -77,7 +84,7 @@
     if (gProcess != nullptr) {
         return gProcess;
     }
-    gProcess = new ProcessState(kDefaultDriver);
+    gProcess = new ProcessState(getDefaultBinderDriver());
     return gProcess;
 }