Keep only service binding in DataLoaderManager.

This simplifies:
- resource management - no extra copies of controls,
- state management - all states in one place, no more hidden (bound but
not created) state.

Bug: b/153874006
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest
Change-Id: I3d16a099c7f42fcf14637c5a8e96bd6f99e073d1
diff --git a/core/java/android/content/pm/DataLoaderManager.java b/core/java/android/content/pm/DataLoaderManager.java
index 4a61938..e8fb241 100644
--- a/core/java/android/content/pm/DataLoaderManager.java
+++ b/core/java/android/content/pm/DataLoaderManager.java
@@ -41,17 +41,16 @@
      * @param dataLoaderId ID for the new data loader binder service.
      * @param params       DataLoaderParamsParcel object that contains data loader params, including
      *                     its package name, class name, and additional parameters.
-     * @param control      FileSystemControlParcel that contains filesystem control handlers.
      * @param listener     Callback for the data loader service to report status back to the
      *                     caller.
      * @return false if 1) target ID collides with a data loader that is already bound to data
      * loader manager; 2) package name is not specified; 3) fails to find data loader package;
      * or 4) fails to bind to the specified data loader service, otherwise return true.
      */
-    public boolean initializeDataLoader(int dataLoaderId, @NonNull DataLoaderParamsParcel params,
-            @NonNull FileSystemControlParcel control, @NonNull IDataLoaderStatusListener listener) {
+    public boolean bindToDataLoader(int dataLoaderId, @NonNull DataLoaderParamsParcel params,
+            @NonNull IDataLoaderStatusListener listener) {
         try {
-            return mService.initializeDataLoader(dataLoaderId, params, control, listener);
+            return mService.bindToDataLoader(dataLoaderId, params, listener);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -70,12 +69,13 @@
     }
 
     /**
-     * Destroys the data loader binder service and removes it from data loader manager service.
+     * Unbinds from a data loader binder service, specified by its ID.
+     * DataLoader will receive destroy notification.
      */
     @Nullable
-    public void destroyDataLoader(int dataLoaderId) {
+    public void unbindFromDataLoader(int dataLoaderId) {
         try {
-            mService.destroyDataLoader(dataLoaderId);
+            mService.unbindFromDataLoader(dataLoaderId);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/content/pm/IDataLoaderManager.aidl b/core/java/android/content/pm/IDataLoaderManager.aidl
index 1336f72..93b3de7 100644
--- a/core/java/android/content/pm/IDataLoaderManager.aidl
+++ b/core/java/android/content/pm/IDataLoaderManager.aidl
@@ -23,8 +23,8 @@
 
 /** @hide */
 interface IDataLoaderManager {
-    boolean initializeDataLoader(int id, in DataLoaderParamsParcel params,
-            in FileSystemControlParcel control, IDataLoaderStatusListener listener);
+    boolean bindToDataLoader(int id, in DataLoaderParamsParcel params,
+            IDataLoaderStatusListener listener);
     IDataLoader getDataLoader(int dataLoaderId);
-    void destroyDataLoader(int dataLoaderId);
-}
\ No newline at end of file
+    void unbindFromDataLoader(int dataLoaderId);
+}
diff --git a/core/java/android/content/pm/IDataLoaderStatusListener.aidl b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
index ffe8b18..24a62c5 100644
--- a/core/java/android/content/pm/IDataLoaderStatusListener.aidl
+++ b/core/java/android/content/pm/IDataLoaderStatusListener.aidl
@@ -21,30 +21,30 @@
  * @hide
  */
 oneway interface IDataLoaderStatusListener {
-    /** When this status is returned from DataLoader, it means that the DataLoader
-    *   process is running, bound to and has handled onCreate(). */
-    const int DATA_LOADER_CREATED = 0;
-    /** Listener will receive this status when the DataLoader process died,
-    *   binder disconnected or class destroyed. */
-    const int DATA_LOADER_DESTROYED = 1;
+    /** The DataLoader process died, binder disconnected or class destroyed. */
+    const int DATA_LOADER_DESTROYED = 0;
+    /** DataLoader process is running and bound to. */
+    const int DATA_LOADER_BOUND = 1;
+    /** DataLoader has handled onCreate(). */
+    const int DATA_LOADER_CREATED = 2;
 
     /** DataLoader can receive missing pages and read pages notifications,
      *  and ready to provide data. */
-    const int DATA_LOADER_STARTED = 2;
+    const int DATA_LOADER_STARTED = 3;
     /** DataLoader no longer ready to provide data and is not receiving
     *   any notifications from IncFS. */
-    const int DATA_LOADER_STOPPED = 3;
+    const int DATA_LOADER_STOPPED = 4;
 
     /** DataLoader streamed everything necessary to continue installation. */
-    const int DATA_LOADER_IMAGE_READY = 4;
+    const int DATA_LOADER_IMAGE_READY = 5;
     /** Installation can't continue as DataLoader failed to stream necessary data. */
-    const int DATA_LOADER_IMAGE_NOT_READY = 5;
+    const int DATA_LOADER_IMAGE_NOT_READY = 6;
 
     /** DataLoader reports that this instance is invalid and can never be restored.
     *   Warning: this is a terminal status that data loader should use carefully and
     *            the system should almost never use - e.g. only if all recovery attempts
     *            fail and all retry limits are exceeded. */
-    const int DATA_LOADER_UNRECOVERABLE = 6;
+    const int DATA_LOADER_UNRECOVERABLE = 7;
 
     /** Data loader status callback */
     void onStatusChanged(in int dataLoaderId, in int status);
diff --git a/services/core/java/com/android/server/pm/DataLoaderManagerService.java b/services/core/java/com/android/server/pm/DataLoaderManagerService.java
index 062e9e1..dec3f1a 100644
--- a/services/core/java/com/android/server/pm/DataLoaderManagerService.java
+++ b/services/core/java/com/android/server/pm/DataLoaderManagerService.java
@@ -23,7 +23,6 @@
 import android.content.ServiceConnection;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.DataLoaderParamsParcel;
-import android.content.pm.FileSystemControlParcel;
 import android.content.pm.IDataLoader;
 import android.content.pm.IDataLoaderManager;
 import android.content.pm.IDataLoaderStatusListener;
@@ -35,11 +34,8 @@
 import android.util.Slog;
 import android.util.SparseArray;
 
-import com.android.internal.annotations.GuardedBy;
 import com.android.server.SystemService;
 
-import libcore.io.IoUtils;
-
 import java.util.List;
 
 /**
@@ -51,8 +47,6 @@
     private static final String TAG = "DataLoaderManager";
     private final Context mContext;
     private final DataLoaderManagerBinderService mBinderService;
-    private final Object mLock = new Object();
-    @GuardedBy("mLock")
     private SparseArray<DataLoaderServiceConnection> mServiceConnections = new SparseArray<>();
 
     public DataLoaderManagerService(Context context) {
@@ -66,52 +60,34 @@
         publishBinderService(Context.DATA_LOADER_MANAGER_SERVICE, mBinderService);
     }
 
-    private static void closeQuietly(FileSystemControlParcel control) {
-        if (control == null || control.incremental == null) {
-            return;
-        }
-        IoUtils.closeQuietly(control.incremental.cmd);
-        IoUtils.closeQuietly(control.incremental.pendingReads);
-        IoUtils.closeQuietly(control.incremental.log);
-    }
-
     final class DataLoaderManagerBinderService extends IDataLoaderManager.Stub {
         @Override
-        public boolean initializeDataLoader(int dataLoaderId, DataLoaderParamsParcel params,
-                FileSystemControlParcel control, IDataLoaderStatusListener listener) {
-            DataLoaderServiceConnection connection = null;
-            try {
-                synchronized (mLock) {
-                    if (mServiceConnections.get(dataLoaderId) != null) {
-                        Slog.e(TAG, "Data loader of ID=" + dataLoaderId + " already exists.");
-                        return false;
-                    }
+        public boolean bindToDataLoader(int dataLoaderId, DataLoaderParamsParcel params,
+                IDataLoaderStatusListener listener) {
+            synchronized (mServiceConnections) {
+                if (mServiceConnections.get(dataLoaderId) != null) {
+                    return true;
                 }
-                ComponentName componentName =
-                        new ComponentName(params.packageName, params.className);
-                ComponentName dataLoaderComponent = resolveDataLoaderComponentName(componentName);
-                if (dataLoaderComponent == null) {
-                    return false;
-                }
-                // Binds to the specific data loader service
-                connection =
-                        new DataLoaderServiceConnection(dataLoaderId, params,
-                                                        control, listener);
-                control = null; // now connection manages it
-                Intent intent = new Intent();
-                intent.setComponent(dataLoaderComponent);
-                if (!mContext.bindServiceAsUser(intent, connection, Context.BIND_AUTO_CREATE,
-                        UserHandle.of(UserHandle.getCallingUserId()))) {
-                    Slog.e(TAG, "Failed to bind to data loader binder service.");
-                    mContext.unbindService(connection);
-                    return false;
-                }
-                connection = null;
-            } finally {
-                DataLoaderManagerService.closeQuietly(control);
-                if (connection != null) {
-                    connection.close();
-                }
+            }
+            ComponentName componentName = new ComponentName(params.packageName, params.className);
+            ComponentName dataLoaderComponent = resolveDataLoaderComponentName(componentName);
+            if (dataLoaderComponent == null) {
+                Slog.e(TAG, "Invalid component: " + componentName + " for ID=" + dataLoaderId);
+                return false;
+            }
+
+            // Binds to the specific data loader service.
+            DataLoaderServiceConnection connection = new DataLoaderServiceConnection(dataLoaderId,
+                    listener);
+
+            Intent intent = new Intent();
+            intent.setComponent(dataLoaderComponent);
+            if (!mContext.bindServiceAsUser(intent, connection, Context.BIND_AUTO_CREATE,
+                    UserHandle.of(UserHandle.getCallingUserId()))) {
+                Slog.e(TAG,
+                        "Failed to bind to: " + dataLoaderComponent + " for ID=" + dataLoaderId);
+                mContext.unbindService(connection);
+                return false;
             }
             return true;
         }
@@ -169,7 +145,7 @@
          */
         @Override
         public @Nullable IDataLoader getDataLoader(int dataLoaderId) {
-            synchronized (mLock) {
+            synchronized (mServiceConnections) {
                 DataLoaderServiceConnection serviceConnection = mServiceConnections.get(
                         dataLoaderId, null);
                 if (serviceConnection == null) {
@@ -180,14 +156,14 @@
         }
 
         /**
-         * Destroys a data loader binder service, specified by its ID.
+         * Unbinds from a data loader binder service, specified by its ID. DataLoader will receive
+         * destroy notification.
          */
         @Override
-        public void destroyDataLoader(int dataLoaderId) {
-            synchronized (mLock) {
+        public void unbindFromDataLoader(int dataLoaderId) {
+            synchronized (mServiceConnections) {
                 DataLoaderServiceConnection serviceConnection = mServiceConnections.get(
                         dataLoaderId, null);
-
                 if (serviceConnection == null) {
                     return;
                 }
@@ -196,18 +172,13 @@
         }
     }
 
-    class DataLoaderServiceConnection implements ServiceConnection, AutoCloseable {
+    private class DataLoaderServiceConnection implements ServiceConnection {
         final int mId;
-        final DataLoaderParamsParcel mParams;
-        final FileSystemControlParcel mControl;
         final IDataLoaderStatusListener mListener;
         IDataLoader mDataLoader;
 
-        DataLoaderServiceConnection(int id, DataLoaderParamsParcel params,
-                FileSystemControlParcel control, IDataLoaderStatusListener listener) {
+        DataLoaderServiceConnection(int id, IDataLoaderStatusListener listener) {
             mId = id;
-            mParams = params;
-            mControl = control;
             mListener = listener;
             mDataLoader = null;
         }
@@ -215,44 +186,40 @@
         @Override
         public void onServiceConnected(ComponentName className, IBinder service) {
             mDataLoader = IDataLoader.Stub.asInterface(service);
-            synchronized (mLock) {
+            if (mDataLoader == null) {
+                onNullBinding(className);
+                return;
+            }
+            synchronized (mServiceConnections) {
+                if (mServiceConnections.get(mId) != null) {
+                    // Another connection already bound for this ID.
+                    mContext.unbindService(this);
+                    return;
+                }
                 mServiceConnections.append(mId, this);
             }
-            try {
-                mDataLoader.create(mId, mParams, mControl, mListener);
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to create data loader service.", e);
-            }
+            callListener(IDataLoaderStatusListener.DATA_LOADER_BOUND);
         }
 
         @Override
         public void onServiceDisconnected(ComponentName arg0) {
             Slog.i(TAG, "DataLoader " + mId + " disconnected, but will try to recover");
             callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED);
-            remove();
+            destroy();
         }
 
         @Override
         public void onBindingDied(ComponentName name) {
             Slog.i(TAG, "DataLoader " + mId + " died");
             callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED);
-            mContext.unbindService(this);
-            close();
-            remove();
+            destroy();
         }
 
         @Override
         public void onNullBinding(ComponentName name) {
             Slog.i(TAG, "DataLoader " + mId + " failed to start");
             callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED);
-            mContext.unbindService(this);
-            close();
-            remove();
-        }
-
-        @Override
-        public void close() {
-            DataLoaderManagerService.closeQuietly(mControl);
+            destroy();
         }
 
         IDataLoader getDataLoader() {
@@ -260,17 +227,19 @@
         }
 
         void destroy() {
-            try {
-                mDataLoader.destroy(mId);
-            } catch (RemoteException ignored) {
+            if (mDataLoader != null) {
+                try {
+                    mDataLoader.destroy(mId);
+                } catch (RemoteException ignored) {
+                }
+                mDataLoader = null;
             }
             mContext.unbindService(this);
-            close();
             remove();
         }
 
         private void remove() {
-            synchronized (mLock) {
+            synchronized (mServiceConnections) {
                 mServiceConnections.remove(mId);
             }
         }
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 6b1ef3a..8e7eaf6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -2601,8 +2601,9 @@
                     "Failed to find data loader manager service");
         }
 
+        final DataLoaderParams params = this.params.dataLoaderParams;
         final boolean manualStartAndDestroy = !isIncrementalInstallation();
-        IDataLoaderStatusListener listener = new IDataLoaderStatusListener.Stub() {
+        final IDataLoaderStatusListener listener = new IDataLoaderStatusListener.Stub() {
             @Override
             public void onStatusChanged(int dataLoaderId, int status) {
                 switch (status) {
@@ -2629,6 +2630,15 @@
                     }
 
                     switch (status) {
+                        case IDataLoaderStatusListener.DATA_LOADER_BOUND: {
+                            if (manualStartAndDestroy) {
+                                FileSystemControlParcel control = new FileSystemControlParcel();
+                                control.callback = new FileSystemConnector(addedFiles);
+                                dataLoader.create(dataLoaderId, params.getData(), control, this);
+                            }
+
+                            break;
+                        }
                         case IDataLoaderStatusListener.DATA_LOADER_CREATED: {
                             if (manualStartAndDestroy) {
                                 // IncrementalFileStorages will call start after all files are
@@ -2680,8 +2690,8 @@
 
         if (!manualStartAndDestroy) {
             try {
-                mIncrementalFileStorages = IncrementalFileStorages.initialize(mContext,
-                        stageDir, params.dataLoaderParams, listener, addedFiles);
+                mIncrementalFileStorages = IncrementalFileStorages.initialize(mContext, stageDir,
+                        params, listener, addedFiles);
                 return false;
             } catch (IOException e) {
                 throw new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE, e.getMessage(),
@@ -2689,13 +2699,8 @@
             }
         }
 
-        final FileSystemConnector connector = new FileSystemConnector(addedFiles);
-        final FileSystemControlParcel control = new FileSystemControlParcel();
-        control.callback = connector;
-
-        final DataLoaderParams params = this.params.dataLoaderParams;
-        if (!dataLoaderManager.initializeDataLoader(
-                sessionId, params.getData(), control, listener)) {
+        if (!dataLoaderManager.bindToDataLoader(
+                sessionId, params.getData(), listener)) {
             throw new PackageManagerException(INSTALL_FAILED_MEDIA_UNAVAILABLE,
                     "Failed to initialize data loader");
         }
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index a6c45cc..a1b4f24 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -1709,12 +1709,30 @@
                                        [this, status] { return mCurrentStatus == status; });
 }
 
+bool IncrementalService::DataLoaderStub::bind() {
+    bool result = false;
+    auto status = mService.mDataLoaderManager->bindToDataLoader(mId, mParams, this, &result);
+    if (!status.isOk() || !result) {
+        LOG(ERROR) << "Failed to bind a data loader for mount " << mId;
+        return false;
+    }
+    return true;
+}
+
 bool IncrementalService::DataLoaderStub::create() {
-    bool created = false;
-    auto status = mService.mDataLoaderManager->initializeDataLoader(mId, mParams, mControl, this,
-                                                                    &created);
-    if (!status.isOk() || !created) {
-        LOG(ERROR) << "Failed to create a data loader for mount " << mId;
+    sp<IDataLoader> dataloader;
+    auto status = mService.mDataLoaderManager->getDataLoader(mId, &dataloader);
+    if (!status.isOk()) {
+        LOG(ERROR) << "Failed to get dataloader: " << status.toString8();
+        return false;
+    }
+    if (!dataloader) {
+        LOG(ERROR) << "DataLoader is null: " << status.toString8();
+        return false;
+    }
+    status = dataloader->create(mId, mParams, mControl, this);
+    if (!status.isOk()) {
+        LOG(ERROR) << "Failed to start DataLoader: " << status.toString8();
         return false;
     }
     return true;
@@ -1740,7 +1758,7 @@
 }
 
 bool IncrementalService::DataLoaderStub::destroy() {
-    mService.mDataLoaderManager->destroyDataLoader(mId);
+    mService.mDataLoaderManager->unbindFromDataLoader(mId);
     return true;
 }
 
@@ -1776,6 +1794,8 @@
         case IDataLoaderStatusListener::DATA_LOADER_CREATED:
             switch (currentStatus) {
                 case IDataLoaderStatusListener::DATA_LOADER_DESTROYED:
+                    return bind();
+                case IDataLoaderStatusListener::DATA_LOADER_BOUND:
                     return create();
             }
             break;
diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h
index 0a18e21..1de0070 100644
--- a/services/incremental/IncrementalService.h
+++ b/services/incremental/IncrementalService.h
@@ -180,6 +180,7 @@
 
         bool isValid() const { return mId != kInvalidStorageId; }
 
+        bool bind();
         bool create();
         bool start();
         bool destroy();
diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp
index 1e8c3a1..85f7441 100644
--- a/services/incremental/ServiceWrappers.cpp
+++ b/services/incremental/ServiceWrappers.cpp
@@ -65,19 +65,18 @@
     RealDataLoaderManager(sp<content::pm::IDataLoaderManager> manager)
           : mInterface(std::move(manager)) {}
     ~RealDataLoaderManager() = default;
-    binder::Status initializeDataLoader(MountId mountId,
-                                        const content::pm::DataLoaderParamsParcel& params,
-                                        const content::pm::FileSystemControlParcel& control,
-                                        const sp<content::pm::IDataLoaderStatusListener>& listener,
-                                        bool* _aidl_return) const final {
-        return mInterface->initializeDataLoader(mountId, params, control, listener, _aidl_return);
+    binder::Status bindToDataLoader(MountId mountId,
+                                    const content::pm::DataLoaderParamsParcel& params,
+                                    const sp<content::pm::IDataLoaderStatusListener>& listener,
+                                    bool* _aidl_return) const final {
+        return mInterface->bindToDataLoader(mountId, params, listener, _aidl_return);
     }
     binder::Status getDataLoader(MountId mountId,
                                  sp<content::pm::IDataLoader>* _aidl_return) const final {
         return mInterface->getDataLoader(mountId, _aidl_return);
     }
-    binder::Status destroyDataLoader(MountId mountId) const final {
-        return mInterface->destroyDataLoader(mountId);
+    binder::Status unbindFromDataLoader(MountId mountId) const final {
+        return mInterface->unbindFromDataLoader(mountId);
     }
 
 private:
diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h
index 6b0f59e..3792830 100644
--- a/services/incremental/ServiceWrappers.h
+++ b/services/incremental/ServiceWrappers.h
@@ -55,13 +55,12 @@
 class DataLoaderManagerWrapper {
 public:
     virtual ~DataLoaderManagerWrapper() = default;
-    virtual binder::Status initializeDataLoader(
+    virtual binder::Status bindToDataLoader(
             MountId mountId, const content::pm::DataLoaderParamsParcel& params,
-            const content::pm::FileSystemControlParcel& control,
             const sp<content::pm::IDataLoaderStatusListener>& listener, bool* result) const = 0;
     virtual binder::Status getDataLoader(MountId mountId,
                                          sp<content::pm::IDataLoader>* result) const = 0;
-    virtual binder::Status destroyDataLoader(MountId mountId) const = 0;
+    virtual binder::Status unbindFromDataLoader(MountId mountId) const = 0;
 };
 
 class IncFsWrapper {
diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp
index 7a85602..2205bfe 100644
--- a/services/incremental/test/IncrementalServiceTest.cpp
+++ b/services/incremental/test/IncrementalServiceTest.cpp
@@ -131,18 +131,19 @@
                 .WillByDefault(Invoke(this, &MockDataLoader::createOkNoStatus));
     }
 
-    binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel&,
-                            const content::pm::FileSystemControlParcel&,
+    binder::Status createOk(int32_t id, const content::pm::DataLoaderParamsParcel& params,
+                            const content::pm::FileSystemControlParcel& control,
                             const sp<content::pm::IDataLoaderStatusListener>& listener) {
-        mListener = listener;
+        createOkNoStatus(id, params, control, listener);
         if (mListener) {
             mListener->onStatusChanged(id, IDataLoaderStatusListener::DATA_LOADER_CREATED);
         }
         return binder::Status::ok();
     }
-    binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel&,
-                                    const content::pm::FileSystemControlParcel&,
+    binder::Status createOkNoStatus(int32_t id, const content::pm::DataLoaderParamsParcel& params,
+                                    const content::pm::FileSystemControlParcel& control,
                                     const sp<content::pm::IDataLoaderStatusListener>& listener) {
+        mServiceConnector = control.service;
         mListener = listener;
         return binder::Status::ok();
     }
@@ -173,8 +174,15 @@
         }
         return binder::Status::ok();
     }
+    int32_t setStorageParams(bool enableReadLogs) {
+        int32_t result = -1;
+        EXPECT_NE(mServiceConnector.get(), nullptr);
+        EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
+        return result;
+    }
 
 private:
+    sp<IIncrementalServiceConnector> mServiceConnector;
     sp<IDataLoaderStatusListener> mListener;
 };
 
@@ -184,21 +192,20 @@
         EXPECT_TRUE(mDataLoaderHolder != nullptr);
     }
 
-    MOCK_CONST_METHOD5(initializeDataLoader,
+    MOCK_CONST_METHOD4(bindToDataLoader,
                        binder::Status(int32_t mountId, const DataLoaderParamsParcel& params,
-                                      const FileSystemControlParcel& control,
                                       const sp<IDataLoaderStatusListener>& listener,
                                       bool* _aidl_return));
     MOCK_CONST_METHOD2(getDataLoader,
                        binder::Status(int32_t mountId, sp<IDataLoader>* _aidl_return));
-    MOCK_CONST_METHOD1(destroyDataLoader, binder::Status(int32_t mountId));
+    MOCK_CONST_METHOD1(unbindFromDataLoader, binder::Status(int32_t mountId));
 
-    void initializeDataLoaderSuccess() {
-        ON_CALL(*this, initializeDataLoader(_, _, _, _, _))
-                .WillByDefault(Invoke(this, &MockDataLoaderManager::initializeDataLoaderOk));
+    void bindToDataLoaderSuccess() {
+        ON_CALL(*this, bindToDataLoader(_, _, _, _))
+                .WillByDefault(Invoke(this, &MockDataLoaderManager::bindToDataLoaderOk));
     }
-    void initializeDataLoaderFails() {
-        ON_CALL(*this, initializeDataLoader(_, _, _, _, _))
+    void bindToDataLoaderFails() {
+        ON_CALL(*this, bindToDataLoader(_, _, _, _))
                 .WillByDefault(Return(
                         (binder::Status::fromExceptionCode(1, String8("failed to prepare")))));
     }
@@ -206,20 +213,21 @@
         ON_CALL(*this, getDataLoader(_, _))
                 .WillByDefault(Invoke(this, &MockDataLoaderManager::getDataLoaderOk));
     }
-    void destroyDataLoaderSuccess() {
-        ON_CALL(*this, destroyDataLoader(_))
-                .WillByDefault(Invoke(this, &MockDataLoaderManager::destroyDataLoaderOk));
+    void unbindFromDataLoaderSuccess() {
+        ON_CALL(*this, unbindFromDataLoader(_))
+                .WillByDefault(Invoke(this, &MockDataLoaderManager::unbindFromDataLoaderOk));
     }
-    binder::Status initializeDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
-                                          const FileSystemControlParcel& control,
-                                          const sp<IDataLoaderStatusListener>& listener,
-                                          bool* _aidl_return) {
+    binder::Status bindToDataLoaderOk(int32_t mountId, const DataLoaderParamsParcel& params,
+                                      const sp<IDataLoaderStatusListener>& listener,
+                                      bool* _aidl_return) {
         mId = mountId;
         mListener = listener;
-        mServiceConnector = control.service;
         mDataLoader = mDataLoaderHolder;
         *_aidl_return = true;
-        return mDataLoader->create(mountId, params, control, listener);
+        if (mListener) {
+            mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_BOUND);
+        }
+        return binder::Status::ok();
     }
     binder::Status getDataLoaderOk(int32_t mountId, sp<IDataLoader>* _aidl_return) {
         *_aidl_return = mDataLoader;
@@ -234,7 +242,7 @@
     void setDataLoaderStatusDestroyed() {
         mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED);
     }
-    binder::Status destroyDataLoaderOk(int32_t id) {
+    binder::Status unbindFromDataLoaderOk(int32_t id) {
         if (mDataLoader) {
             if (auto status = mDataLoader->destroy(id); !status.isOk()) {
                 return status;
@@ -246,17 +254,10 @@
         }
         return binder::Status::ok();
     }
-    int32_t setStorageParams(bool enableReadLogs) {
-        int32_t result = -1;
-        EXPECT_NE(mServiceConnector.get(), nullptr);
-        EXPECT_TRUE(mServiceConnector->setStorageParams(enableReadLogs, &result).isOk());
-        return result;
-    }
 
 private:
     int mId;
     sp<IDataLoaderStatusListener> mListener;
-    sp<IIncrementalServiceConnector> mServiceConnector;
     sp<IDataLoader> mDataLoader;
     sp<IDataLoader> mDataLoaderHolder;
 };
@@ -403,7 +404,7 @@
                                                      mRootDir.path);
         mDataLoaderParcel.packageName = "com.test";
         mDataLoaderParcel.arguments = "uri";
-        mDataLoaderManager->destroyDataLoaderSuccess();
+        mDataLoaderManager->unbindFromDataLoaderSuccess();
         mIncrementalService->onSystemReady();
     }
 
@@ -442,7 +443,7 @@
 
 TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsFails) {
     mVold->mountIncFsFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
     TemporaryDir tempDir;
     int storageId =
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
@@ -452,8 +453,8 @@
 
 TEST_F(IncrementalServiceTest, testCreateStorageMountIncFsInvalidControlParcel) {
     mVold->mountIncFsInvalidControlParcel();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     TemporaryDir tempDir;
     int storageId =
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
@@ -464,8 +465,8 @@
 TEST_F(IncrementalServiceTest, testCreateStorageMakeFileFails) {
     mVold->mountIncFsSuccess();
     mIncFs->makeFileFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     EXPECT_CALL(*mVold, unmountIncFs(_));
     TemporaryDir tempDir;
     int storageId =
@@ -478,8 +479,8 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(0);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(0);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     EXPECT_CALL(*mVold, unmountIncFs(_));
     TemporaryDir tempDir;
     int storageId =
@@ -492,9 +493,9 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderFails();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(1);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(0);
+    mDataLoaderManager->bindToDataLoaderFails();
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(0);
     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(0);
     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
     EXPECT_CALL(*mDataLoader, destroy(_)).Times(0);
@@ -510,9 +511,10 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(1);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1);
+    mDataLoaderManager->bindToDataLoaderSuccess();
+    mDataLoaderManager->getDataLoaderSuccess();
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
@@ -529,10 +531,10 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(2);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(2);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
     EXPECT_CALL(*mDataLoader, start(_)).Times(0);
     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
@@ -551,10 +553,10 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mDataLoader->initializeCreateOkNoStatus();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(1);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1);
     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
@@ -574,10 +576,10 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mDataLoader->initializeCreateOkNoStatus();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
-    EXPECT_CALL(*mDataLoaderManager, initializeDataLoader(_, _, _, _, _)).Times(2);
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1);
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1);
     EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2);
     EXPECT_CALL(*mDataLoader, start(_)).Times(1);
     EXPECT_CALL(*mDataLoader, destroy(_)).Times(1);
@@ -596,10 +598,10 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mVold->setIncFsMountOptionsSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // We are calling setIncFsMountOptions(true).
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
@@ -612,7 +614,7 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_GE(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_GE(mDataLoader->setStorageParams(true), 0);
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccessAndPermissionChanged) {
@@ -620,11 +622,11 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mVold->setIncFsMountOptionsSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionSuccess();
     mAppOpsManager->initializeStartWatchingMode();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // We are calling setIncFsMountOptions(true).
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
@@ -639,7 +641,7 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_GE(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_GE(mDataLoader->setStorageParams(true), 0);
     ASSERT_NE(nullptr, mAppOpsManager->mStoredCallback.get());
     mAppOpsManager->mStoredCallback->opChanged(0, {});
 }
@@ -648,10 +650,10 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionFails();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // checkPermission fails, no calls to set opitions,  start or stop WatchingMode.
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(0);
@@ -662,7 +664,7 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_LT(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_LT(mDataLoader->setStorageParams(true), 0);
 }
 
 TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsFails) {
@@ -670,10 +672,10 @@
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
     mVold->setIncFsMountOptionsFails();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     mAppOpsManager->checkPermissionSuccess();
-    EXPECT_CALL(*mDataLoaderManager, destroyDataLoader(_));
+    EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_));
     EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2);
     // We are calling setIncFsMountOptions.
     EXPECT_CALL(*mVold, setIncFsMountOptions(_, true)).Times(1);
@@ -685,14 +687,14 @@
             mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {},
                                                IncrementalService::CreateOptions::CreateNew);
     ASSERT_GE(storageId, 0);
-    ASSERT_LT(mDataLoaderManager->setStorageParams(true), 0);
+    ASSERT_LT(mDataLoader->setStorageParams(true), 0);
 }
 
 TEST_F(IncrementalServiceTest, testMakeDirectory) {
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     TemporaryDir tempDir;
     int storageId =
@@ -716,7 +718,7 @@
     mVold->mountIncFsSuccess();
     mIncFs->makeFileSuccess();
     mVold->bindMountSuccess();
-    mDataLoaderManager->initializeDataLoaderSuccess();
+    mDataLoaderManager->bindToDataLoaderSuccess();
     mDataLoaderManager->getDataLoaderSuccess();
     TemporaryDir tempDir;
     int storageId =