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

Commit 190819a3 authored by Winson's avatar Winson
Browse files

Remove some read only usages of PackageManagerService mLock

In most non-install, non-mutate areas, migrates away from locking
PackageManagerService directly in favor of the Computer snapshot.

This will relieve more lock contention and allow scoping
PackageSetting to mutate-only scenarios, such as install.

Bug: 202291449

Change-Id: Ie92ebfeacdc4a00484373f11739fdfe3c3897a7f
parent 8a17328a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -663,6 +663,9 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP

    public abstract @Nullable PackageState getPackageState(@NonNull String packageName);

    @NonNull
    public abstract ArrayMap<String, ? extends PackageStateInternal> getPackageStates();

    /**
     * Returns a package for the given UID. If the UID is part of a shared user ID, one
     * of the packages will be chosen to be returned.
@@ -909,7 +912,7 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP
     *               functionality of the other forEach methods, for eventual migration.
     * @param action action to be performed
     */
    public abstract void forEachPackageState(boolean locked, Consumer<PackageState> action);
    public abstract void forEachPackageState(boolean locked, Consumer<PackageStateInternal> action);

    /**
     * Perform the given action for each installed package for a user.
+5 −4
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ import com.android.server.am.ActivityManagerService.ProcessChangeItem;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.dex.DexManager;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.WindowManagerService;
import com.android.server.wm.WindowProcessController;
@@ -2296,13 +2297,13 @@ public final class ProcessList {
        Map<String, Pair<String, Long>> result = new ArrayMap<>(packages.length);
        int userId = UserHandle.getUserId(uid);
        for (String packageName : packages) {
            AndroidPackage androidPackage = pmInt.getPackage(packageName);
            if (androidPackage == null) {
            final PackageStateInternal packageState = pmInt.getPackageStateInternal(packageName);
            if (packageState == null) {
                Slog.w(TAG, "Unknown package:" + packageName);
                continue;
            }
            String volumeUuid = androidPackage.getVolumeUuid();
            long inode = pmInt.getCeDataInode(packageName, userId);
            String volumeUuid = packageState.getVolumeUuid();
            long inode = packageState.getUserStateOrDefault(userId).getCeDataInode();
            if (inode == 0) {
                Slog.w(TAG, packageName + " inode == 0 (b/152760674)");
                return null;
+10 −4
Original line number Diff line number Diff line
@@ -500,11 +500,17 @@ public class AppsFilter implements Watchable, Snappable {
                forcedQueryablePackageNames[i] = forcedQueryablePackageNames[i].intern();
            }
        }
        final StateProvider stateProvider = command -> {
            synchronized (injector.getLock()) {
                command.currentState(injector.getSettings().getPackagesLocked().untrackedStorage(),
        final StateProvider stateProvider = new StateProvider() {
            // TODO: This lock and its handling should be owned by AppsFilter
            private final Object mLock = new Object();

            @Override
            public void runWithState(CurrentStateCallback command) {
                synchronized (mLock) {
                    command.currentState(pms.getPackageStates(),
                            injector.getUserManagerInternal().getUserInfos());
                }
            }
        };
        AppsFilter appsFilter = new AppsFilter(stateProvider, featureConfig,
                forcedQueryablePackageNames, forceSystemAppsQueryable, null,
+350 −7
Original line number Diff line number Diff line
@@ -22,22 +22,35 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.InstallSourceInfo;
import android.content.pm.InstrumentationInfo;
import android.content.pm.KeySet;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ProcessInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.SigningDetails;
import android.content.pm.UserInfo;
import android.content.pm.VersionedPackage;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseArray;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedLongSparseArray;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -46,6 +59,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;
import java.util.Set;

/**
 * A {@link Computer} provides a set of functions that can operate on live data or snapshot
@@ -83,6 +97,7 @@ import java.util.List;
 */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public interface Computer {

    /**
     * Every method must be annotated.
     */
@@ -141,7 +156,7 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
    AndroidPackage getPackage(int uid);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    ApplicationInfo generateApplicationInfoFromSettingsLPw(String packageName, int flags,
    ApplicationInfo generateApplicationInfoFromSettings(String packageName, int flags,
            int filterCallingUid, int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    ApplicationInfo getApplicationInfo(String packageName, int flags, int userId);
@@ -171,6 +186,15 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    PackageInfo getPackageInfoInternal(String packageName, long versionCode, int flags,
            int filterCallingUid, int userId);

    /**
     * @return package names of all available {@link AndroidPackage} instances. This means any
     * known {@link PackageState} instances without a {@link PackageState#getAndroidPackage()}
     * will not be represented.
     */
    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
    String[] getAllAvailablePackageNames();

    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    PackageStateInternal getPackageStateInternal(String packageName);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
@@ -185,11 +209,11 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    ServiceInfo getServiceInfo(ComponentName component, int flags, int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    SharedLibraryInfo getSharedLibraryInfoLPr(String name, long version);
    SharedLibraryInfo getSharedLibraryInfo(String name, long version);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
    String getInstantAppPackageName(int callingUid);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    String resolveExternalPackageNameLPr(AndroidPackage pkg);
    String resolveExternalPackageName(AndroidPackage pkg);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    String resolveInternalPackageNameLPr(String packageName, long versionCode);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
@@ -199,7 +223,7 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean canViewInstantApps(int callingUid, int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean filterSharedLibPackageLPr(@Nullable PackageStateInternal ps, int uid, int userId,
    boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, int userId,
            int flags);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean isCallerSameApp(String packageName, int uid);
@@ -218,14 +242,14 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean isSameProfileGroup(@UserIdInt int callerUserId, @UserIdInt int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean shouldFilterApplicationLocked(@Nullable PackageStateInternal ps, int callingUid,
    boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid,
            @Nullable ComponentName component, @PackageManager.ComponentType int componentType,
            int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean shouldFilterApplicationLocked(@Nullable PackageStateInternal ps, int callingUid,
    boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid,
            int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    boolean shouldFilterApplicationLocked(@NonNull SharedUserSetting sus, int callingUid,
    boolean shouldFilterApplication(@NonNull SharedUserSetting sus, int callingUid,
            int userId);
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    int checkUidPermission(String permName, int uid);
@@ -272,4 +296,323 @@ public interface Computer {
    @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
    ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, int flags,
            List<ResolveInfo> query, boolean debug, int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    PreferredIntentResolver getPreferredActivities(@UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    ArrayMap<String, ? extends PackageStateInternal> getPackageStates();

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    String getRenamedPackage(@NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries();

    /**
     * @return set of packages to notify
     */
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @PackageManagerService.PackageStartability
    int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isPackageAvailable(String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    String[] currentToCanonicalPackageNames(@NonNull String[] names);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    String[] canonicalToCurrentPackageNames(@NonNull String[] names);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    int[] getPackageGids(@NonNull String packageName, int flags, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int getTargetSdkVersion(@NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
            @NonNull ComponentName component, @NonNull Intent intent, String resolvedType);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    ActivityInfo getReceiverInfo(@NonNull ComponentName component, int flags,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
            int flags, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
            int userId, boolean throwIfPermNotDeclared);

    @Computer.LiveImplementation(override = LiveImplementation.NOT_ALLOWED)
    boolean isInstallDisabledForPackage(@NonNull String packageName, int uid,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
            int flags, int callingUid, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
            @NonNull String packageName, int flags, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    ProviderInfo getProviderInfo(@NonNull ComponentName component, int flags,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    String[] getSystemSharedLibraryNames();

    /**
     * @return if the given package has a state and isn't filtered by visibility. Provides no
     * guarantee that the package is in any usable state.
     */
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isPackageStateAvailableAndVisible(@NonNull String packageName, int callingUid,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int checkSignatures(@NonNull String pkg1, @NonNull String pkg2);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int checkUidSignatures(int uid1, int uid2);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
            @PackageManager.CertificateInputType int type);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
            @PackageManager.CertificateInputType int type);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    List<String> getAllPackages();

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    String getNameForUid(int uid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    String[] getNamesForUids(@NonNull int[] uids);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int getUidForSharedUser(@NonNull String sharedUserName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int getFlagsForUid(int uid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int getPrivateFlagsForUid(int uid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isUidPrivileged(int uid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    String[] getAppOpPermissionPackages(@NonNull String permissionName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(@NonNull String[] permissions,
            int flags, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    List<ApplicationInfo> getInstalledApplications(int flags, @UserIdInt int userId,
            int callingUid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    ProviderInfo resolveContentProvider(@NonNull String name, int flags,
            @UserIdInt int userId, int callingUid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
            @NonNull String visibleAuthority);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
            @NonNull List<ProviderInfo> outInfo);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, int uid,
            int flags, @Nullable String metaDataKey);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    ParceledListSlice<InstrumentationInfo> queryInstrumentation(
            @NonNull String targetPackage, int flags);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    List<PackageStateInternal> findSharedNonSystemLibraries(
            @NonNull PackageStateInternal pkgSetting);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, @UserIdInt int[] userIds,
            boolean isInstantApp);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    String getInstallerPackageName(@NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    InstallSourceInfo getInstallSourceInfo(@NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @PackageManager.EnabledState
    int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @PackageManager.EnabledState
    int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
            @UserIdInt int userId);

    /**
     * @return true if the runtime app user enabled state, runtime component user enabled state,
     * install-time app manifest enabled state, and install-time component manifest enabled state
     * are all effectively enabled for the given component. Or if the component cannot be found,
     * returns false.
     */
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    KeySet getSigningKeySet(@NonNull String packageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId);

    /**
     * Returns whether the given UID either declares &lt;queries&gt; element with the given package
     * name in its app's manifest, has {@link android.Manifest.permission.QUERY_ALL_PACKAGES}, or
     * package visibility filtering is enabled on it. If the UID is part of a shared user ID,
     * return {@code true} if any one application belongs to the shared user ID meets the criteria.
     */
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean canQueryPackage(int callingUid, @Nullable String targetPackageName);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int getPackageUid(@NonNull String packageName, int flags, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @PackageManager.InstallReason
    int getInstallReason(@NonNull String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName,
            @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
            @UserIdInt int sourceUserId, @UserIdInt int targetUserId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    SparseArray<String> getAppsWithSharedUserIds();

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    String[] getSharedUserPackagesForPackage(@NonNull String packageName, @UserIdInt int userId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    Set<String> getUnusedPackages(long downgradeTimeThresholdMillis);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @Nullable
    CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId);

    /**
     * Only keep package names that refer to {@link AndroidPackage#isSystem system} packages.
     *
     * @param pkgNames The packages to filter
     *
     * @return The filtered packages
     */
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    String[] filterOnlySystemPackages(@Nullable String... pkgNames);

    // The methods in this block should be removed once SettingBase is interface snapshotted
    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    @NonNull
    List<AndroidPackage> getPackagesForAppId(int appId);

    @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
    int getUidTargetSdkVersion(int uid);

    @Nullable
    ArrayMap<String, ProcessInfo> getProcessesForUid(int uid);
    // End block
}
Loading