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