[pm] cleanup unused PackageManagerInternal APIs for loading progress

Launcher gets loading progress from LauncherActivityInfo directly and
does not need to use the listener. Removing unused methods, plus a bit
of code cleanup.

BUG: 175135603
Test: atest CtsInstalledLoadingProgressHostTests
Test: atest FrameworksServicesTests:com.android.server.pm.IncrementalStatesTest
Change-Id: Icf96f5ca23e567396cfc233725619ba91a953c97
This commit is contained in:
Songchun Fan
2021-02-04 22:48:27 +00:00
parent 8277f84911
commit 2299382fe2
8 changed files with 25 additions and 157 deletions

View File

@@ -304,20 +304,16 @@ public final class IncrementalManager {
}
/**
* Called when a callback wants to stop listen to the loading progress of an installed package.
* Decrease the count of the callbacks on the associated to the corresponding storage.
* If the count becomes zero, unregister the storage listener.
* Called to stop all listeners from listening to loading progress of an installed package.
* @param codePath Path of the installed package
* @return True if the package name and associated storage id are valid. False otherwise.
*/
public boolean unregisterLoadingProgressCallback(@NonNull String codePath,
@NonNull IPackageLoadingProgressCallback callback) {
public void unregisterLoadingProgressCallbacks(@NonNull String codePath) {
final IncrementalStorage storage = openStorage(codePath);
if (storage == null) {
// storage does not exist, package not installed
return false;
return;
}
return mLoadingProgressCallbacks.unregisterCallback(storage, callback);
mLoadingProgressCallbacks.cleanUpCallbacks(storage);
}
private static class LoadingProgressCallbacks extends IStorageLoadingProgressListener.Stub {
@@ -325,7 +321,6 @@ public final class IncrementalManager {
private final SparseArray<RemoteCallbackList<IPackageLoadingProgressCallback>> mCallbacks =
new SparseArray<>();
// TODO(b/165841827): disable callbacks when app state changes to fully loaded
public void cleanUpCallbacks(@NonNull IncrementalStorage storage) {
final int storageId = storage.getId();
final RemoteCallbackList<IPackageLoadingProgressCallback> callbacksForStorage;

View File

@@ -996,28 +996,6 @@ public abstract class PackageManagerInternal {
*/
public abstract boolean isSuspendingAnyPackages(String suspendingPackage, int userId);
/**
* Register to listen for loading progress of an installed package.
* @param packageName The name of the installed package
* @param callback To loading reporting progress
* @param userId The user under which to check.
* @return Whether the registration was successful. It can fail if the package has not been
* installed yet.
*/
public abstract boolean registerInstalledLoadingProgressCallback(@NonNull String packageName,
@NonNull InstalledLoadingProgressCallback callback, int userId);
/**
* Unregister to stop listening to loading progress of an installed package
* @param packageName The name of the installed package
* @param callback To unregister
* @return True if the callback is removed from registered callback list. False is the callback
* does not exist on the registered callback list, which can happen if the callback has
* already been unregistered.
*/
public abstract boolean unregisterInstalledLoadingProgressCallback(@NonNull String packageName,
@NonNull InstalledLoadingProgressCallback callback);
/**
* Returns the string representation of a known package. For example,
* {@link #PACKAGE_SETUP_WIZARD} is represented by the string Setup Wizard.

View File

@@ -248,24 +248,6 @@ public final class IncrementalStates {
}
}
/**
* @return the current startable state.
*/
public boolean isStartable() {
synchronized (mLock) {
return mStartableState.isStartable();
}
}
/**
* @return Whether the package is still being loaded or has been fully loaded.
*/
public boolean isLoading() {
synchronized (mLock) {
return mLoadingState.isLoading();
}
}
/**
* @return all current states in a Parcelable.
*/

View File

@@ -1316,10 +1316,6 @@ public class LauncherAppsService extends SystemService {
} finally {
mListeners.finishBroadcast();
}
PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
pmi.registerInstalledLoadingProgressCallback(packageName,
new PackageLoadingProgressCallback(packageName, user),
user.getIdentifier());
super.onPackageAdded(packageName, uid);
}
@@ -1542,38 +1538,5 @@ public class LauncherAppsService extends SystemService {
checkCallbackCount();
}
}
class PackageLoadingProgressCallback extends
PackageManagerInternal.InstalledLoadingProgressCallback {
private String mPackageName;
private UserHandle mUser;
PackageLoadingProgressCallback(String packageName, UserHandle user) {
super(mCallbackHandler);
mPackageName = packageName;
mUser = user;
}
@Override
public void onLoadingProgressChanged(float progress) {
final int n = mListeners.beginBroadcast();
try {
for (int i = 0; i < n; i++) {
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
BroadcastCookie cookie = (BroadcastCookie) mListeners.getBroadcastCookie(i);
if (!isEnabledProfileOf(cookie.user, mUser, "onLoadingProgressChanged")) {
continue;
}
try {
listener.onPackageLoadingProgressChanged(mUser, mPackageName, progress);
} catch (RemoteException re) {
Slog.d(TAG, "Callback failed ", re);
}
}
} finally {
mListeners.finishBroadcast();
}
}
}
}
}

View File

@@ -24,7 +24,6 @@ import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.content.Intent.ACTION_MAIN;
import static android.content.Intent.CATEGORY_BROWSABLE;
import static android.content.Intent.CATEGORY_DEFAULT;
import static android.content.Intent.CATEGORY_HOME;
import static android.content.Intent.EXTRA_LONG_VERSION_CODE;
@@ -68,11 +67,7 @@ import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_RESTORE;
import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP;
import static android.content.pm.PackageManager.INSTALL_STAGED;
import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
import static android.content.pm.PackageManager.MATCH_ALL;
import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.content.pm.PackageManager.MATCH_APEX;
@@ -377,11 +372,6 @@ import com.android.server.pm.dex.DexManager;
import com.android.server.pm.dex.DexoptOptions;
import com.android.server.pm.dex.PackageDexUsage;
import com.android.server.pm.dex.ViewCompiler;
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.DomainVerificationService;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2;
import com.android.server.pm.parsing.PackageCacher;
import com.android.server.pm.parsing.PackageInfoUtils;
import com.android.server.pm.parsing.PackageParser2;
@@ -395,6 +385,11 @@ import com.android.server.pm.permission.LegacyPermissionManagerService;
import com.android.server.pm.permission.Permission;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.DomainVerificationService;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxy;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1;
import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2;
import com.android.server.rollback.RollbackManagerInternal;
import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
@@ -404,7 +399,6 @@ import com.android.server.utils.Watchable;
import com.android.server.utils.Watched;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedSparseBooleanArray;
import com.android.server.utils.WatchedSparseIntArray;
import com.android.server.utils.Watcher;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -466,7 +460,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
/**
* Keep track of all those APKs everywhere.
@@ -19166,6 +19159,8 @@ public class PackageManagerService extends IPackageManager.Stub
extras, 0 /*flags*/,
null /*targetPackage*/, null /*finishedReceiver*/,
mInstalledUserIds, null /* instantUserIds */, newBroadcastAllowList, null);
// Unregister progress listener
mIncrementalManager.unregisterLoadingProgressCallbacks(codePath);
// Unregister health listener as it will always be healthy from now
mIncrementalManager.unregisterHealthListener(codePath);
}
@@ -27042,47 +27037,6 @@ public class PackageManagerService extends IPackageManager.Stub
return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId);
}
@Override
public boolean registerInstalledLoadingProgressCallback(String packageName,
PackageManagerInternal.InstalledLoadingProgressCallback callback, int userId) {
final PackageSetting ps = getPackageSettingForUser(packageName, Binder.getCallingUid(),
userId);
if (ps == null) {
return false;
}
if (!ps.isPackageLoading()) {
Slog.w(TAG,
"Failed registering loading progress callback. Package is fully loaded.");
return false;
}
if (mIncrementalManager == null) {
Slog.w(TAG,
"Failed registering loading progress callback. Incremental is not enabled");
return false;
}
return mIncrementalManager.registerLoadingProgressCallback(ps.getPathString(),
(IPackageLoadingProgressCallback) callback.getBinder());
}
@Override
public boolean unregisterInstalledLoadingProgressCallback(String packageName,
PackageManagerInternal.InstalledLoadingProgressCallback callback) {
final PackageSetting ps;
synchronized (mLock) {
ps = mSettings.getPackageLPr(packageName);
if (ps == null) {
Slog.w(TAG, "Failed unregistering loading progress callback. Package "
+ packageName + " is not installed");
return false;
}
}
if (mIncrementalManager == null) {
return false;
}
return mIncrementalManager.unregisterLoadingProgressCallback(ps.getPathString(),
(IPackageLoadingProgressCallback) callback.getBinder());
}
@Override
public IncrementalStatesInfo getIncrementalStatesInfo(
@NonNull String packageName, int filterCallingUid, int userId) {

View File

@@ -344,8 +344,8 @@ public class PackageSetting extends PackageSettingBase {
installSource.originatingPackageName);
proto.end(sourceToken);
}
proto.write(PackageProto.StatesProto.IS_STARTABLE, incrementalStates.isStartable());
proto.write(PackageProto.StatesProto.IS_LOADING, incrementalStates.isLoading());
proto.write(PackageProto.StatesProto.IS_STARTABLE, isPackageStartable());
proto.write(PackageProto.StatesProto.IS_LOADING, isPackageLoading());
writeUsersInfoToProto(proto, PackageProto.USERS);
writePackageUserPermissionsProto(proto, PackageProto.USER_PERMISSIONS, users, dataProvider);
proto.end(packageToken);

