Inject more dependencies in PackageManagerService

We're now using the injector for the majority of constructor
dependencies.

This change is part of a larger effort to break PackageManagerService
from directly instantiating its dependencies and to avoid using static
service providers, factories and getInstance methods in favor of
a mockable injector and provider / wrapper classes.

Test: device boots and runs as expected; this change doesn't change any behavior
Bug: 169360984
Change-Id: Ife7a052defa6f16482751b330febc1074a4d2489
This commit is contained in:
Patrick Baumann
2020-10-13 13:34:36 -07:00
parent ab09038cd3
commit 14fe676110
2 changed files with 234 additions and 185 deletions

View File

@@ -506,9 +506,6 @@ public class PackageManagerService extends IPackageManager.Stub
private static final boolean HIDE_EPHEMERAL_APIS = false;
private static final boolean ENABLE_FREE_CACHE_V2 =
SystemProperties.getBoolean("fw.free_cache_v2", true);
private static final String PRECOMPILE_LAYOUTS = "pm.precompile_layouts";
private static final int RADIO_UID = Process.PHONE_UID;
@@ -738,8 +735,9 @@ public class PackageManagerService extends IPackageManager.Stub
private final ProcessLoggingHandler mProcessLoggingHandler;
final int mSdkVersion = Build.VERSION.SDK_INT;
private final boolean mEnableFreeCacheV2;
final int mSdkVersion;
final Context mContext;
final boolean mFactoryTest;
final boolean mOnlyCore;
@@ -894,24 +892,8 @@ public class PackageManagerService extends IPackageManager.Stub
T produce(Injector injector, PackageManagerService packageManager);
}
static class LocalServicesProducer<T> implements Producer<T> {
private final Class<T> mProducingClass;
LocalServicesProducer(Class<T> clazz) {
this.mProducingClass = clazz;
}
public T produce(Injector injector, PackageManagerService packageManager) {
return LocalServices.getService(mProducingClass);
}
}
static class SystemServiceProducer<T> implements Producer<T> {
private final Class<T> mProducingClass;
SystemServiceProducer(Class<T> clazz) {
this.mProducingClass = clazz;
}
public T produce(Injector injector, PackageManagerService packageManager) {
return packageManager.mContext.getSystemService(mProducingClass);
}
interface ServiceProducer {
<T> T produce(Class<T> c);
}
@VisibleForTesting(visibility = Visibility.PRIVATE)
@@ -941,41 +923,43 @@ public class PackageManagerService extends IPackageManager.Stub
// ----- producers -----
private final Singleton<ComponentResolver> mComponentResolverProducer;
private final Singleton<PermissionManagerServiceInternal> mPermissionManagerProducer;
private final Singleton<PermissionManagerServiceInternal> mPermissionManagerServiceProducer;
private final Singleton<UserManagerService> mUserManagerProducer;
private final Singleton<Settings> mSettingsProducer;
private final Singleton<ActivityTaskManagerInternal> mActivityTaskManagerProducer;
private final Singleton<ActivityManagerInternal> mActivityManagerInternalProducer;
private final Singleton<DeviceIdleInternal> mLocalDeviceIdleController;
private final Singleton<StorageManagerInternal> mStorageManagerInternalProducer;
private final Singleton<NetworkPolicyManagerInternal> mNetworkPolicyManagerProducer;
private final Singleton<PermissionPolicyInternal> mPermissionPolicyProducer;
private final Singleton<DeviceStorageMonitorInternal> mDeviceStorageMonitorProducer;
private final Singleton<DisplayManager> mDisplayManagerProducer;
private final Singleton<StorageManager> mStorageManagerProducer;
private final Singleton<AppOpsManager> mAppOpsManagerProducer;
private final Singleton<AppsFilter> mAppsFilterProducer;
private final Singleton<PlatformCompat> mPlatformCompatProducer;
private final Singleton<SystemConfig> mSystemConfigProducer;
private final Singleton<PackageDexOptimizer> mPackageDexOptimizerProducer;
private final Singleton<DexManager> mDexManagerProducer;
private final Singleton<ArtManagerService> mArtManagerServiceProducer;
private final Singleton<ApexManager> mApexManagerProducer;
private final Singleton<ViewCompiler> mViewCompilerProducer;
private final Singleton<IPermissionManager> mPermissionManagerProducer;
private final Singleton<IncrementalManager> mIncrementalManagerProducer;
private final SystemWrapper mSystemWrapper;
private final ServiceProducer mGetLocalServiceProducer;
private final ServiceProducer mGetSystemServiceProducer;
Injector(Context context, Object lock, Installer installer,
Object installLock, PackageAbiHelper abiHelper,
Handler backgroundHandler,
Producer<ComponentResolver> componentResolverProducer,
Producer<PermissionManagerServiceInternal> permissionManagerProducer,
Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer,
Producer<UserManagerService> userManagerProducer,
Producer<Settings> settingsProducer,
Producer<ActivityTaskManagerInternal> activityTaskManagerProducer,
Producer<ActivityManagerInternal> activityManagerInternalProducer,
Producer<DeviceIdleInternal> deviceIdleControllerProducer,
Producer<StorageManagerInternal> storageManagerInternalProducer,
Producer<NetworkPolicyManagerInternal> networkPolicyManagerProducer,
Producer<PermissionPolicyInternal> permissionPolicyProvider,
Producer<DeviceStorageMonitorInternal> deviceStorageMonitorProducer,
Producer<DisplayManager> displayManagerProducer,
Producer<StorageManager> storageManagerProducer,
Producer<AppOpsManager> appOpsManagerProducer,
Producer<AppsFilter> appsFilterProducer,
Producer<PlatformCompat> platformCompatProducer) {
Producer<PlatformCompat> platformCompatProducer,
Producer<SystemConfig> systemConfigProducer,
Producer<PackageDexOptimizer> packageDexOptimizerProducer,
Producer<DexManager> dexManagerProducer,
Producer<ArtManagerService> artManagerServiceProducer,
Producer<ApexManager> apexManagerProducer,
Producer<IPermissionManager> permissionManagerProducer,
Producer<ViewCompiler> viewCompilerProducer,
Producer<IncrementalManager> incrementalManagerProducer,
SystemWrapper systemWrapper,
ServiceProducer getLocalServiceProducer,
ServiceProducer getSystemServiceProducer) {
mContext = context;
mLock = lock;
mInstaller = installer;
@@ -984,21 +968,22 @@ public class PackageManagerService extends IPackageManager.Stub
mBackgroundHandler = backgroundHandler;
mBackgroundExecutor = new HandlerExecutor(backgroundHandler);
mComponentResolverProducer = new Singleton<>(componentResolverProducer);
mPermissionManagerProducer = new Singleton<>(permissionManagerProducer);
mPermissionManagerServiceProducer = new Singleton<>(permissionManagerServiceProducer);
mUserManagerProducer = new Singleton<>(userManagerProducer);
mSettingsProducer = new Singleton<>(settingsProducer);
mActivityTaskManagerProducer = new Singleton<>(activityTaskManagerProducer);
mActivityManagerInternalProducer = new Singleton<>(activityManagerInternalProducer);
mLocalDeviceIdleController = new Singleton<>(deviceIdleControllerProducer);
mStorageManagerInternalProducer = new Singleton<>(storageManagerInternalProducer);
mNetworkPolicyManagerProducer = new Singleton<>(networkPolicyManagerProducer);
mPermissionPolicyProducer = new Singleton<>(permissionPolicyProvider);
mDeviceStorageMonitorProducer = new Singleton<>(deviceStorageMonitorProducer);
mDisplayManagerProducer = new Singleton<>(displayManagerProducer);
mStorageManagerProducer = new Singleton<>(storageManagerProducer);
mAppOpsManagerProducer = new Singleton<>(appOpsManagerProducer);
mAppsFilterProducer = new Singleton<>(appsFilterProducer);
mPlatformCompatProducer = new Singleton<>(platformCompatProducer);
mSystemConfigProducer = new Singleton<>(systemConfigProducer);
mPackageDexOptimizerProducer = new Singleton<>(packageDexOptimizerProducer);
mDexManagerProducer = new Singleton<>(dexManagerProducer);
mArtManagerServiceProducer = new Singleton<>(artManagerServiceProducer);
mApexManagerProducer = new Singleton<>(apexManagerProducer);
mPermissionManagerProducer = new Singleton<>(permissionManagerProducer);
mViewCompilerProducer = new Singleton<>(viewCompilerProducer);
mIncrementalManagerProducer = new Singleton<>(incrementalManagerProducer);
mSystemWrapper = systemWrapper;
mGetLocalServiceProducer = getLocalServiceProducer;
mGetSystemServiceProducer = getSystemServiceProducer;
}
/**
@@ -1038,7 +1023,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
public PermissionManagerServiceInternal getPermissionManagerServiceInternal() {
return mPermissionManagerProducer.get(this, mPackageManager);
return mPermissionManagerServiceProducer.get(this, mPackageManager);
}
public Context getContext() {
@@ -1049,46 +1034,6 @@ public class PackageManagerService extends IPackageManager.Stub
return mSettingsProducer.get(this, mPackageManager);
}
public ActivityTaskManagerInternal getActivityTaskManagerInternal() {
return mActivityTaskManagerProducer.get(this, mPackageManager);
}
public ActivityManagerInternal getActivityManagerInternal() {
return mActivityManagerInternalProducer.get(this, mPackageManager);
}
public DeviceIdleInternal getLocalDeviceIdleController() {
return mLocalDeviceIdleController.get(this, mPackageManager);
}
public StorageManagerInternal getStorageManagerInternal() {
return mStorageManagerInternalProducer.get(this, mPackageManager);
}
public NetworkPolicyManagerInternal getNetworkPolicyManagerInternal() {
return mNetworkPolicyManagerProducer.get(this, mPackageManager);
}
public PermissionPolicyInternal getPermissionPolicyInternal() {
return mPermissionPolicyProducer.get(this, mPackageManager);
}
public DeviceStorageMonitorInternal getDeviceStorageMonitorInternal() {
return mDeviceStorageMonitorProducer.get(this, mPackageManager);
}
public DisplayManager getDisplayManager() {
return mDisplayManagerProducer.get(this, mPackageManager);
}
public StorageManager getStorageManager() {
return mStorageManagerProducer.get(this, mPackageManager);
}
public AppOpsManager getAppOpsManager() {
return mAppOpsManagerProducer.get(this, mPackageManager);
}
public AppsFilter getAppsFilter() {
return mAppsFilterProducer.get(this, mPackageManager);
}
@@ -1097,6 +1042,34 @@ public class PackageManagerService extends IPackageManager.Stub
return mPlatformCompatProducer.get(this, mPackageManager);
}
public SystemConfig getSystemConfig() {
return mSystemConfigProducer.get(this, mPackageManager);
}
public PackageDexOptimizer getPackageDexOptimizer() {
return mPackageDexOptimizerProducer.get(this, mPackageManager);
}
public DexManager getDexManager() {
return mDexManagerProducer.get(this, mPackageManager);
}
public ArtManagerService getArtManagerService() {
return mArtManagerServiceProducer.get(this, mPackageManager);
}
public ApexManager getApexManager() {
return mApexManagerProducer.get(this, mPackageManager);
}
public ViewCompiler getViewCompiler() {
return mViewCompilerProducer.get(this, mPackageManager);
}
public IPermissionManager getPermissionManagerService() {
return mPermissionManagerProducer.get(this, mPackageManager);
}
public Handler getBackgroundHandler() {
return mBackgroundHandler;
}
@@ -1104,6 +1077,70 @@ public class PackageManagerService extends IPackageManager.Stub
public Executor getBackgroundExecutor() {
return mBackgroundExecutor;
}
public <T> T getLocalService(Class<T> c) {
return mGetLocalServiceProducer.produce(c);
}
public <T> T getSystemService(Class<T> c) {
return mGetSystemServiceProducer.produce(c);
}
public SystemWrapper getSystemWrapper() {
return mSystemWrapper;
}
public IncrementalManager getIncrementalManager() {
return mIncrementalManagerProducer.get(this, mPackageManager);
}
}
/** Provides an abstraction to static access to system state. */
public interface SystemWrapper {
/** @see SystemProperties#get(String) */
String getProperty(String key);
/** @see SystemProperties#getInt(String, int) */
int getPropertyInt(String key, int defValue);
/** @see SystemProperties#getBoolean(String, boolean) */
boolean getPropertyBoolean(String key, boolean defValue);
/** @see SystemProperties#digestOf(String...) */
String digestOfProperties(@NonNull String... keys);
/** @see SystemProperties#set(String, String) */
void setProperty(String key, String value);
/** @see Build.VERSION#SDK_INT */
int getSdkInt();
}
private static class DefaultSystemWrapper implements SystemWrapper {
@Override
public String getProperty(String key) {
return SystemProperties.get(key);
}
@Override
public int getPropertyInt(String key, int defValue) {
return SystemProperties.getInt(key, defValue);
}
@Override
public boolean getPropertyBoolean(String key, boolean defValue) {
return SystemProperties.getBoolean(key, defValue);
}
@Override
public String digestOfProperties(String... keys) {
return SystemProperties.digestOf(keys);
}
@Override
public void setProperty(String key, String value) {
SystemProperties.set(key, value);
}
@Override
public int getSdkInt() {
return Build.VERSION.SDK_INT;
}
}
@VisibleForTesting(visibility = Visibility.PRIVATE)
@@ -1161,6 +1198,8 @@ public class PackageManagerService extends IPackageManager.Stub
public @Nullable String retailDemoPackage;
public ComponentName resolveComponentName;
public ArrayMap<String, AndroidPackage> packages;
public boolean enableFreeCacheV2;
public int sdkVersion;
}
private final AppsFilter mAppsFilter;
@@ -1354,7 +1393,7 @@ public class PackageManagerService extends IPackageManager.Stub
options.setTemporaryAppWhitelistDuration(whitelistTimeout);
DeviceIdleInternal idleController =
mInjector.getLocalDeviceIdleController();
mInjector.getLocalService(DeviceIdleInternal.class);
idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
mIntentFilterVerifierComponent.getPackageName(), whitelistTimeout,
UserHandle.USER_SYSTEM, true, "intent filter verifier");
@@ -1427,7 +1466,7 @@ public class PackageManagerService extends IPackageManager.Stub
case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS:
if (!verified) {
// Don't demote if sysconfig says 'always'
SystemConfig systemConfig = SystemConfig.getInstance();
SystemConfig systemConfig = mInjector.getSystemConfig();
ArraySet<String> packages = systemConfig.getLinkedApps();
if (!packages.contains(packageName)) {
// updatedStatus is already UNDEFINED
@@ -2324,7 +2363,8 @@ public class PackageManagerService extends IPackageManager.Stub
// Send broadcast package appeared if external for all users
if (res.pkg.isExternalStorage()) {
if (!update) {
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(
StorageManager.class);
VolumeInfo volume =
storage.findVolumeByUuid(
res.pkg.getStorageUuid().toString());
@@ -2503,7 +2543,7 @@ public class PackageManagerService extends IPackageManager.Stub
ApkChecksums.Injector injector = new ApkChecksums.Injector(
() -> mContext,
() -> mInjector.getBackgroundHandler(),
() -> mContext.getSystemService(IncrementalManager.class));
() -> mInjector.getIncrementalManager());
ApkChecksums.getChecksums(filesToChecksum, optional, required, trustedCerts,
statusReceiver, injector);
});
@@ -2679,31 +2719,32 @@ public class PackageManagerService extends IPackageManager.Stub
Injector injector = new Injector(
context, lock, installer, installLock, new PackageAbiHelperImpl(),
backgroundHandler,
(i, pm) ->
new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock),
(i, pm) ->
PermissionManagerService.create(context, lock),
(i, pm) ->
new UserManagerService(context, pm,
(i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock),
(i, pm) -> PermissionManagerService.create(context, lock),
(i, pm) -> new UserManagerService(context, pm,
new UserDataPreparer(installer, installLock, context, onlyCore),
lock),
(i, pm) ->
new Settings(Environment.getDataDirectory(),
i.getPermissionManagerServiceInternal().getPermissionSettings(),
RuntimePermissionsPersistence.createInstance(),
i.getPermissionManagerServiceInternal(), lock),
new Injector.LocalServicesProducer<>(ActivityTaskManagerInternal.class),
new Injector.LocalServicesProducer<>(ActivityManagerInternal.class),
new Injector.LocalServicesProducer<>(DeviceIdleInternal.class),
new Injector.LocalServicesProducer<>(StorageManagerInternal.class),
new Injector.LocalServicesProducer<>(NetworkPolicyManagerInternal.class),
new Injector.LocalServicesProducer<>(PermissionPolicyInternal.class),
new Injector.LocalServicesProducer<>(DeviceStorageMonitorInternal.class),
new Injector.SystemServiceProducer<>(DisplayManager.class),
new Injector.SystemServiceProducer<>(StorageManager.class),
new Injector.SystemServiceProducer<>(AppOpsManager.class),
(i, pm) -> new Settings(Environment.getDataDirectory(),
i.getPermissionManagerServiceInternal().getPermissionSettings(),
RuntimePermissionsPersistence.createInstance(),
i.getPermissionManagerServiceInternal(), lock),
(i, pm) -> AppsFilter.create(pm.mPmInternal, i),
(i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"));
(i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"),
(i, pm) -> SystemConfig.getInstance(),
(i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(),
i.getContext(), "*dexopt*"),
(i, pm) -> new DexManager(i.getContext(), pm, i.getPackageDexOptimizer(),
i.getInstaller(), i.getInstallLock()),
(i, pm) -> new ArtManagerService(i.getContext(), pm, i.getInstaller(),
i.getInstallLock()),
(i, pm) -> ApexManager.getInstance(),
(i, pm) -> (IPermissionManager) ServiceManager.getService("permissionmgr"),
(i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()),
(i, pm) -> (IncrementalManager)
pm.mContext.getSystemService(Context.INCREMENTAL_SERVICE),
new DefaultSystemWrapper(),
LocalServices::getService,
context::getSystemService);
PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest);
t.traceEnd(); // "create package manager"
@@ -2776,16 +2817,17 @@ public class PackageManagerService extends IPackageManager.Stub
* reasons. This simply requests that the copy takes place and awaits confirmation of its
* completion. See platform/system/extras/cppreopt/ for the implementation of the actual copy.
*/
private static void requestCopyPreoptedFiles() {
private static void requestCopyPreoptedFiles(Injector injector) {
final int WAIT_TIME_MS = 100;
final String CP_PREOPT_PROPERTY = "sys.cppreopt";
if (SystemProperties.getInt("ro.cp_system_other_odex", 0) == 1) {
SystemProperties.set(CP_PREOPT_PROPERTY, "requested");
if (injector.getSystemWrapper().getPropertyInt("ro.cp_system_other_odex", 0) == 1) {
injector.getSystemWrapper().setProperty(CP_PREOPT_PROPERTY, "requested");
// We will wait for up to 100 seconds.
final long timeStart = SystemClock.uptimeMillis();
final long timeEnd = timeStart + 100 * 1000;
long timeNow = timeStart;
while (!SystemProperties.get(CP_PREOPT_PROPERTY).equals("finished")) {
while (!injector.getSystemWrapper()
.getProperty(CP_PREOPT_PROPERTY).equals("finished")) {
try {
Thread.sleep(WAIT_TIME_MS);
} catch (InterruptedException e) {
@@ -2793,7 +2835,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
timeNow = SystemClock.uptimeMillis();
if (timeNow > timeEnd) {
SystemProperties.set(CP_PREOPT_PROPERTY, "timed-out");
injector.getSystemWrapper().setProperty(CP_PREOPT_PROPERTY, "timed-out");
Slog.wtf(TAG, "cppreopt did not finish!");
break;
}
@@ -2925,6 +2967,8 @@ public class PackageManagerService extends IPackageManager.Stub
mResolveComponentName = testParams.resolveComponentName;
mPackages.putAll(testParams.packages);
mEnableFreeCacheV2 = testParams.enableFreeCacheV2;
mSdkVersion = testParams.sdkVersion;
}
public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
@@ -2950,6 +2994,7 @@ public class PackageManagerService extends IPackageManager.Stub
LockGuard.installLock(mLock, LockGuard.INDEX_PACKAGES);
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
SystemClock.uptimeMillis());
mSdkVersion = injector.getSystemWrapper().getSdkInt();
if (mSdkVersion <= 0) {
Slog.w(TAG, "**** ro.build.version.sdk not set!");
@@ -2960,6 +3005,8 @@ public class PackageManagerService extends IPackageManager.Stub
mOnlyCore = onlyCore;
mMetrics = new DisplayMetrics();
mInstaller = injector.getInstaller();
mEnableFreeCacheV2 =
injector.getSystemWrapper().getPropertyBoolean("fw.free_cache_v2", true);
// Create sub-components that provide services / data. Order here is important.
t.traceBegin("createSubComponents");
@@ -2971,9 +3018,8 @@ public class PackageManagerService extends IPackageManager.Stub
mComponentResolver = injector.getComponentResolver();
mPermissionManager = injector.getPermissionManagerServiceInternal();
mSettings = injector.getSettings();
mPermissionManagerService = (IPermissionManager) ServiceManager.getService("permissionmgr");
mIncrementalManager =
(IncrementalManager) mContext.getSystemService(Context.INCREMENTAL_SERVICE);
mPermissionManagerService = injector.getPermissionManagerService();
mIncrementalManager = mInjector.getIncrementalManager();
PlatformCompat platformCompat = mInjector.getCompatibility();
mPackageParserCallback = new PackageParser2.Callback() {
@Override
@@ -3009,7 +3055,8 @@ public class PackageManagerService extends IPackageManager.Stub
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
t.traceEnd();
String separateProcesses = SystemProperties.get("debug.separate_processes");
String separateProcesses =
injector.getSystemWrapper().getProperty("debug.separate_processes");
if (separateProcesses != null && separateProcesses.length() > 0) {
if ("*".equals(separateProcesses)) {
mDefParseFlags = PackageParser.PARSE_IGNORE_PROCESSES;
@@ -3026,25 +3073,22 @@ public class PackageManagerService extends IPackageManager.Stub
mSeparateProcesses = null;
}
mPackageDexOptimizer = new PackageDexOptimizer(mInstaller, mInstallLock, mContext,
"*dexopt*");
mDexManager =
new DexManager(mContext, this, mPackageDexOptimizer, mInstaller, mInstallLock);
mArtManagerService = new ArtManagerService(mContext, this, mInstaller, mInstallLock);
mPackageDexOptimizer = injector.getPackageDexOptimizer();
mDexManager = injector.getDexManager();
mArtManagerService = injector.getArtManagerService();
mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());
mViewCompiler = injector.getViewCompiler();
mViewCompiler = new ViewCompiler(mInstallLock, mInstaller);
getDefaultDisplayMetrics(mInjector.getDisplayManager(), mMetrics);
getDefaultDisplayMetrics(mInjector.getSystemService(DisplayManager.class), mMetrics);
t.traceBegin("get system config");
SystemConfig systemConfig = SystemConfig.getInstance();
SystemConfig systemConfig = injector.getSystemConfig();
mAvailableFeatures = systemConfig.getAvailableFeatures();
t.traceEnd();
mProtectedPackages = new ProtectedPackages(mContext);
mApexManager = ApexManager.getInstance();
mApexManager = injector.getApexManager();
mAppsFilter = mInjector.getAppsFilter();
final List<ScanPartition> scanPartitions = new ArrayList<>();
@@ -3122,7 +3166,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (!mOnlyCore && mFirstBoot) {
requestCopyPreoptedFiles();
requestCopyPreoptedFiles(mInjector);
}
String customResolverActivityName = Resources.getSystem().getString(
@@ -3177,7 +3221,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
mCacheDir = preparePackageParserCache();
mCacheDir = preparePackageParserCache(injector);
// Set flag to monitor and not change apk file paths when
// scanning install directories.
@@ -4000,7 +4044,7 @@ public class PackageManagerService extends IPackageManager.Stub
setUpInstantAppInstallerActivityLP(getInstantAppInstallerLPr());
}
private static @Nullable File preparePackageParserCache() {
private static @Nullable File preparePackageParserCache(Injector injector) {
if (!FORCE_PACKAGE_PARSED_CACHE_ENABLED) {
if (!DEFAULT_PACKAGE_PARSER_CACHE_ENABLED) {
return null;
@@ -4011,7 +4055,8 @@ public class PackageManagerService extends IPackageManager.Stub
return null;
}
if (SystemProperties.getBoolean("pm.boot.disable_package_cache", false)) {
if (injector.getSystemWrapper()
.getPropertyBoolean("pm.boot.disable_package_cache", false)) {
Slog.i(TAG, "Disabling package parser cache due to system property.");
return null;
}
@@ -4027,7 +4072,7 @@ public class PackageManagerService extends IPackageManager.Stub
// identify cached items. In particular, changing the value of certain
// feature flags should cause us to invalidate any caches.
final String cacheName = FORCE_PACKAGE_PARSED_CACHE_ENABLED ? "debug"
: SystemProperties.digestOf(
: injector.getSystemWrapper().digestOfProperties(
"ro.build.fingerprint",
StorageManager.PROP_ISOLATED_STORAGE,
StorageManager.PROP_ISOLATED_STORAGE_SNAPSHOT
@@ -4093,7 +4138,7 @@ public class PackageManagerService extends IPackageManager.Stub
public boolean isDeviceUpgrading() {
// allow instant applications
// The system property allows testing ota flow when upgraded to the same image.
return mIsUpgrade || SystemProperties.getBoolean(
return mIsUpgrade || mInjector.getSystemWrapper().getPropertyBoolean(
"persist.pm.mock-upgrade", false /* default */);
}
@@ -4360,7 +4405,7 @@ public class PackageManagerService extends IPackageManager.Stub
Slog.d(TAG, "Priming domain verifications in user " + userId);
}
SystemConfig systemConfig = SystemConfig.getInstance();
SystemConfig systemConfig = mInjector.getSystemConfig();
ArraySet<String> packages = systemConfig.getLinkedApps();
for (String packageName : packages) {
@@ -5169,11 +5214,11 @@ public class PackageManagerService extends IPackageManager.Stub
* until the requested bytes are available.
*/
public void freeStorage(String volumeUuid, long bytes, int storageFlags) throws IOException {
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
final File file = storage.findPathForUuid(volumeUuid);
if (file.getUsableSpace() >= bytes) return;
if (ENABLE_FREE_CACHE_V2) {
if (mEnableFreeCacheV2) {
final boolean internalVolume = Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL,
volumeUuid);
final boolean aggressive = (storageFlags
@@ -5252,7 +5297,7 @@ public class PackageManagerService extends IPackageManager.Stub
private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod)
throws IOException {
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL);
List<VersionedPackage> packagesToDelete = null;
@@ -5500,7 +5545,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
private boolean isRecentsAccessingChildProfiles(int callingUid, int targetUserId) {
if (!mInjector.getActivityTaskManagerInternal().isCallerRecents(callingUid)) {
if (!mInjector.getLocalService(ActivityTaskManagerInternal.class)
.isCallerRecents(callingUid)) {
return false;
}
final long token = Binder.clearCallingIdentity();
@@ -5983,7 +6029,7 @@ public class PackageManagerService extends IPackageManager.Stub
res.addAll(mAvailableFeatures.values());
}
final FeatureInfo fi = new FeatureInfo();
fi.reqGlEsVersion = SystemProperties.getInt("ro.opengles.version",
fi.reqGlEsVersion = mInjector.getSystemWrapper().getPropertyInt("ro.opengles.version",
FeatureInfo.GL_ES_VERSION_UNDEFINED);
res.add(fi);
@@ -9065,10 +9111,10 @@ public class PackageManagerService extends IPackageManager.Stub
if (providerInfo != null) {
// Looking for cross-user grants before enforcing the typical cross-users permissions
if (userId != UserHandle.getUserId(callingUid)) {
final UriGrantsManagerInternal mUgmInternal =
LocalServices.getService(UriGrantsManagerInternal.class);
final UriGrantsManagerInternal ugmInternal =
mInjector.getLocalService(UriGrantsManagerInternal.class);
checkedGrants =
mUgmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true);
ugmInternal.checkAuthorityGrants(callingUid, providerInfo, userId, true);
}
}
if (!checkedGrants) {
@@ -9678,7 +9724,7 @@ public class PackageManagerService extends IPackageManager.Stub
pkgName, getSettingsVersionForPackage(parsedPackage)),
Collections.singletonMap(pkgName,
getSharedLibLatestVersionSetting(scanResult))),
mSettings.mKeySetManagerService);
mSettings.mKeySetManagerService, mInjector);
appIdCreated = optimisticallyRegisterAppId(scanResult);
commitReconciledScanResultLocked(
reconcileResult.get(pkgName), mUserManager.getUserIds());
@@ -9957,7 +10003,7 @@ public class PackageManagerService extends IPackageManager.Stub
pkgCompilationReason = PackageManagerService.REASON_BACKGROUND_DEXOPT;
}
if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) {
if (mInjector.getSystemWrapper().getPropertyBoolean(PRECOMPILE_LAYOUTS, false)) {
mArtManagerService.compileLayouts(pkg);
}
@@ -10933,7 +10979,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
private int getVendorPartitionVersion() {
final String version = SystemProperties.get("ro.vndk.version");
final String version = mInjector.getSystemWrapper().getProperty("ro.vndk.version");
if (!version.isEmpty()) {
try {
return Integer.parseInt(version);
@@ -12957,7 +13003,7 @@ public class PackageManagerService extends IPackageManager.Stub
+ intent.toShortString(false, true, false, false)
+ " " + intent.getExtras(), here);
}
mInjector.getActivityManagerInternal().broadcastIntent(
mInjector.getLocalService(ActivityManagerInternal.class).broadcastIntent(
intent, finishedReceiver, requiredPermissions,
finishedReceiver != null, id,
broadcastAllowList == null ? null : broadcastAllowList.get(id));
@@ -14262,7 +14308,7 @@ public class PackageManagerService extends IPackageManager.Stub
&& mInstantAppInstallerActivity.packageName.equals(
mRequiredVerifierPackage)) {
try {
mInjector.getAppOpsManager()
mInjector.getSystemService(AppOpsManager.class)
.checkPackage(installerUid, mRequiredVerifierPackage);
if (DEBUG_VERIFY) {
Slog.i(TAG, "disable verification for instant app");
@@ -14512,7 +14558,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
throw new SecurityException("Instant applications don't have access to this method");
}
mInjector.getAppOpsManager().checkPackage(Binder.getCallingUid(),
mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(),
callerPackageName);
synchronized (mLock) {
PackageSetting ps = mSettings.mPackages.get(packageName);
@@ -14672,7 +14718,7 @@ public class PackageManagerService extends IPackageManager.Stub
*/
private boolean performRollbackManagerRestore(int userId, int token, PackageInstalledInfo res,
PostInstallData data) {
RollbackManagerInternal rm = LocalServices.getService(RollbackManagerInternal.class);
RollbackManagerInternal rm = mInjector.getLocalService(RollbackManagerInternal.class);
final String packageName = res.pkg.getPackageName();
final int[] allUsers = mUserManager.getUserIds();
@@ -15435,7 +15481,7 @@ public class PackageManagerService extends IPackageManager.Stub
integrityVerification.setPackage("android");
DeviceIdleInternal idleController =
mInjector.getLocalDeviceIdleController();
mInjector.getLocalService(DeviceIdleInternal.class);
final long idleDuration = getVerificationTimeout();
idleController.addPowerSaveTempWhitelistAppDirect(Process.myUid(),
@@ -15545,7 +15591,7 @@ public class PackageManagerService extends IPackageManager.Stub
receivers, verificationState);
DeviceIdleInternal idleController =
mInjector.getLocalDeviceIdleController();
mInjector.getLocalService(DeviceIdleInternal.class);
final long idleDuration = getVerificationTimeout();
final BroadcastOptions options = BroadcastOptions.makeBasic();
options.setTemporaryAppWhitelistDuration(idleDuration);
@@ -16544,7 +16590,7 @@ public class PackageManagerService extends IPackageManager.Stub
@GuardedBy("mLock")
private static Map<String, ReconciledPackage> reconcilePackagesLocked(
final ReconcileRequest request, KeySetManagerService ksms)
final ReconcileRequest request, KeySetManagerService ksms, Injector injector)
throws ReconcileFailure {
final Map<String, ScanResult> scannedPackages = request.scannedPackages;
@@ -16695,7 +16741,8 @@ public class PackageManagerService extends IPackageManager.Stub
&& compareSignatures(sharedUserSignatures,
parsedPackage.getSigningDetails().signatures)
!= PackageManager.SIGNATURE_MATCH) {
if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) {
if (injector.getSystemWrapper()
.getPropertyInt("ro.product.first_api_level", 0) <= 29) {
// Mismatched signatures is an error and silently skipping system
// packages will likely break the device in unforeseen ways.
// However, we allow the device to boot anyway because, prior to Q,
@@ -17069,7 +17116,7 @@ public class PackageManagerService extends IPackageManager.Stub
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "reconcilePackages");
reconciledPackages = reconcilePackagesLocked(
reconcileRequest, mSettings.mKeySetManagerService);
reconcileRequest, mSettings.mKeySetManagerService, mInjector);
} catch (ReconcileFailure e) {
for (InstallRequest request : requests) {
request.installResult.setError("Reconciliation failed...", e);
@@ -17204,7 +17251,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (performDexopt) {
// Compile the layout resources.
if (SystemProperties.getBoolean(PRECOMPILE_LAYOUTS, false)) {
if (mInjector.getSystemWrapper().getPropertyBoolean(PRECOMPILE_LAYOUTS, false)) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "compileLayouts");
mViewCompiler.compileLayouts(pkg);
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
@@ -19839,7 +19886,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
private void resetNetworkPolicies(int userId) {
mInjector.getNetworkPolicyManagerInternal().resetUserState(userId);
mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId);
}
/**
@@ -21105,7 +21152,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
public String getOverlayConfigSignaturePackageName() {
return ensureSystemPackageName(SystemConfig.getInstance()
return ensureSystemPackageName(mInjector.getSystemConfig()
.getOverlayConfigSignaturePackage());
}
@@ -21875,7 +21922,7 @@ public class PackageManagerService extends IPackageManager.Stub
mPermissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, false);
final PermissionPolicyInternal permissionPolicyInternal =
mInjector.getPermissionPolicyInternal();
mInjector.getLocalService(PermissionPolicyInternal.class);
permissionPolicyInternal.setOnInitializedCallback(userId -> {
// The SDK updated case is already handled when we run during the ctor.
synchronized (mLock) {
@@ -21886,13 +21933,13 @@ public class PackageManagerService extends IPackageManager.Stub
}
// Watch for external volumes that come and go over time
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
storage.registerListener(mStorageListener);
mInstallerService.systemReady();
mPackageDexOptimizer.systemReady();
mInjector.getStorageManagerInternal().addExternalStoragePolicy(
mInjector.getLocalService(StorageManagerInternal.class).addExternalStoragePolicy(
new StorageManagerInternal.ExternalStorageMountPolicy() {
@Override
public int getMountMode(int uid, String packageName) {
@@ -22625,7 +22672,7 @@ public class PackageManagerService extends IPackageManager.Stub
if (ArrayUtils.isEmpty(apkList)) {
return;
}
String sku = SystemProperties.get("ro.boot.hardware.sku");
String sku = mInjector.getSystemWrapper().getProperty("ro.boot.hardware.sku");
if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) {
return;
}
@@ -22921,7 +22968,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
// Reconcile app data for all started/unlocked users
final StorageManager sm = mInjector.getStorageManager();
final StorageManager sm = mInjector.getSystemService(StorageManager.class);
UserManagerInternal umInternal = mInjector.getUserManagerInternal();
for (UserInfo user : mUserManager.getUsers(false /* includeDying */)) {
final int flags;
@@ -23122,7 +23169,7 @@ public class PackageManagerService extends IPackageManager.Stub
* correct for all installed apps on all mounted volumes.
*/
void reconcileAppsData(int userId, int flags, boolean migrateAppsData) {
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
final String volumeUuid = vol.getFsUuid();
synchronized (mInstallLock) {
@@ -23257,7 +23304,7 @@ public class PackageManagerService extends IPackageManager.Stub
Installer.Batch batch = new Installer.Batch();
UserManagerInternal umInternal = mInjector.getUserManagerInternal();
StorageManagerInternal smInternal = mInjector.getStorageManagerInternal();
StorageManagerInternal smInternal = mInjector.getLocalService(StorageManagerInternal.class);
for (UserInfo user : mUserManager.getUsers(false /*excludeDying*/)) {
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) {
@@ -23586,7 +23633,7 @@ public class PackageManagerService extends IPackageManager.Stub
private void movePackageInternal(final String packageName, final String volumeUuid,
final int moveId, final int callingUid, UserHandle user)
throws PackageManagerException {
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
final PackageManager pm = mContext.getPackageManager();
final String currentVolumeUuid;
@@ -23824,7 +23871,7 @@ public class PackageManagerService extends IPackageManager.Stub
return;
}
final StorageManager storage = mInjector.getStorageManager();;
final StorageManager storage = mInjector.getSystemService(StorageManager.class);;
VolumeInfo volume = storage.findVolumeByUuid(pkg.getStorageUuid().toString());
int packageExternalStorageType = getPackageExternalStorageType(volume, pkg.isExternalStorage());
@@ -23864,7 +23911,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
};
final StorageManager storage = mInjector.getStorageManager();
final StorageManager storage = mInjector.getSystemService(StorageManager.class);
storage.setPrimaryStorageUuid(volumeUuid, callback);
return realMoveId;
}
@@ -24044,7 +24091,7 @@ public class PackageManagerService extends IPackageManager.Stub
final long token = Binder.clearCallingIdentity();
try {
final DeviceStorageMonitorInternal
dsm = mInjector.getDeviceStorageMonitorInternal();
dsm = mInjector.getLocalService(DeviceStorageMonitorInternal.class);
if (dsm != null) {
return dsm.isMemoryLow();
} else {
@@ -25828,7 +25875,7 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public boolean isAutoRevokeWhitelisted(String packageName) {
int mode = mInjector.getAppOpsManager().checkOpNoThrow(
int mode = mInjector.getSystemService(AppOpsManager.class).checkOpNoThrow(
AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED,
Binder.getCallingUid(), packageName);
return mode == MODE_IGNORED;

View File

@@ -45,6 +45,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import org.mockito.Mockito
import org.mockito.Mockito.any
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.anyInt
@@ -341,7 +342,8 @@ class PackageManagerComponentLabelIconOverrideTest {
whenever(this.userManagerService) { mockUserManagerService }
whenever(this.permissionManagerServiceInternal) { mockPermissionManagerService }
whenever(this.settings) { mockSettings }
whenever(this.activityTaskManagerInternal) { mockActivityTaskManager }
whenever(this.getLocalService(ActivityTaskManagerInternal::class.java)) {
mockActivityTaskManager}
whenever(this.appsFilter) { mockAppsFilter }
whenever(this.context) { mockContext }
}