• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.pm;
18 
19 import android.app.ActivityManagerInternal;
20 import android.app.AppOpsManagerInternal;
21 import android.app.backup.IBackupManager;
22 import android.content.ComponentName;
23 import android.content.Context;
24 import android.os.Handler;
25 import android.os.HandlerExecutor;
26 import android.os.incremental.IncrementalManager;
27 import android.util.DisplayMetrics;
28 
29 import com.android.internal.annotations.VisibleForTesting;
30 import com.android.internal.pm.parsing.PackageParser2;
31 import com.android.server.SystemConfig;
32 import com.android.server.compat.PlatformCompat;
33 import com.android.server.pm.dex.ArtManagerService;
34 import com.android.server.pm.dex.DexManager;
35 import com.android.server.pm.dex.DynamicCodeLogger;
36 import com.android.server.pm.permission.LegacyPermissionManagerInternal;
37 import com.android.server.pm.permission.PermissionManagerServiceInternal;
38 import com.android.server.pm.resolution.ComponentResolver;
39 import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
40 
41 import java.util.List;
42 import java.util.concurrent.Executor;
43 
44 /**
45  * Unit tests will instantiate, extend and/or mock to mock dependencies / behaviors.
46  *
47  * NOTE: All getters should return the same instance for every call.
48  */
49 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
50 public class PackageManagerServiceInjector {
51     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
52     interface Producer<T> {
53         /** Produce an instance of type {@link T} */
produce(PackageManagerServiceInjector injector, PackageManagerService packageManager)54         T produce(PackageManagerServiceInjector injector, PackageManagerService packageManager);
55     }
56 
57     interface ProducerWithArgument<T, R> {
produce(PackageManagerServiceInjector injector, PackageManagerService packageManager, R argument)58         T produce(PackageManagerServiceInjector injector, PackageManagerService packageManager,
59                 R argument);
60     }
61 
62     interface ServiceProducer {
produce(Class<T> c)63         <T> T produce(Class<T> c);
64     }
65 
66     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
67     static class Singleton<T> {
68         private final Producer<T> mProducer;
69         private volatile T mInstance = null;
70 
Singleton(Producer<T> producer)71         Singleton(Producer<T> producer) {
72             this.mProducer = producer;
73         }
74 
get(PackageManagerServiceInjector injector, PackageManagerService packageManagerService)75         T get(PackageManagerServiceInjector injector,
76                 PackageManagerService packageManagerService) {
77             if (mInstance == null) {
78                 mInstance = mProducer.produce(injector, packageManagerService);
79             }
80             return mInstance;
81         }
82     }
83 
84     private PackageManagerService mPackageManager;
85 
86     private final PackageAbiHelper mAbiHelper;
87     private final Context mContext;
88     private final PackageManagerTracedLock mLock;
89     private final Installer mInstaller;
90     private final PackageManagerTracedLock mInstallLock;
91     private final Handler mBackgroundHandler;
92     private final Executor mBackgroundExecutor;
93     private final List<ScanPartition> mSystemPartitions;
94 
95     // ----- producers -----
96     private final Singleton<ComponentResolver>
97             mComponentResolverProducer;
98     private final Singleton<PermissionManagerServiceInternal>
99             mPermissionManagerServiceProducer;
100     private final Singleton<AppOpsManagerInternal> mAppOpsManagerInternalProducer;
101     private final Singleton<UserManagerService>
102             mUserManagerProducer;
103     private final Singleton<Settings> mSettingsProducer;
104     private final Singleton<AppsFilterImpl> mAppsFilterProducer;
105     private final Singleton<PlatformCompat>
106             mPlatformCompatProducer;
107     private final Singleton<SystemConfig> mSystemConfigProducer;
108     private final Singleton<PackageDexOptimizer>
109             mPackageDexOptimizerProducer;
110     private final Singleton<DexManager> mDexManagerProducer;
111     private final Singleton<DynamicCodeLogger> mDynamicCodeLoggerProducer;
112     private final Singleton<ArtManagerService>
113             mArtManagerServiceProducer;
114     private final Singleton<ApexManager> mApexManagerProducer;
115     private final Singleton<IncrementalManager>
116             mIncrementalManagerProducer;
117     private final Singleton<DefaultAppProvider>
118             mDefaultAppProviderProducer;
119     private final Singleton<DisplayMetrics>
120             mDisplayMetricsProducer;
121     private final Producer<PackageParser2>
122             mScanningCachingPackageParserProducer;
123     private final Producer<PackageParser2>
124             mScanningPackageParserProducer;
125     private final Producer<PackageParser2>
126             mPreparingPackageParserProducer;
127     private final Singleton<PackageInstallerService>
128             mPackageInstallerServiceProducer;
129 
130     private final ProducerWithArgument<InstantAppResolverConnection, ComponentName>
131             mInstantAppResolverConnectionProducer;
132     private final Singleton<LegacyPermissionManagerInternal>
133             mLegacyPermissionManagerInternalProducer;
134     private final SystemWrapper mSystemWrapper;
135     private final ServiceProducer mGetLocalServiceProducer;
136     private final ServiceProducer mGetSystemServiceProducer;
137     private final Singleton<ModuleInfoProvider>
138             mModuleInfoProviderProducer;
139     private final Singleton<DomainVerificationManagerInternal>
140             mDomainVerificationManagerInternalProducer;
141     private final Singleton<Handler> mHandlerProducer;
142     private final Singleton<IBackupManager> mIBackupManager;
143     private final Singleton<SharedLibrariesImpl> mSharedLibrariesProducer;
144     private final Singleton<CrossProfileIntentFilterHelper> mCrossProfileIntentFilterHelperProducer;
145     private final Singleton<UpdateOwnershipHelper> mUpdateOwnershipHelperProducer;
146     private final Singleton<PackageMonitorCallbackHelper> mPackageMonitorCallbackHelper;
147 
PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock, Installer installer, PackageManagerTracedLock installLock, PackageAbiHelper abiHelper, Handler backgroundHandler, List<ScanPartition> systemPartitions, Producer<ComponentResolver> componentResolverProducer, Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer, Producer<AppOpsManagerInternal> appOpsManagerInternalProducer, Producer<UserManagerService> userManagerProducer, Producer<Settings> settingsProducer, Producer<AppsFilterImpl> appsFilterProducer, Producer<PlatformCompat> platformCompatProducer, Producer<SystemConfig> systemConfigProducer, Producer<PackageDexOptimizer> packageDexOptimizerProducer, Producer<DexManager> dexManagerProducer, Producer<DynamicCodeLogger> dynamicCodeLoggerProducer, Producer<ArtManagerService> artManagerServiceProducer, Producer<ApexManager> apexManagerProducer, Producer<IncrementalManager> incrementalManagerProducer, Producer<DefaultAppProvider> defaultAppProviderProducer, Producer<DisplayMetrics> displayMetricsProducer, Producer<PackageParser2> scanningCachingPackageParserProducer, Producer<PackageParser2> scanningPackageParserProducer, Producer<PackageParser2> preparingPackageParserProducer, Producer<PackageInstallerService> packageInstallerServiceProducer, ProducerWithArgument<InstantAppResolverConnection, ComponentName> instantAppResolverConnectionProducer, Producer<ModuleInfoProvider> moduleInfoProviderProducer, Producer<LegacyPermissionManagerInternal> legacyPermissionManagerInternalProducer, Producer<DomainVerificationManagerInternal> domainVerificationManagerInternalProducer, Producer<Handler> handlerProducer, SystemWrapper systemWrapper, ServiceProducer getLocalServiceProducer, ServiceProducer getSystemServiceProducer, Producer<IBackupManager> iBackupManager, Producer<SharedLibrariesImpl> sharedLibrariesProducer, Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer, Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer, Producer<PackageMonitorCallbackHelper> packageMonitorCallbackHelper)148     PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock,
149             Installer installer, PackageManagerTracedLock installLock, PackageAbiHelper abiHelper,
150             Handler backgroundHandler,
151             List<ScanPartition> systemPartitions,
152             Producer<ComponentResolver> componentResolverProducer,
153             Producer<PermissionManagerServiceInternal> permissionManagerServiceProducer,
154             Producer<AppOpsManagerInternal> appOpsManagerInternalProducer,
155             Producer<UserManagerService> userManagerProducer,
156             Producer<Settings> settingsProducer,
157             Producer<AppsFilterImpl> appsFilterProducer,
158             Producer<PlatformCompat> platformCompatProducer,
159             Producer<SystemConfig> systemConfigProducer,
160             Producer<PackageDexOptimizer> packageDexOptimizerProducer,
161             Producer<DexManager> dexManagerProducer,
162             Producer<DynamicCodeLogger> dynamicCodeLoggerProducer,
163             Producer<ArtManagerService> artManagerServiceProducer,
164             Producer<ApexManager> apexManagerProducer,
165             Producer<IncrementalManager> incrementalManagerProducer,
166             Producer<DefaultAppProvider> defaultAppProviderProducer,
167             Producer<DisplayMetrics> displayMetricsProducer,
168             Producer<PackageParser2> scanningCachingPackageParserProducer,
169             Producer<PackageParser2> scanningPackageParserProducer,
170             Producer<PackageParser2> preparingPackageParserProducer,
171             Producer<PackageInstallerService> packageInstallerServiceProducer,
172             ProducerWithArgument<InstantAppResolverConnection,
173                     ComponentName>
174                     instantAppResolverConnectionProducer,
175             Producer<ModuleInfoProvider> moduleInfoProviderProducer,
176             Producer<LegacyPermissionManagerInternal> legacyPermissionManagerInternalProducer,
177             Producer<DomainVerificationManagerInternal>
178                     domainVerificationManagerInternalProducer,
179             Producer<Handler> handlerProducer,
180             SystemWrapper systemWrapper,
181             ServiceProducer getLocalServiceProducer,
182             ServiceProducer getSystemServiceProducer,
183             Producer<IBackupManager> iBackupManager,
184             Producer<SharedLibrariesImpl> sharedLibrariesProducer,
185             Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer,
186             Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer,
187             Producer<PackageMonitorCallbackHelper> packageMonitorCallbackHelper) {
188         mContext = context;
189         mLock = lock;
190         mInstaller = installer;
191         mAbiHelper = abiHelper;
192         mInstallLock = installLock;
193         mBackgroundHandler = backgroundHandler;
194         mBackgroundExecutor = new HandlerExecutor(backgroundHandler);
195         mSystemPartitions = systemPartitions;
196         mComponentResolverProducer = new Singleton<>(
197                 componentResolverProducer);
198         mPermissionManagerServiceProducer = new Singleton<>(
199                 permissionManagerServiceProducer);
200         mAppOpsManagerInternalProducer = new Singleton<>(appOpsManagerInternalProducer);
201         mUserManagerProducer = new Singleton<>(userManagerProducer);
202         mSettingsProducer = new Singleton<>(settingsProducer);
203         mAppsFilterProducer = new Singleton<>(appsFilterProducer);
204         mPlatformCompatProducer = new Singleton<>(
205                 platformCompatProducer);
206         mSystemConfigProducer = new Singleton<>(systemConfigProducer);
207         mPackageDexOptimizerProducer = new Singleton<>(
208                 packageDexOptimizerProducer);
209         mDexManagerProducer = new Singleton<>(dexManagerProducer);
210         mDynamicCodeLoggerProducer = new Singleton<>(dynamicCodeLoggerProducer);
211         mArtManagerServiceProducer = new Singleton<>(
212                 artManagerServiceProducer);
213         mApexManagerProducer = new Singleton<>(apexManagerProducer);
214         mIncrementalManagerProducer = new Singleton<>(
215                 incrementalManagerProducer);
216         mDefaultAppProviderProducer = new Singleton<>(
217                 defaultAppProviderProducer);
218         mDisplayMetricsProducer = new Singleton<>(
219                 displayMetricsProducer);
220         mScanningCachingPackageParserProducer = scanningCachingPackageParserProducer;
221         mScanningPackageParserProducer = scanningPackageParserProducer;
222         mPreparingPackageParserProducer = preparingPackageParserProducer;
223         mPackageInstallerServiceProducer = new Singleton<>(
224                 packageInstallerServiceProducer);
225         mInstantAppResolverConnectionProducer = instantAppResolverConnectionProducer;
226         mModuleInfoProviderProducer = new Singleton<>(
227                 moduleInfoProviderProducer);
228         mLegacyPermissionManagerInternalProducer = new Singleton<>(
229                 legacyPermissionManagerInternalProducer);
230         mSystemWrapper = systemWrapper;
231         mGetLocalServiceProducer = getLocalServiceProducer;
232         mGetSystemServiceProducer = getSystemServiceProducer;
233         mDomainVerificationManagerInternalProducer =
234                 new Singleton<>(
235                         domainVerificationManagerInternalProducer);
236         mHandlerProducer = new Singleton<>(handlerProducer);
237         mIBackupManager = new Singleton<>(iBackupManager);
238         mSharedLibrariesProducer = new Singleton<>(sharedLibrariesProducer);
239         mCrossProfileIntentFilterHelperProducer = new Singleton<>(
240                 crossProfileIntentFilterHelperProducer);
241         mUpdateOwnershipHelperProducer = new Singleton<>(updateOwnershipHelperProducer);
242         mPackageMonitorCallbackHelper = new Singleton<>(packageMonitorCallbackHelper);
243     }
244 
245     /**
246      * Bootstraps this injector with the {@link PackageManagerService instance to which it
247      * belongs.
248      */
bootstrap(PackageManagerService pm)249     public void bootstrap(PackageManagerService pm) {
250         this.mPackageManager = pm;
251     }
252 
getUserManagerInternal()253     public UserManagerInternal getUserManagerInternal() {
254         return getUserManagerService().getInternalForInjectorOnly();
255     }
256 
getAbiHelper()257     public PackageAbiHelper getAbiHelper() {
258         return mAbiHelper;
259     }
260 
getInstallLock()261     public PackageManagerTracedLock getInstallLock() {
262         return mInstallLock;
263     }
264 
getSystemPartitions()265     public List<ScanPartition> getSystemPartitions() {
266         return mSystemPartitions;
267     }
268 
getUserManagerService()269     public UserManagerService getUserManagerService() {
270         return mUserManagerProducer.get(this, mPackageManager);
271     }
272 
getLock()273     public PackageManagerTracedLock getLock() {
274         return mLock;
275     }
276 
277     /**
278      * {@link CrossProfileIntentFilterHelper} which manages {@link CrossProfileIntentFilter}
279      * @return CrossProfileIntentFilterHelper
280      */
getCrossProfileIntentFilterHelper()281     public CrossProfileIntentFilterHelper getCrossProfileIntentFilterHelper() {
282         return mCrossProfileIntentFilterHelperProducer.get(this, mPackageManager);
283     }
284 
getInstaller()285     public Installer getInstaller() {
286         return mInstaller;
287     }
288 
getComponentResolver()289     public ComponentResolver getComponentResolver() {
290         return mComponentResolverProducer.get(this, mPackageManager);
291     }
292 
getPermissionManagerServiceInternal()293     public PermissionManagerServiceInternal getPermissionManagerServiceInternal() {
294         return mPermissionManagerServiceProducer.get(this, mPackageManager);
295     }
296 
getAppOpsManagerInternal()297     public AppOpsManagerInternal getAppOpsManagerInternal() {
298         return mAppOpsManagerInternalProducer.get(this, mPackageManager);
299     }
300 
getContext()301     public Context getContext() {
302         return mContext;
303     }
304 
getSettings()305     public Settings getSettings() {
306         return mSettingsProducer.get(this, mPackageManager);
307     }
308 
getAppsFilter()309     public AppsFilterImpl getAppsFilter() {
310         return mAppsFilterProducer.get(this, mPackageManager);
311     }
312 
getCompatibility()313     public PlatformCompat getCompatibility() {
314         return mPlatformCompatProducer.get(this, mPackageManager);
315     }
316 
getSystemConfig()317     public SystemConfig getSystemConfig() {
318         return mSystemConfigProducer.get(this, mPackageManager);
319     }
320 
getPackageDexOptimizer()321     public PackageDexOptimizer getPackageDexOptimizer() {
322         return mPackageDexOptimizerProducer.get(this, mPackageManager);
323     }
324 
getDexManager()325     public DexManager getDexManager() {
326         return mDexManagerProducer.get(this, mPackageManager);
327     }
328 
getDynamicCodeLogger()329     public DynamicCodeLogger getDynamicCodeLogger() {
330         return mDynamicCodeLoggerProducer.get(this, mPackageManager);
331     }
332 
getArtManagerService()333     public ArtManagerService getArtManagerService() {
334         return mArtManagerServiceProducer.get(this, mPackageManager);
335     }
336 
getApexManager()337     public ApexManager getApexManager() {
338         return mApexManagerProducer.get(this, mPackageManager);
339     }
340 
getBackgroundHandler()341     public Handler getBackgroundHandler() {
342         return mBackgroundHandler;
343     }
344 
getBackgroundExecutor()345     public Executor getBackgroundExecutor() {
346         return mBackgroundExecutor;
347     }
348 
getDisplayMetrics()349     public DisplayMetrics getDisplayMetrics() {
350         return mDisplayMetricsProducer.get(this, mPackageManager);
351     }
352 
getLocalService(Class<T> c)353     public <T> T getLocalService(Class<T> c) {
354         return mGetLocalServiceProducer.produce(c);
355     }
356 
getSystemService(Class<T> c)357     public <T> T getSystemService(Class<T> c) {
358         return mGetSystemServiceProducer.produce(c);
359     }
360 
getSystemWrapper()361     public SystemWrapper getSystemWrapper() {
362         return mSystemWrapper;
363     }
364 
getIncrementalManager()365     public IncrementalManager getIncrementalManager() {
366         return mIncrementalManagerProducer.get(this, mPackageManager);
367     }
368 
getDefaultAppProvider()369     public DefaultAppProvider getDefaultAppProvider() {
370         return mDefaultAppProviderProducer.get(this, mPackageManager);
371     }
372 
getScanningCachingPackageParser()373     public PackageParser2 getScanningCachingPackageParser() {
374         return mScanningCachingPackageParserProducer.produce(this, mPackageManager);
375     }
376 
getScanningPackageParser()377     public PackageParser2 getScanningPackageParser() {
378         return mScanningPackageParserProducer.produce(this, mPackageManager);
379     }
380 
getPreparingPackageParser()381     public PackageParser2 getPreparingPackageParser() {
382         return mPreparingPackageParserProducer.produce(this, mPackageManager);
383     }
384 
getPackageInstallerService()385     public PackageInstallerService getPackageInstallerService() {
386         return mPackageInstallerServiceProducer.get(this, mPackageManager);
387     }
388 
getInstantAppResolverConnection( ComponentName instantAppResolverComponent)389     public InstantAppResolverConnection getInstantAppResolverConnection(
390             ComponentName instantAppResolverComponent) {
391         return mInstantAppResolverConnectionProducer.produce(
392                 this, mPackageManager, instantAppResolverComponent);
393     }
394 
getModuleInfoProvider()395     public ModuleInfoProvider getModuleInfoProvider() {
396         return mModuleInfoProviderProducer.get(this, mPackageManager);
397     }
398 
getLegacyPermissionManagerInternal()399     public LegacyPermissionManagerInternal getLegacyPermissionManagerInternal() {
400         return mLegacyPermissionManagerInternalProducer.get(this, mPackageManager);
401     }
402 
getDomainVerificationManagerInternal()403     public DomainVerificationManagerInternal getDomainVerificationManagerInternal() {
404         return mDomainVerificationManagerInternalProducer.get(this, mPackageManager);
405     }
406 
getHandler()407     public Handler getHandler() {
408         return mHandlerProducer.get(this, mPackageManager);
409     }
410 
getActivityManagerInternal()411     public ActivityManagerInternal getActivityManagerInternal() {
412         return getLocalService(ActivityManagerInternal.class);
413     }
414 
getIBackupManager()415     public IBackupManager getIBackupManager() {
416         return mIBackupManager.get(this, mPackageManager);
417     }
418 
getSharedLibrariesImpl()419     public SharedLibrariesImpl getSharedLibrariesImpl() {
420         return mSharedLibrariesProducer.get(this, mPackageManager);
421     }
422 
getUpdateOwnershipHelper()423     public UpdateOwnershipHelper getUpdateOwnershipHelper() {
424         return mUpdateOwnershipHelperProducer.get(this, mPackageManager);
425     }
426 
getPackageMonitorCallbackHelper()427     public PackageMonitorCallbackHelper getPackageMonitorCallbackHelper() {
428         return mPackageMonitorCallbackHelper.get(this, mPackageManager);
429     }
430 
431 
432     /** Provides an abstraction to static access to system state. */
433     public interface SystemWrapper {
disablePackageCaches()434         void disablePackageCaches();
enablePackageCaches()435         void enablePackageCaches();
436     }
437 }
438