Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46f95536 authored by Jayant Chowdhary's avatar Jayant Chowdhary
Browse files

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: default avatarJayant Chowdhary <jchowdhary@google.com>
parent a5d85aff
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ cc_library_shared {
        "libcutils",
        "libutils",
        "libbinderthreadstate",
        "libvndksupport",
    ],

    header_libs: [
+12 −5
Original line number Diff line number Diff line
@@ -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 @@ sp<ProcessState> ProcessState::self()
    if (gProcess != nullptr) {
        return gProcess;
    }
    gProcess = new ProcessState(kDefaultDriver);
    gProcess = new ProcessState(getDefaultBinderDriver());
    return gProcess;
}