From c2c0ba38a495c9c13fc729d3f03f792e491219ef Mon Sep 17 00:00:00 2001 From: Kalesh Singh Date: Mon, 7 Dec 2020 01:51:39 -0500 Subject: libmemtrack: Add support for AIDL memtrack HAL Bug: 175021432 Test: memtrack_test Change-Id: If310210a37305331d96846c36ce5fcc2e5bd2047 --- Android.bp | 2 ++ memtrack.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/Android.bp b/Android.bp index 9322746..3696acd 100644 --- a/Android.bp +++ b/Android.bp @@ -12,12 +12,14 @@ cc_library_shared { local_include_dirs: ["include"], include_dirs: ["hardware/libhardware/include"], shared_libs: [ + "libbinder_ndk", "libhardware", "liblog", "libbase", "libhidlbase", "libutils", "android.hardware.memtrack@1.0", + "android.hardware.memtrack-unstable-ndk_platform", ], cflags: [ "-Wall", diff --git a/memtrack.cpp b/memtrack.cpp index 3fc24c8..7726942 100644 --- a/memtrack.cpp +++ b/memtrack.cpp @@ -14,14 +14,18 @@ * limitations under the License. */ #define LOG_TAG "memtrack" + +#include +#include +#include #include #include #include #include -#include #include #include +#include #include @@ -33,6 +37,41 @@ using android::hardware::memtrack::V1_0::MemtrackStatus; using android::hardware::hidl_vec; using android::hardware::Return; +namespace V1_0 = android::hardware::memtrack::V1_0; +namespace V_aidl = aidl::android::hardware::memtrack; + +// Check Memtrack Flags +static_assert(static_cast(V1_0::MemtrackFlag::SMAPS_ACCOUNTED) == + static_cast(V_aidl::MemtrackRecord::FLAG_SMAPS_ACCOUNTED)); +static_assert(static_cast(V1_0::MemtrackFlag::SMAPS_UNACCOUNTED) == + static_cast(V_aidl::MemtrackRecord::FLAG_SMAPS_UNACCOUNTED)); +static_assert(static_cast(V1_0::MemtrackFlag::SHARED) == + static_cast(V_aidl::MemtrackRecord::FLAG_SHARED)); +static_assert(static_cast(V1_0::MemtrackFlag::SHARED_PSS) == + static_cast(V_aidl::MemtrackRecord::FLAG_SHARED_PSS)); +static_assert(static_cast(V1_0::MemtrackFlag::PRIVATE) == + static_cast(V_aidl::MemtrackRecord::FLAG_PRIVATE)); +static_assert(static_cast(V1_0::MemtrackFlag::SYSTEM) == + static_cast(V_aidl::MemtrackRecord::FLAG_SYSTEM)); +static_assert(static_cast(V1_0::MemtrackFlag::DEDICATED) == + static_cast(V_aidl::MemtrackRecord::FLAG_DEDICATED)); +static_assert(static_cast(V1_0::MemtrackFlag::NONSECURE) == + static_cast(V_aidl::MemtrackRecord::FLAG_NONSECURE)); +static_assert(static_cast(V1_0::MemtrackFlag::SECURE) == + static_cast(V_aidl::MemtrackRecord::FLAG_SECURE)); + +// Check Memtrack Types +static_assert(static_cast(V1_0::MemtrackType::OTHER) == + static_cast(V_aidl::MemtrackType::OTHER)); +static_assert(static_cast(V1_0::MemtrackType::GL) == + static_cast(V_aidl::MemtrackType::GL)); +static_assert(static_cast(V1_0::MemtrackType::GRAPHICS) == + static_cast(V_aidl::MemtrackType::GRAPHICS)); +static_assert(static_cast(V1_0::MemtrackType::MULTIMEDIA) == + static_cast(V_aidl::MemtrackType::MULTIMEDIA)); +static_assert(static_cast(V1_0::MemtrackType::CAMERA) == + static_cast(V_aidl::MemtrackType::CAMERA)); + struct memtrack_proc_type { MemtrackType type; std::vector records; @@ -44,7 +83,7 @@ struct memtrack_proc { }; //TODO(b/31632518) -static android::sp get_instance() { +static android::sp get_hidl_instance() { static android::sp module = IMemtrack::getService(); static bool logged = false; if (module == nullptr && !logged) { @@ -54,6 +93,14 @@ static android::sp get_instance() { return module; } + +inline std::shared_ptr get_aidl_instance() { + const auto instance = + std::string() + V_aidl::IMemtrack::descriptor + "/default"; + auto memtrackBinder = ndk::SpAIBinder(AServiceManager_getService(instance.c_str())); + return V_aidl::IMemtrack::fromBinder(memtrackBinder); +} + memtrack_proc *memtrack_proc_new(void) { return new memtrack_proc(); @@ -68,7 +115,27 @@ static int memtrack_proc_get_type(memtrack_proc_type *t, pid_t pid, MemtrackType type) { int err = 0; - android::sp memtrack = get_instance(); + + std::shared_ptr service= get_aidl_instance(); + if (service) { + std::vector records; + auto status = service->getMemory( + pid, static_cast(static_cast(type)), &records); + + if (!status.isOk()) { + return -1; + } + + t->records.resize(records.size()); + for (size_t i = 0; i < records.size(); i++) { + t->records[i].sizeInBytes = records[i].sizeInBytes; + t->records[i].flags = records[i].flags; + } + + return err; + } + + android::sp memtrack = get_hidl_instance(); if (memtrack == nullptr) return -1; -- cgit v1.2.3