Prepare for android.hidl.allocator deprecation

The service may still be installed on new devices, and will be installed
with GSI. So it needs to be prepared to start, check if it's registered
in the manifest, and either register itself with hwservicemanager, or
shut down without getting restarted by init.

Test: boot cuttlefish without hwservicemanager
Bug: 218588089
Change-Id: I6aaf155ec22ecbd14a9a248512c13e23525ba360
diff --git a/transport/allocator/1.0/default/android.hidl.allocator@1.0-service.rc b/transport/allocator/1.0/default/android.hidl.allocator@1.0-service.rc
index c648aff..a0ffbad 100644
--- a/transport/allocator/1.0/default/android.hidl.allocator@1.0-service.rc
+++ b/transport/allocator/1.0/default/android.hidl.allocator@1.0-service.rc
@@ -2,3 +2,6 @@
     class hal
     user system
     group system
+
+on property:hidl_memory.disabled=true
+   stop hidl_memory
diff --git a/transport/allocator/1.0/default/service.cpp b/transport/allocator/1.0/default/service.cpp
index 63babd3..d918aae 100644
--- a/transport/allocator/1.0/default/service.cpp
+++ b/transport/allocator/1.0/default/service.cpp
@@ -4,24 +4,43 @@
 
 #include <android-base/logging.h>
 #include <android/hidl/allocator/1.0/IAllocator.h>
+#include <android/hidl/manager/1.2/IServiceManager.h>
+#include <cutils/properties.h>
 #include <hidl/HidlTransportSupport.h>
 
+using android::sp;
+using android::status_t;
 using android::hardware::configureRpcThreadpool;
 using android::hardware::joinRpcThreadpool;
 using android::hidl::allocator::V1_0::IAllocator;
 using android::hidl::allocator::V1_0::implementation::AshmemAllocator;
-using android::sp;
-using android::status_t;
+using android::hidl::manager::V1_2::IServiceManager;
+
+static constexpr char kInstanceName[] = "ashmem";
 
 int main() {
     configureRpcThreadpool(1, true /* callerWillJoin */);
 
     sp<IAllocator> allocator = new AshmemAllocator();
 
-    status_t status = allocator->registerAsService("ashmem");
-
-    if (android::OK != status) {
-        LOG(FATAL) << "Unable to register allocator service: " << status;
+    IServiceManager::Transport transport =
+            android::hardware::defaultServiceManager1_2()->getTransport(IAllocator::descriptor,
+                                                                        kInstanceName);
+    if (transport == IServiceManager::Transport::HWBINDER) {
+        status_t status = allocator->registerAsService(kInstanceName);
+        if (android::OK != status) {
+            LOG(FATAL) << "Unable to register allocator service: " << status;
+            return -1;
+        }
+    } else {
+        LOG(INFO) << IAllocator::descriptor << "/" << kInstanceName
+                  << " is not registered in the VINTF manifest as it is deprecated.";
+        // The transport won't change at run time, so make sure we don't restart
+        int rc = property_set("hidl_memory.disabled", "true");
+        if (rc) {
+            LOG_ALWAYS_FATAL("Failed to set \"hidl_memory.disabled\" (error %d).\"", rc);
+        }
+        return 0;
     }
 
     joinRpcThreadpool();