Add libstats_jni to linkerconfig/namespace

As part of statsd becoming a Mainline module, moving libstats_jni to the
apex requires adding it to the linker namespace here.

Bug: 145922701
Test: m -j
Change-Id: Ifcbea47cc36604e4a86df9af711d678b23012724
diff --git a/libnativeloader/library_namespaces.cpp b/libnativeloader/library_namespaces.cpp
index 8e9b6ea..9c658d7 100644
--- a/libnativeloader/library_namespaces.cpp
+++ b/libnativeloader/library_namespaces.cpp
@@ -45,6 +45,7 @@
 constexpr const char* kArtNamespaceName = "com.android.art";
 constexpr const char* kNeuralNetworksNamespaceName = "com.android.neuralnetworks";
 constexpr const char* kCronetNamespaceName = "com.android.cronet";
+constexpr const char* kStatsdNamespaceName = "com.android.os.statsd";
 
 // classloader-namespace is a linker namespace that is created for the loaded
 // app. To be specific, it is created for the app classloader. When
@@ -295,6 +296,16 @@
     }
   }
 
+  // Give access to StatsdAPI libraries
+  auto statsd_ns =
+      NativeLoaderNamespace::GetExportedNamespace(kStatsdNamespaceName, is_bridged);
+  if (statsd_ns.ok()) {
+    linked = app_ns->Link(*statsd_ns, statsd_public_libraries());
+    if (!linked.ok()) {
+      return linked.error();
+    }
+  }
+
   if (!vendor_public_libraries().empty()) {
     auto vendor_ns = NativeLoaderNamespace::GetExportedNamespace(kVendorNamespaceName, is_bridged);
     // when vendor_ns is not configured, link to the system namespace
diff --git a/libnativeloader/native_loader_test.cpp b/libnativeloader/native_loader_test.cpp
index 7064c16..75cbc60 100644
--- a/libnativeloader/native_loader_test.cpp
+++ b/libnativeloader/native_loader_test.cpp
@@ -99,6 +99,7 @@
     {"vndk", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("vndk"))},
     {"com.android.neuralnetworks", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("com.android.neuralnetworks"))},
     {"com.android.cronet", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("com.android.cronet"))},
+    {"com.android.os.statsd", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("com.android.os.statsd"))},
 };
 
 // The actual gmock object
@@ -356,6 +357,7 @@
   bool expected_link_with_default_ns = false;
   bool expected_link_with_neuralnetworks_ns = true;
   bool expected_link_with_cronet_ns = true;
+  bool expected_link_with_statsd_ns = true;
   std::string expected_shared_libs_to_platform_ns = default_public_libraries();
   std::string expected_shared_libs_to_art_ns = art_public_libraries();
   std::string expected_shared_libs_to_sphal_ns = vendor_public_libraries();
@@ -363,6 +365,7 @@
   std::string expected_shared_libs_to_default_ns = default_public_libraries();
   std::string expected_shared_libs_to_neuralnetworks_ns = neuralnetworks_public_libraries();
   std::string expected_shared_libs_to_cronet_ns = cronet_public_libraries();
+  std::string expected_shared_libs_to_statsd_ns = statsd_public_libraries();
 
   void SetExpectations() {
     NativeLoaderTest::SetExpectations();
@@ -412,6 +415,11 @@
                                               StrEq(expected_shared_libs_to_cronet_ns)))
           .WillOnce(Return(true));
     }
+    if (expected_link_with_statsd_ns) {
+      EXPECT_CALL(*mock, mock_link_namespaces(Eq(IsBridged()), _, NsEq("com.android.os.statsd"),
+                                              StrEq(expected_shared_libs_to_statsd_ns)))
+          .WillOnce(Return(true));
+    }
   }
 
   void RunTest() {
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index 34f0a3d..35ef488 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -38,10 +38,11 @@
 
 namespace android::nativeloader {
 
-using namespace internal;
-using namespace ::std::string_literals;
 using android::base::ErrnoError;
 using android::base::Result;
+using internal::ConfigEntry;
+using internal::ParseConfig;
+using std::literals::string_literals::operator""s;
 
 namespace {
 
@@ -63,6 +64,8 @@
 // STOPSHIP(b/146420818): Figure out how to use stub or non-specific lib name for libcronet.
 constexpr const char* kCronetApexPublicLibrary = "libcronet.80.0.3986.0.so";
 
+constexpr const char* kStatsdApexPublicLibrary = "libstats_jni.so";
+
 // TODO(b/130388701): do we need this?
 std::string root_dir() {
   static const char* android_root_env = getenv("ANDROID_ROOT");
@@ -218,7 +221,7 @@
 }
 
 static std::string InitArtPublicLibraries() {
-  CHECK(sizeof(kArtApexPublicLibraries) > 0);
+  CHECK_GT((int)sizeof(kArtApexPublicLibraries), 0);
   std::string list = android::base::Join(kArtApexPublicLibraries, ":");
 
   std::string additional_libs = additional_public_libraries();
@@ -293,6 +296,10 @@
   return kCronetApexPublicLibrary;
 }
 
+static std::string InitStatsdPublicLibraries() {
+  return kStatsdApexPublicLibrary;
+}
+
 }  // namespace
 
 const std::string& preloadable_public_libraries() {
@@ -330,6 +337,11 @@
   return list;
 }
 
+const std::string& statsd_public_libraries() {
+  static std::string list = InitStatsdPublicLibraries();
+  return list;
+}
+
 const std::string& llndk_libraries_product() {
   static std::string list = InitLlndkLibrariesProduct();
   return list;
diff --git a/libnativeloader/public_libraries.h b/libnativeloader/public_libraries.h
index 97be7e5..5fffb86 100644
--- a/libnativeloader/public_libraries.h
+++ b/libnativeloader/public_libraries.h
@@ -33,6 +33,7 @@
 const std::string& default_public_libraries();
 const std::string& art_public_libraries();
 const std::string& cronet_public_libraries();
+const std::string& statsd_public_libraries();
 const std::string& vendor_public_libraries();
 const std::string& extended_public_libraries();
 const std::string& neuralnetworks_public_libraries();