Add public lib of Cronet apex mainline

This is a workaround since apex module library path is not
supported in jni

Bug: 139397529
Bug: 145474221
Test: Build
Test: manual test with Cronet
Test: atest CtsJniTestCases
Test: atest libnativeloader_test
Change-Id: Ifd8aa85bd78e95131b2ce3eab0ad32c2bb19cee2
diff --git a/libnativeloader/library_namespaces.cpp b/libnativeloader/library_namespaces.cpp
index 03e0814..c01f804 100644
--- a/libnativeloader/library_namespaces.cpp
+++ b/libnativeloader/library_namespaces.cpp
@@ -44,6 +44,7 @@
 constexpr const char* kVndkNamespaceName = "vndk";
 constexpr const char* kArtNamespaceName = "art";
 constexpr const char* kNeuralNetworksNamespaceName = "neuralnetworks";
+constexpr const char* kCronetNamespaceName = "cronet";
 
 // classloader-namespace is a linker namespace that is created for the loaded
 // app. To be specific, it is created for the app classloader. When
@@ -279,6 +280,16 @@
     }
   }
 
+  // TODO(b/143733063): Remove it after library path of apex module is supported.
+  auto cronet_ns =
+      NativeLoaderNamespace::GetExportedNamespace(kCronetNamespaceName, is_bridged);
+  if (cronet_ns) {
+    linked = app_ns->Link(*cronet_ns, cronet_public_libraries());
+    if (!linked) {
+      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 platform namespace
diff --git a/libnativeloader/native_loader_test.cpp b/libnativeloader/native_loader_test.cpp
index 8a8193e..ae99b97 100644
--- a/libnativeloader/native_loader_test.cpp
+++ b/libnativeloader/native_loader_test.cpp
@@ -98,6 +98,7 @@
     {"sphal", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("sphal"))},
     {"vndk", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("vndk"))},
     {"neuralnetworks", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("neuralnetworks"))},
+    {"cronet", TO_MOCK_NAMESPACE(TO_ANDROID_NAMESPACE("cronet"))},
 };
 
 // The actual gmock object
@@ -354,12 +355,14 @@
   bool expected_link_with_vndk_ns = false;
   bool expected_link_with_default_ns = false;
   bool expected_link_with_neuralnetworks_ns = true;
+  bool expected_link_with_cronet_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();
   std::string expected_shared_libs_to_vndk_ns = vndksp_libraries();
   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();
 
   void SetExpectations() {
     NativeLoaderTest::SetExpectations();
@@ -404,6 +407,11 @@
                                               StrEq(expected_shared_libs_to_neuralnetworks_ns)))
           .WillOnce(Return(true));
     }
+    if (expected_link_with_cronet_ns) {
+      EXPECT_CALL(*mock, mock_link_namespaces(Eq(IsBridged()), _, NsEq("cronet"),
+                                              StrEq(expected_shared_libs_to_cronet_ns)))
+          .WillOnce(Return(true));
+    }
   }
 
   void RunTest() {
diff --git a/libnativeloader/public_libraries.cpp b/libnativeloader/public_libraries.cpp
index 1ab9a30..d58b4ea 100644
--- a/libnativeloader/public_libraries.cpp
+++ b/libnativeloader/public_libraries.cpp
@@ -57,6 +57,8 @@
 constexpr const char* kArtApexLibPath = "/apex/com.android.art/" LIB;
 
 constexpr const char* kNeuralNetworksApexPublicLibrary = "libneuralnetworks.so";
+// 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";
 
 // TODO(b/130388701): do we need this?
 std::string root_dir() {
@@ -271,6 +273,10 @@
   return kNeuralNetworksApexPublicLibrary;
 }
 
+static std::string InitCronetPublicLibraries() {
+  return kCronetApexPublicLibrary;
+}
+
 }  // namespace
 
 const std::string& preloadable_public_libraries() {
@@ -303,6 +309,11 @@
   return list;
 }
 
+const std::string& cronet_public_libraries() {
+  static std::string list = InitCronetPublicLibraries();
+  return list;
+}
+
 const std::string& llndk_libraries() {
   static std::string list = InitLlndkLibraries();
   return list;
diff --git a/libnativeloader/public_libraries.h b/libnativeloader/public_libraries.h
index a342baa..5dfaec3 100644
--- a/libnativeloader/public_libraries.h
+++ b/libnativeloader/public_libraries.h
@@ -32,6 +32,7 @@
 const std::string& preloadable_public_libraries();
 const std::string& default_public_libraries();
 const std::string& art_public_libraries();
+const std::string& cronet_public_libraries();
 const std::string& vendor_public_libraries();
 const std::string& extended_public_libraries();
 const std::string& neuralnetworks_public_libraries();