diff --git a/libs/binder/OS.h b/libs/binder/OS.h
index 64b1fd4..04869a1 100644
--- a/libs/binder/OS.h
+++ b/libs/binder/OS.h
@@ -27,7 +27,6 @@
 LIBBINDER_EXPORTED void trace_begin(uint64_t tag, const char* name);
 LIBBINDER_EXPORTED void trace_end(uint64_t tag);
 LIBBINDER_EXPORTED void trace_int(uint64_t tag, const char* name, int32_t value);
-LIBBINDER_EXPORTED uint64_t get_trace_enabled_tags();
 
 status_t setNonBlocking(borrowed_fd fd);
 
diff --git a/libs/binder/OS_android.cpp b/libs/binder/OS_android.cpp
index 4e9230c..893ee15 100644
--- a/libs/binder/OS_android.cpp
+++ b/libs/binder/OS_android.cpp
@@ -48,10 +48,6 @@
     atrace_int(tag, name, value);
 }
 
-uint64_t get_trace_enabled_tags() {
-    return atrace_enabled_tags;
-}
-
 } // namespace os
 
 // Legacy trace symbol. To be removed once all of downstream rebuilds.
diff --git a/libs/binder/OS_non_android_linux.cpp b/libs/binder/OS_non_android_linux.cpp
index 6bba823..0c64eb6 100644
--- a/libs/binder/OS_non_android_linux.cpp
+++ b/libs/binder/OS_non_android_linux.cpp
@@ -41,10 +41,6 @@
 
 void trace_int(uint64_t, const char*, int32_t) {}
 
-uint64_t get_trace_enabled_tags() {
-    return 0;
-}
-
 uint64_t GetThreadId() {
     return syscall(__NR_gettid);
 }
diff --git a/libs/binder/include/binder/Trace.h b/libs/binder/include/binder/Trace.h
index a3e6c8a..2f450cb 100644
--- a/libs/binder/include/binder/Trace.h
+++ b/libs/binder/include/binder/Trace.h
@@ -42,7 +42,6 @@
 void trace_begin(uint64_t tag, const char* name);
 void trace_end(uint64_t tag);
 void trace_int(uint64_t tag, const char* name, int32_t value);