View File

@@ -26,8 +26,6 @@ import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.IncrementalStatesInfo;
import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.UninstallReason;
import android.content.pm.PackageParser;
import android.content.pm.PackageUserState;
@@ -42,8 +40,6 @@ import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.DomainVerificationService;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import java.io.File;
@@ -731,14 +727,14 @@ public abstract class PackageSettingBase extends SettingBase {
* @return True if package is startable, false otherwise.
*/
public boolean isPackageStartable() {
return incrementalStates.isStartable();
return getIncrementalStates().isStartable();
}
/**
* @return True if package is still being loaded, false if the package is fully loaded.
*/
public boolean isPackageLoading() {
return incrementalStates.isLoading();
return getIncrementalStates().isLoading();
}
/**

View File

@@ -71,12 +71,12 @@ public class IncrementalStatesTest {
@Before
public void setUp() {
mIncrementalStates = new IncrementalStates();
assertFalse(mIncrementalStates.isStartable());
assertFalse(mIncrementalStates.getIncrementalStatesInfo().isStartable());
mIncrementalStates.setCallback(mCallback);
mIncrementalStates.onCommit(true);
// Test that package is now startable and loading
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.isLoading());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isLoading());
mUnstartableCalled.close();
mFullyLoadedCalled.close();
}
@@ -90,7 +90,7 @@ public class IncrementalStatesTest {
IStorageHealthListener.HEALTH_STATUS_UNHEALTHY);
// Test that package is still startable
assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
assertEquals(PackageManager.UNSTARTABLE_REASON_UNKNOWN, mUnstartableReason.get());
}
@@ -104,7 +104,7 @@ public class IncrementalStatesTest {
IStorageHealthListener.HEALTH_STATUS_READS_PENDING);
// Test that package is still startable
assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
}
/**
@@ -116,7 +116,7 @@ public class IncrementalStatesTest {
IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_STORAGE);
// Test that package is still startable
assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
assertEquals(PackageManager.UNSTARTABLE_REASON_UNKNOWN,
mUnstartableReason.get());
}
@@ -130,7 +130,7 @@ public class IncrementalStatesTest {
IStorageHealthListener.HEALTH_STATUS_UNHEALTHY_TRANSPORT);
// Test that package is still startable
assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
assertEquals(PackageManager.UNSTARTABLE_REASON_UNKNOWN,
mUnstartableReason.get());
}
@@ -145,12 +145,12 @@ public class IncrementalStatesTest {
mIncrementalStates.setProgress(1.0f);
// Test that package is now fully loaded
assertTrue(mFullyLoadedCalled.block(WAIT_TIMEOUT_MILLIS));
assertFalse(mIncrementalStates.isLoading());
assertFalse(mIncrementalStates.getIncrementalStatesInfo().isLoading());
mIncrementalStates.onStorageHealthStatusChanged(
IStorageHealthListener.HEALTH_STATUS_UNHEALTHY);
// Test that package is still startable
assertFalse(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS));
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
}
/**
@@ -159,6 +159,6 @@ public class IncrementalStatesTest {
@Test
public void testStartableTransition_AppCrashOrAnr() {
mIncrementalStates.onCrashOrAnr();
assertTrue(mIncrementalStates.isStartable());
assertTrue(mIncrementalStates.getIncrementalStatesInfo().isStartable());
}
}