binder: Use StaticString16 for interface descriptors

Binder interface descriptors is one of the biggest sources of static
constructors.  Use the newly implemented StaticString16 to avoid
runtime construction.

Bug: 138856262
Test: Build and boot cuttlefish.
Test: Check interface descriptors now reside in .data sections.
Test: Measure the memory usage of libraries affected by this change,
      including .data, .data.rel.ro, and .bss sections, on cuttlefish.
      Overall usage decreases by 112 KB.
Change-Id: I0419aa9378570936f15a97a9ab814b035dee4c06
diff --git a/libs/binder/include/binder/IInterface.h b/libs/binder/include/binder/IInterface.h
index 0d30560..adc1f05 100644
--- a/libs/binder/include/binder/IInterface.h
+++ b/libs/binder/include/binder/IInterface.h
@@ -88,8 +88,12 @@
 public:                                                                 \
 
 
+#define __IINTF_CONCAT(x, y) (x ## y)
 #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
-    const ::android::String16 I##INTERFACE::descriptor(NAME);           \
+    const ::android::StaticString16                                     \
+        I##INTERFACE##_descriptor_static_str16(__IINTF_CONCAT(u, NAME));\
+    const ::android::String16 I##INTERFACE::descriptor(                 \
+        I##INTERFACE##_descriptor_static_str16);                        \
     const ::android::String16&                                          \
             I##INTERFACE::getInterfaceDescriptor() const {              \
         return I##INTERFACE::descriptor;                                \