From e98e2cbdca8889275b5d2707407d38659083e506 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Mon, 1 Mar 2021 20:11:02 -0800 Subject: [PATCH] Correct rebind to DataLoader after crash/death. Bug: 180970738 Test: PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest PackageManagerServiceTest ChecksumsTest Change-Id: I79ef37a69f15774bc92bdfb8eed9b6a98ad24161 --- .../server/pm/DataLoaderManagerService.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/pm/DataLoaderManagerService.java b/services/core/java/com/android/server/pm/DataLoaderManagerService.java index 9a9b14c313148..b34611b9cd6f4 100644 --- a/services/core/java/com/android/server/pm/DataLoaderManagerService.java +++ b/services/core/java/com/android/server/pm/DataLoaderManagerService.java @@ -207,35 +207,37 @@ public class DataLoaderManagerService extends SystemService { @Override public void onServiceDisconnected(ComponentName arg0) { Slog.i(TAG, "DataLoader " + mId + " disconnected, but will try to recover"); - callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - destroy(); + unbindAndReportDestroyed(); } @Override public void onBindingDied(ComponentName name) { Slog.i(TAG, "DataLoader " + mId + " died"); - callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - destroy(); + unbindAndReportDestroyed(); } @Override public void onNullBinding(ComponentName name) { Slog.i(TAG, "DataLoader " + mId + " failed to start"); - callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - destroy(); + unbindAndReportDestroyed(); } @Override public void binderDied() { Slog.i(TAG, "DataLoader " + mId + " died"); - callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); - destroy(); + unbindAndReportDestroyed(); } IDataLoader getDataLoader() { return mDataLoader; } + private void unbindAndReportDestroyed() { + if (unbind()) { + callListener(IDataLoaderStatusListener.DATA_LOADER_DESTROYED); + } + } + void destroy() { if (mDataLoader != null) { try { @@ -244,11 +246,15 @@ public class DataLoaderManagerService extends SystemService { } mDataLoader = null; } + unbind(); + } + + boolean unbind() { try { mContext.unbindService(this); } catch (Exception ignored) { } - remove(); + return remove(); } private boolean append() { @@ -266,12 +272,14 @@ public class DataLoaderManagerService extends SystemService { } } - private void remove() { + private boolean remove() { synchronized (mServiceConnections) { if (mServiceConnections.get(mId) == this) { mServiceConnections.remove(mId); + return true; } } + return false; } private void callListener(int status) {