Loading services/core/java/com/android/server/pm/ApexManager.java +36 −23 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; import java.io.File; Loading @@ -48,7 +49,9 @@ import java.util.stream.Collectors; class ApexManager { static final String TAG = "ApexManager"; private final IApexService mApexService; private final Map<String, PackageInfo> mActivePackagesCache; private final Object mLock = new Object(); @GuardedBy("mLock") private Map<String, PackageInfo> mActivePackagesCache; ApexManager() { try { Loading @@ -57,11 +60,13 @@ class ApexManager { } catch (ServiceNotFoundException e) { throw new IllegalStateException("Required service apexservice not available"); } mActivePackagesCache = populateActivePackagesCache(); } @NonNull private Map<String, PackageInfo> populateActivePackagesCache() { private void populateActivePackagesCacheIfNeeded() { synchronized (mLock) { if (mActivePackagesCache != null) { return; } try { List<PackageInfo> list = new ArrayList<>(); final ApexInfo[] activePkgs = mApexService.getActivePackages(); Loading @@ -78,12 +83,14 @@ class ApexManager { throw new IllegalStateException("Unable to parse: " + ai, pe); } } return list.stream().collect(Collectors.toMap(p -> p.packageName, Function.identity())); mActivePackagesCache = list.stream().collect( Collectors.toMap(p -> p.packageName, Function.identity())); } catch (RemoteException re) { Slog.e(TAG, "Unable to retrieve packages from apexservice: " + re.toString()); throw new RuntimeException(re); } } } /** * Retrieves information about an active APEX package. Loading @@ -96,6 +103,7 @@ class ApexManager { * is not found. */ @Nullable PackageInfo getActivePackage(String packageName) { populateActivePackagesCacheIfNeeded(); return mActivePackagesCache.get(packageName); } Loading @@ -106,6 +114,7 @@ class ApexManager { * active package. */ Collection<PackageInfo> getActivePackages() { populateActivePackagesCacheIfNeeded(); return mActivePackagesCache.values(); } Loading Loading @@ -217,7 +226,7 @@ class ApexManager { ipw.println("Active APEX packages:"); ipw.increaseIndent(); try { populateActivePackagesCache(); populateActivePackagesCacheIfNeeded(); for (PackageInfo pi : mActivePackagesCache.values()) { if (packageName != null && !packageName.equals(pi.packageName)) { continue; Loading Loading @@ -254,4 +263,8 @@ class ApexManager { ipw.println("Couldn't communicate with apexd."); } } public void onBootCompleted() { populateActivePackagesCacheIfNeeded(); } } services/core/java/com/android/server/pm/PackageInstallerService.java +4 −2 Original line number Diff line number Diff line Loading @@ -209,8 +209,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mStagingManager = new StagingManager(pm, this, am); } private void setBootCompleted() { private void onBootCompleted() { mBootCompleted = true; // Tell APEX manager about it as well mApexManager.onBootCompleted(); } boolean isBootCompleted() { Loading @@ -223,7 +225,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { setBootCompleted(); onBootCompleted(); mContext.unregisterReceiver(this); } }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); Loading Loading
services/core/java/com/android/server/pm/ApexManager.java +36 −23 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; import java.io.File; Loading @@ -48,7 +49,9 @@ import java.util.stream.Collectors; class ApexManager { static final String TAG = "ApexManager"; private final IApexService mApexService; private final Map<String, PackageInfo> mActivePackagesCache; private final Object mLock = new Object(); @GuardedBy("mLock") private Map<String, PackageInfo> mActivePackagesCache; ApexManager() { try { Loading @@ -57,11 +60,13 @@ class ApexManager { } catch (ServiceNotFoundException e) { throw new IllegalStateException("Required service apexservice not available"); } mActivePackagesCache = populateActivePackagesCache(); } @NonNull private Map<String, PackageInfo> populateActivePackagesCache() { private void populateActivePackagesCacheIfNeeded() { synchronized (mLock) { if (mActivePackagesCache != null) { return; } try { List<PackageInfo> list = new ArrayList<>(); final ApexInfo[] activePkgs = mApexService.getActivePackages(); Loading @@ -78,12 +83,14 @@ class ApexManager { throw new IllegalStateException("Unable to parse: " + ai, pe); } } return list.stream().collect(Collectors.toMap(p -> p.packageName, Function.identity())); mActivePackagesCache = list.stream().collect( Collectors.toMap(p -> p.packageName, Function.identity())); } catch (RemoteException re) { Slog.e(TAG, "Unable to retrieve packages from apexservice: " + re.toString()); throw new RuntimeException(re); } } } /** * Retrieves information about an active APEX package. Loading @@ -96,6 +103,7 @@ class ApexManager { * is not found. */ @Nullable PackageInfo getActivePackage(String packageName) { populateActivePackagesCacheIfNeeded(); return mActivePackagesCache.get(packageName); } Loading @@ -106,6 +114,7 @@ class ApexManager { * active package. */ Collection<PackageInfo> getActivePackages() { populateActivePackagesCacheIfNeeded(); return mActivePackagesCache.values(); } Loading Loading @@ -217,7 +226,7 @@ class ApexManager { ipw.println("Active APEX packages:"); ipw.increaseIndent(); try { populateActivePackagesCache(); populateActivePackagesCacheIfNeeded(); for (PackageInfo pi : mActivePackagesCache.values()) { if (packageName != null && !packageName.equals(pi.packageName)) { continue; Loading Loading @@ -254,4 +263,8 @@ class ApexManager { ipw.println("Couldn't communicate with apexd."); } } public void onBootCompleted() { populateActivePackagesCacheIfNeeded(); } }
services/core/java/com/android/server/pm/PackageInstallerService.java +4 −2 Original line number Diff line number Diff line Loading @@ -209,8 +209,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mStagingManager = new StagingManager(pm, this, am); } private void setBootCompleted() { private void onBootCompleted() { mBootCompleted = true; // Tell APEX manager about it as well mApexManager.onBootCompleted(); } boolean isBootCompleted() { Loading @@ -223,7 +225,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mContext.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { setBootCompleted(); onBootCompleted(); mContext.unregisterReceiver(this); } }, new IntentFilter(Intent.ACTION_BOOT_COMPLETED)); Loading