Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 693002c1 authored by Oli Lan's avatar Oli Lan Committed by Android (Google) Code Review
Browse files

Merge "Make ApexManager a singleton."

parents 1473439a be7a4236
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.os.Environment;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.sysprop.ApexProperties;
import android.util.Singleton;
import android.util.Slog;

import com.android.internal.annotations.GuardedBy;
@@ -65,23 +66,32 @@ abstract class ApexManager {
    static final int MATCH_ACTIVE_PACKAGE = 1 << 0;
    static final int MATCH_FACTORY_PACKAGE = 1 << 1;

    /**
     * Returns an instance of either {@link ApexManagerImpl} or {@link ApexManagerFlattenedApex}
     * depending on whether this device supports APEX, i.e. {@link ApexProperties#updatable()}
     * evaluates to {@code true}.
     */
    static ApexManager create(Context systemContext) {
    private static final Singleton<ApexManager> sApexManagerSingleton =
            new Singleton<ApexManager>() {
                @Override
                protected ApexManager create() {
                    if (ApexProperties.updatable().orElse(false)) {
                        try {
                return new ApexManagerImpl(systemContext, IApexService.Stub.asInterface(
                            return new ApexManagerImpl(IApexService.Stub.asInterface(
                                    ServiceManager.getServiceOrThrow("apexservice")));
                        } catch (ServiceManager.ServiceNotFoundException e) {
                throw new IllegalStateException("Required service apexservice not available");
                            throw new IllegalStateException(
                                    "Required service apexservice not available");
                        }
                    } else {
                        return new ApexManagerFlattenedApex();
                    }
                }
            };

    /**
     * Returns an instance of either {@link ApexManagerImpl} or {@link ApexManagerFlattenedApex}
     * depending on whether this device supports APEX, i.e. {@link ApexProperties#updatable()}
     * evaluates to {@code true}.
     */
    static ApexManager getInstance() {
        return sApexManagerSingleton.get();
    }

    /**
     * Minimal information about APEX mount points and the original APEX package they refer to.
@@ -101,7 +111,7 @@ abstract class ApexManager {
     */
    abstract List<ActiveApexInfo> getActiveApexInfos();

    abstract void systemReady();
    abstract void systemReady(Context context);

    /**
     * Retrieves information about an APEX package.
@@ -248,7 +258,6 @@ abstract class ApexManager {
    @VisibleForTesting
    static class ApexManagerImpl extends ApexManager {
        private final IApexService mApexService;
        private final Context mContext;
        private final Object mLock = new Object();
        /**
         * A map from {@code APEX packageName} to the {@Link PackageInfo} generated from the {@code
@@ -260,8 +269,7 @@ abstract class ApexManager {
        @GuardedBy("mLock")
        private List<PackageInfo> mAllPackagesCache;

        ApexManagerImpl(Context context, IApexService apexService) {
            mContext = context;
        ApexManagerImpl(IApexService apexService) {
            mApexService = apexService;
        }

@@ -302,14 +310,14 @@ abstract class ApexManager {
        }

        @Override
        void systemReady() {
            mContext.registerReceiver(new BroadcastReceiver() {
        void systemReady(Context context) {
            context.registerReceiver(new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    // Post populateAllPackagesCacheIfNeeded to a background thread, since it's
                    // expensive to run it in broadcast handler thread.
                    BackgroundThread.getHandler().post(() -> populateAllPackagesCacheIfNeeded());
                    mContext.unregisterReceiver(this);
                    context.unregisterReceiver(this);
                }
            }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED));
        }
@@ -643,7 +651,7 @@ abstract class ApexManager {
        }

        @Override
        void systemReady() {
        void systemReady(Context context) {
            // No-op
        }

+2 −2
Original line number Diff line number Diff line
@@ -2605,7 +2605,7 @@ public class PackageManagerService extends IPackageManager.Stub
        mProtectedPackages = new ProtectedPackages(mContext);
        mApexManager = ApexManager.create(mContext);
        mApexManager = ApexManager.getInstance();
        mAppsFilter = mInjector.getAppsFilter();
        mDirsToScanAsSystem = new ArrayList<>();
@@ -20371,7 +20371,7 @@ public class PackageManagerService extends IPackageManager.Stub
        storage.registerListener(mStorageListener);
        mInstallerService.systemReady();
        mApexManager.systemReady();
        mApexManager.systemReady(mContext);
        mPackageDexOptimizer.systemReady();
        mInjector.getStorageManagerInternal().addExternalStoragePolicy(
+1 −1
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ public class ApexManagerTest {
    @Before
    public void setUp() throws RemoteException {
        mContext = InstrumentationRegistry.getInstrumentation().getContext();
        mApexManager = new ApexManager.ApexManagerImpl(mContext, mApexService);
        mApexManager = new ApexManager.ApexManagerImpl(mApexService);
    }

    @Test