-uint64_t get_trace_enabled_tags();
 } // namespace os
 
 class LIBBINDER_EXPORTED ScopedTrace {
diff --git a/libs/binder/ndk/ibinder.cpp b/libs/binder/ndk/ibinder.cpp
index ff31dd0..af280d3 100644
--- a/libs/binder/ndk/ibinder.cpp
+++ b/libs/binder/ndk/ibinder.cpp
@@ -18,10 +18,8 @@
 #include <android/binder_ibinder_platform.h>
 #include <android/binder_stability.h>
 #include <android/binder_status.h>
-#include <binder/Functional.h>
 #include <binder/IPCThreadState.h>
 #include <binder/IResultReceiver.h>
-#include <binder/Trace.h>
 #if __has_include(<private/android_filesystem_config.h>)
 #include <private/android_filesystem_config.h>
 #endif
@@ -42,23 +40,6 @@
 using ::android::String16;
 using ::android::String8;
 using ::android::wp;
-using ::android::binder::impl::make_scope_guard;
-using ::android::binder::impl::scope_guard;
-using ::android::binder::os::get_trace_enabled_tags;
-using ::android::binder::os::trace_begin;
-using ::android::binder::os::trace_end;
-
-// transaction codes for getInterfaceHash and getInterfaceVersion are defined
-// in file : system/tools/aidl/aidl.cpp
-static constexpr int kGetInterfaceVersionId = 0x00fffffe;
-static const char* kInterfaceVersion = "getInterfaceVersion";
-static constexpr int kGetInterfaceHashId = 0x00fffffd;
-static const char* kInterfaceHash = "getInterfaceHash";
-static const char* kNdkTrace = "AIDL::ndk::";
-static const char* kServerTrace = "::server";
-static const char* kClientTrace = "::client";
-static const char* kSeparator = "::";
-static const char* kUnknownCode = "Unknown_Transaction_Code:";
 
 namespace ABBinderTag {
 
@@ -109,51 +90,6 @@
     return sanitized;
 }
 
-const std::string getMethodName(const AIBinder_Class* clazz, transaction_code_t code) {
-    // TODO(b/150155678) - Move getInterfaceHash and getInterfaceVersion to libbinder and remove
-    // hardcoded cases.
-    if (code <= clazz->getTransactionCodeToFunctionLength() && code >= FIRST_CALL_TRANSACTION) {
-        // Codes have FIRST_CALL_TRANSACTION as added offset. Subtract to access function name
-        return clazz->getFunctionName(code);
-    } else if (code == kGetInterfaceVersionId) {
-        return kInterfaceVersion;
-    } else if (code == kGetInterfaceHashId) {
-        return kInterfaceHash;
-    }
-    return kUnknownCode + std::to_string(code);
-}
-
-const std::string getTraceSectionName(const AIBinder_Class* clazz, transaction_code_t code,
-                                      bool isServer) {
-    if (clazz == nullptr) {
-        ALOGE("class associated with binder is null. Class is needed to add trace with interface "
-              "name and function name");
-        return kNdkTrace;
-    }
-
-    const std::string descriptor = clazz->getInterfaceDescriptorUtf8();
-    const std::string methodName = getMethodName(clazz, code);
-
-    size_t traceSize =
-            strlen(kNdkTrace) + descriptor.size() + strlen(kSeparator) + methodName.size();
-    traceSize += isServer ? strlen(kServerTrace) : strlen(kClientTrace);
-
-    std::string trace;
-    // reserve to avoid repeated allocations
-    trace.reserve(traceSize);
-
-    trace += kNdkTrace;
-    trace += clazz->getInterfaceDescriptorUtf8();
-    trace += kSeparator;
-    trace += methodName;
-    trace += isServer ? kServerTrace : kClientTrace;
-
-    LOG_ALWAYS_FATAL_IF(trace.size() != traceSize, "Trace size mismatch. Expected %zu, got %zu",
-                        traceSize, trace.size());
-
-    return trace;
-}
-
 bool AIBinder::associateClass(const AIBinder_Class* clazz) {
     if (clazz == nullptr) return false;
 
@@ -267,17 +203,6 @@
 
 status_t ABBinder::onTransact(transaction_code_t code, const Parcel& data, Parcel* reply,
                               binder_flags_t flags) {
-    std::string sectionName;
-    bool tracingEnabled = get_trace_enabled_tags() & ATRACE_TAG_AIDL;
-    if (tracingEnabled) {
-        sectionName = getTraceSectionName(getClass(), code, true /*isServer*/);
-        trace_begin(ATRACE_TAG_AIDL, sectionName.c_str());
-    }
-
-    scope_guard guard = make_scope_guard([&]() {
-        if (tracingEnabled) trace_end(ATRACE_TAG_AIDL);
-    });
-
     if (isUserCommand(code)) {
         if (getClass()->writeHeader && !data.checkInterface(this)) {
             return STATUS_BAD_TYPE;
@@ -460,31 +385,6 @@
       mInterfaceDescriptor(interfaceDescriptor),
       mWideInterfaceDescriptor(interfaceDescriptor) {}
 
-bool AIBinder_Class::setTransactionCodeMap(const char** transactionCodeMap, size_t length) {
-    if (mTransactionCodeToFunction != nullptr) {
-        ALOGE("mTransactionCodeToFunction is already set!");
-        return false;
-    }
-    mTransactionCodeToFunction = transactionCodeMap;
-    mTransactionCodeToFunctionLength = length;
-    return true;
-}
-
-const char* AIBinder_Class::getFunctionName(transaction_code_t code) const {
-    if (mTransactionCodeToFunction == nullptr) {
-        ALOGE("mTransactionCodeToFunction is not set!");
-        return nullptr;
-    }
-
-    if (code < FIRST_CALL_TRANSACTION ||
-        code - FIRST_CALL_TRANSACTION >= mTransactionCodeToFunctionLength) {
-        ALOGE("Function name for requested code not found!");
-        return nullptr;
-    }
-
-    return mTransactionCodeToFunction[code - FIRST_CALL_TRANSACTION];
-}
-
 AIBinder_Class* AIBinder_Class_define(const char* interfaceDescriptor,
                                       AIBinder_Class_onCreate onCreate,
                                       AIBinder_Class_onDestroy onDestroy,
@@ -504,24 +404,6 @@
     clazz->onDump = onDump;
 }
 
-void AIBinder_Class_setTransactionCodeToFunctionNameMap(AIBinder_Class* clazz,
-                                                        const char** transactionCodeToFunction,
-                                                        size_t length) {
-    LOG_ALWAYS_FATAL_IF(clazz == nullptr || transactionCodeToFunction == nullptr,
-                        "Valid clazz and transactionCodeToFunction are needed to set code to "
-                        "function mapping.");
-    LOG_ALWAYS_FATAL_IF(!clazz->setTransactionCodeMap(transactionCodeToFunction, length),
-                        "Failed to set transactionCodeToFunction to clazz! Is "
-                        "transactionCodeToFunction already set?");
-}
-
-const char* AIBinder_Class_getFunctionName(AIBinder_Class* clazz, transaction_code_t code) {
-    LOG_ALWAYS_FATAL_IF(
-            clazz == nullptr,
-            "Valid clazz is needed to get function name for requested transaction code");
-    return clazz->getFunctionName(code);
-}
-
 void AIBinder_Class_disableInterfaceTokenHeader(AIBinder_Class* clazz) {
     LOG_ALWAYS_FATAL_IF(clazz == nullptr, "disableInterfaceTokenHeader requires non-null clazz");
 
@@ -852,19 +734,6 @@
 
 binder_status_t AIBinder_transact(AIBinder* binder, transaction_code_t code, AParcel** in,
                                   AParcel** out, binder_flags_t flags) {
-    const AIBinder_Class* clazz = binder ? binder->getClass() : nullptr;
-
-    std::string sectionName;
-    bool tracingEnabled = get_trace_enabled_tags() & ATRACE_TAG_AIDL;
-    if (tracingEnabled) {
-        sectionName = getTraceSectionName(clazz, code, false /*isServer*/);
-        trace_begin(ATRACE_TAG_AIDL, sectionName.c_str());
-    }
-
-    scope_guard guard = make_scope_guard([&]() {
-        if (tracingEnabled) trace_end(ATRACE_TAG_AIDL);
-    });
-
     if (in == nullptr) {
         ALOGE("%s: requires non-null in parameter", __func__);
         return STATUS_UNEXPECTED_NULL;
@@ -1003,4 +872,4 @@
                         "AIBinder_setInheritRt must be called on a local binder");
 
     localBinder->setInheritRt(inheritRt);
-}
\ No newline at end of file
+}
diff --git a/libs/binder/ndk/ibinder_internal.h b/libs/binder/ndk/ibinder_internal.h
index a93dc1f..f5b738c 100644
--- a/libs/binder/ndk/ibinder_internal.h
+++ b/libs/binder/ndk/ibinder_internal.h
@@ -132,9 +132,6 @@
 
     const ::android::String16& getInterfaceDescriptor() const { return mWideInterfaceDescriptor; }
     const char* getInterfaceDescriptorUtf8() const { return mInterfaceDescriptor.c_str(); }
-    bool setTransactionCodeMap(const char** transactionCodeMap, size_t transactionCodeMapSize);
-    const char* getFunctionName(transaction_code_t code) const;
-    size_t getTransactionCodeToFunctionLength() const { return mTransactionCodeToFunctionLength; }
 
     // whether a transaction header should be written
     bool writeHeader = true;
@@ -154,10 +151,6 @@
     // This must be a String16 since BBinder virtual getInterfaceDescriptor returns a reference to
     // one.
     const ::android::String16 mWideInterfaceDescriptor;
-    // Array which holds names of the functions
-    const char** mTransactionCodeToFunction = nullptr;
-    // length of mmTransactionCodeToFunctionLength array
-    size_t mTransactionCodeToFunctionLength = 0;
 };
 
 // Ownership is like this (when linked to death):
diff --git a/libs/binder/ndk/include_cpp/android/binder_interface_utils.h b/libs/binder/ndk/include_cpp/android/binder_interface_utils.h
index a679091..af56bf0 100644
--- a/libs/binder/ndk/include_cpp/android/binder_interface_utils.h
+++ b/libs/binder/ndk/include_cpp/android/binder_interface_utils.h
@@ -30,17 +30,6 @@
 #include <android/binder_auto_utils.h>
 #include <android/binder_ibinder.h>
 
-#if defined(__ANDROID_VENDOR__)
-#include <android/llndk-versioning.h>
-#elif !defined(API_LEVEL_AT_LEAST)
-#if defined(__BIONIC__)
-#define API_LEVEL_AT_LEAST(sdk_api_level, vendor_api_level) \
-    (__builtin_available(android sdk_api_level, *))
-#else
-#define API_LEVEL_AT_LEAST(sdk_api_level, vendor_api_level) (true)
-#endif  // __BIONIC__
-#endif  // __ANDROID_VENDOR__
-
 #if __has_include(<android/binder_shell.h>)
 #include <android/binder_shell.h>
 #define HAS_BINDER_SHELL_COMMAND
@@ -175,8 +164,7 @@
      * Helper method to create a class
      */
     static inline AIBinder_Class* defineClass(const char* interfaceDescriptor,
-                                              AIBinder_Class_onTransact onTransact,
-                                              const char** codeToFunction, size_t functionCount);
+                                              AIBinder_Class_onTransact onTransact);
 
    private:
     class ICInterfaceData {
@@ -267,8 +255,7 @@
 }
 
 AIBinder_Class* ICInterface::defineClass(const char* interfaceDescriptor,
-                                         AIBinder_Class_onTransact onTransact,
-                                         const char** codeToFunction, size_t functionCount) {
+                                         AIBinder_Class_onTransact onTransact) {
     AIBinder_Class* clazz = AIBinder_Class_define(interfaceDescriptor, ICInterfaceData::onCreate,
                                                   ICInterfaceData::onDestroy, onTransact);
     if (clazz == nullptr) {
@@ -287,15 +274,6 @@
         AIBinder_Class_setHandleShellCommand(clazz, ICInterfaceData::handleShellCommand);
     }
 #endif
-
-#if defined(__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__) || __ANDROID_API__ >= 36
-    if API_LEVEL_AT_LEAST (36, 202504) {
-        AIBinder_Class_setTransactionCodeToFunctionNameMap(clazz, codeToFunction, functionCount);
-    }
-#else
-    (void)codeToFunction;
-    (void)functionCount;
-#endif  // defined(__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__) || __ANDROID_API__ >= 36
     return clazz;
 }
 
diff --git a/libs/binder/ndk/include_ndk/android/binder_ibinder.h b/libs/binder/ndk/include_ndk/android/binder_ibinder.h
index aaf4698..72d255e 100644
--- a/libs/binder/ndk/include_ndk/android/binder_ibinder.h
+++ b/libs/binder/ndk/include_ndk/android/binder_ibinder.h
@@ -26,20 +26,14 @@
 
 #pragma once
 
-#include <android/binder_parcel.h>
-#if defined(__ANDROID_VENDOR__)
-#include <android/llndk-versioning.h>
-#else
-#if !defined(__INTRODUCED_IN_LLNDK)
-#define __INTRODUCED_IN_LLNDK(level) __attribute__((annotate("introduced_in_llndk=" #level)))
-#endif
-#endif  // __ANDROID_VENDOR__
-#include <android/binder_status.h>
 #include <stdbool.h>
 #include <stdint.h>
 #include <sys/cdefs.h>
 #include <sys/types.h>
 
+#include <android/binder_parcel.h>
+#include <android/binder_status.h>
+
 __BEGIN_DECLS
 
 /**
@@ -225,51 +219,6 @@
 void AIBinder_Class_setOnDump(AIBinder_Class* clazz, AIBinder_onDump onDump) __INTRODUCED_IN(29);
 
 /**
- * Associates a mapping of transaction codes(transaction_code_t) to function names for the given
- * class.
- *
- * Trace messages will use the provided names instead of bare integer codes when set. If not set by
- * this function, trace messages will only be identified by the bare code. This should be called one
- * time during clazz initialization. clazz and transactionCodeToFunctionMap should have same
- * lifetime. Resetting/clearing the transactionCodeToFunctionMap is not allowed.
- *
- * Available since API level 36.
- *
- * \param clazz class which should use this transaction to code function map.
- * \param transactionCodeToFunctionMap array of function names indexed by transaction code.
- * Transaction codes start from 1, functions with transaction code 1 will correspond to index 0 in
- * transactionCodeToFunctionMap. When defining methods, transaction codes are expected to be
- * contiguous, and this is required for maximum memory efficiency.
- * You can use nullptr if certain transaction codes are not used. Lifetime should be same as clazz.
- * \param length number of elements in the transactionCodeToFunctionMap
- *
- * \return true if setting codeToFunction to clazz is successful. return false if clazz or
- * codeToFunction is nullptr.
- */
-void AIBinder_Class_setTransactionCodeToFunctionNameMap(AIBinder_Class* clazz,
-                                                        const char** transactionCodeToFunctionMap,
-                                                        size_t length) __INTRODUCED_IN(36)
-        __INTRODUCED_IN_LLNDK(202504);
-
-/**
- * Get function name associated with transaction code for given class
- *
- * This function returns function name associated with provided transaction code for given class.
- * AIBinder_Class_setTransactionCodeToFunctionNameMap should be called first to associate function
- * to transaction code mapping.
- *
- * Available since API level 36.
- *
- * \param clazz class for which function name is requested
- * \param transactionCode transaction_code_t for which function name is requested.
- *
- * \return function name in form of const char* if transaction code is valid for given class.
- * if transaction code is invalid or transactionCodeToFunctionMap is not set, nullptr is returned
- */
-const char* AIBinder_Class_getFunctionName(AIBinder_Class* clazz, transaction_code_t code)
-        __INTRODUCED_IN(36) __INTRODUCED_IN_LLNDK(202504);
-
-/**
  * This tells users of this class not to use a transaction header. By default, libbinder_ndk users
  * read/write transaction headers implicitly (in the SDK, this must be manually written by
  * android.os.Parcel#writeInterfaceToken, and it is read/checked with
diff --git a/libs/binder/ndk/libbinder_ndk.map.txt b/libs/binder/ndk/libbinder_ndk.map.txt
index 800d83a..826e199 100644
--- a/libs/binder/ndk/libbinder_ndk.map.txt
+++ b/libs/binder/ndk/libbinder_ndk.map.txt
@@ -248,14 +248,6 @@
     AServiceManager_openDeclaredPassthroughHal; # systemapi llndk=202404
 };
 
-LIBBINDER_NDK36 { # introduced=36
-  global:
-    AIBinder_Class_setTransactionCodeToFunctionNameMap;
-    AIBinder_Class_setTransactionCodeToFunctionNameMap; # llndk=202504
-    AIBinder_Class_getFunctionName;
-    AIBinder_Class_getFunctionName; # llndk=202504
-};
-
 LIBBINDER_NDK_PLATFORM {
   global:
     AParcel_getAllowFds;
diff --git a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
index e5a3da4..3cd2b9a 100644
--- a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
+++ b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp
@@ -1108,37 +1108,6 @@
     EXPECT_EQ(deleteCount, 0);
 }
 
-void* EmptyOnCreate(void* args) {
-    return args;
-}
-void EmptyOnDestroy(void* /*userData*/) {}
-binder_status_t EmptyOnTransact(AIBinder* /*binder*/, transaction_code_t /*code*/,
-                                const AParcel* /*in*/, AParcel* /*out*/) {
-    return STATUS_OK;
-}
-
-TEST(NdkBinder_DeathTest, SetCodeMapTwice) {
-    const char* codeToFunction1[] = {"function-1", "function-2", "function-3"};
-    const char* codeToFunction2[] = {"function-4", "function-5"};
-    const char* interfaceName = "interface_descriptor";
-    AIBinder_Class* clazz =
-            AIBinder_Class_define(interfaceName, EmptyOnCreate, EmptyOnDestroy, EmptyOnTransact);
-    AIBinder_Class_setTransactionCodeToFunctionNameMap(clazz, codeToFunction1, 3);
-    // Reset/clear is not allowed
-    EXPECT_DEATH(AIBinder_Class_setTransactionCodeToFunctionNameMap(clazz, codeToFunction2, 2), "");
-}
-
-TEST(NdkBinder_DeathTest, SetNullCodeMap) {
-    const char* codeToFunction[] = {"function-1", "function-2", "function-3"};
-    const char* interfaceName = "interface_descriptor";
-    AIBinder_Class* clazz =
-            AIBinder_Class_define(interfaceName, EmptyOnCreate, EmptyOnDestroy, EmptyOnTransact);
-    EXPECT_DEATH(AIBinder_Class_setTransactionCodeToFunctionNameMap(nullptr, codeToFunction, 3),
-                 "");
-    EXPECT_DEATH(AIBinder_Class_setTransactionCodeToFunctionNameMap(clazz, nullptr, 0), "");
-    EXPECT_DEATH(AIBinder_Class_setTransactionCodeToFunctionNameMap(nullptr, nullptr, 0), "");
-}
-
 int main(int argc, char* argv[]) {
     ::testing::InitGoogleTest(&argc, argv);
 
diff --git a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp
index e3a3371..3a1471e 100644
--- a/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp
+++ b/libs/binder/tests/parcel_fuzzer/binder_ndk.cpp
@@ -49,8 +49,7 @@
     return STATUS_UNKNOWN_TRANSACTION;
 }
 
-static AIBinder_Class* g_class =
-        ::ndk::ICInterface::defineClass("ISomeInterface", onTransact, nullptr, 0);
+static AIBinder_Class* g_class = ::ndk::ICInterface::defineClass("ISomeInterface", onTransact);
 
 class BpSomeInterface : public ::ndk::BpCInterface<ISomeInterface> {
 public:
diff --git a/libs/binder/trusty/OS.cpp b/libs/binder/trusty/OS.cpp
index ba9e457..157ab3c 100644
--- a/libs/binder/trusty/OS.cpp
+++ b/libs/binder/trusty/OS.cpp
@@ -42,10 +42,6 @@
 
 void trace_int(uint64_t, const char*, int32_t) {}
 
-uint64_t get_trace_enabled_tags() {
-    return 0;
-}
-
 uint64_t GetThreadId() {
     return 0;
 }
diff --git a/libs/binder/trusty/ndk/include/android/llndk-versioning.h b/libs/binder/trusty/ndk/include/android/llndk-versioning.h
index 91a4e94..3ae3d8f 100644
--- a/libs/binder/trusty/ndk/include/android/llndk-versioning.h
+++ b/libs/binder/trusty/ndk/include/android/llndk-versioning.h
@@ -16,5 +16,3 @@
 #pragma once
 
 #define __INTRODUCED_IN_LLNDK(x) /* nothing on Trusty */
-
-#define API_LEVEL_AT_LEAST(x, y) (false) /* nothing on Trusty */
