Support the fallback path with device memories.

CPU fallback with device memories:
1. Allocate BLOB mode AHWBs for input and output device memories.
2. Copy out input device memories by IBuffer::copyTo.
3. Compute on CPU.
4. Copy back output device memories by IBuffer::copyFrom.

Bug: 152208838
Test: NNT_static with a broken driver
Change-Id: I9fed3134a7c56c893ff94e892cc25d230a1bd972
Merged-In: I9fed3134a7c56c893ff94e892cc25d230a1bd972
(cherry picked from commit 7b352ec1d710de550df2719a98083b04ccadfe1a)
diff --git a/runtime/Memory.cpp b/runtime/Memory.cpp
index 7ff3651..09e597e 100644
--- a/runtime/Memory.cpp
+++ b/runtime/Memory.cpp
@@ -134,7 +134,6 @@
     }
 
     Metadata getMetadata() const override {
-        CHECK(mInitialized);
         return {.logicalSize = TypeManager::get()->getSizeOfData(kOperand.type, mUpdatedDimensions),
                 .dimensions = mUpdatedDimensions,
                 .operand = kOperand};
@@ -158,6 +157,10 @@
         return true;
     }
 
+    bool createdWithUnknownShape() const override {
+        return TypeManager::get()->getSizeOfData(kOperand.type, kInitialDimensions) == 0;
+    }
+
     void setInitialized(bool initialized) override { mInitialized = initialized; }
     bool isInitialized() const override { return mInitialized; }
 
@@ -243,7 +246,7 @@
     return ANEURALNETWORKS_NO_ERROR;
 }
 
-static int copyIBufferToHidlMemory(const sp<IBuffer>& src, const hidl_memory& dst) {
+int copyIBufferToHidlMemory(const sp<IBuffer>& src, const hidl_memory& dst) {
     const auto ret = src->copyTo(dst);
     if (!ret.isOk()) {
         LOG(ERROR) << "ANeuralNetworksMemory_copy failure: " << ret.description();
@@ -252,8 +255,8 @@
     return convertErrorStatusToResultCode(static_cast<ErrorStatus>(ret));
 }
 
-static int copyHidlMemoryToIBuffer(const hidl_memory& src, const sp<IBuffer>& dst,
-                                   const std::vector<uint32_t>& dimensions) {
+int copyHidlMemoryToIBuffer(const hidl_memory& src, const sp<IBuffer>& dst,
+                            const std::vector<uint32_t>& dimensions) {
     const auto ret = dst->copyFrom(src, dimensions);
     if (!ret.isOk()) {
         LOG(ERROR) << "ANeuralNetworksMemory_copy failure: " << ret.description();