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

Commit b3df7130 authored by Winson Chiu's avatar Winson Chiu Committed by Android (Google) Code Review
Browse files

Merge changes Iff6b800d,I2a915e55

* changes:
  Remove AndroidPackage#isSystem
  Remove AndroidPackage#is_ partition APIs
parents 7e23f541 7c3d904f
Loading
Loading
Loading
Loading
+10 −8
Original line number Original line Diff line number Diff line
@@ -161,6 +161,7 @@ import com.android.server.pm.PackageList;
import com.android.server.pm.UserManagerInternal;
import com.android.server.pm.UserManagerInternal;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.component.ParsedAttribution;
import com.android.server.pm.pkg.component.ParsedAttribution;
import com.android.server.policy.AppOpsPolicy;
import com.android.server.policy.AppOpsPolicy;


@@ -3590,11 +3591,11 @@ public class AppOpsService extends IAppOpsService.Stub implements PersistenceSch
     *
     *
     * @return The restriction matching the package
     * @return The restriction matching the package
     */
     */
    private RestrictionBypass getBypassforPackage(@NonNull AndroidPackage pkg) {
    private RestrictionBypass getBypassforPackage(@NonNull PackageState packageState) {
        return new RestrictionBypass(pkg.getUid() == Process.SYSTEM_UID, pkg.isPrivileged(),
        return new RestrictionBypass(packageState.getAppId() == Process.SYSTEM_UID,
                mContext.checkPermission(android.Manifest.permission
                packageState.isPrivileged(), mContext.checkPermission(
                        .EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS, -1, pkg.getUid())
                android.Manifest.permission.EXEMPT_FROM_AUDIO_RECORD_RESTRICTIONS, -1,
                == PackageManager.PERMISSION_GRANTED);
                packageState.getAppId()) == PackageManager.PERMISSION_GRANTED);
    }
    }


    /**
    /**
@@ -3690,11 +3691,12 @@ public class AppOpsService extends IAppOpsService.Stub implements PersistenceSch
        final long ident = Binder.clearCallingIdentity();
        final long ident = Binder.clearCallingIdentity();
        try {
        try {
            PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class);
            PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class);
            AndroidPackage pkg = pmInt.getPackage(packageName);
            var pkgState = pmInt.getPackageStateInternal(packageName);
            var pkg = pkgState == null ? null : pkgState.getAndroidPackage();
            if (pkg != null) {
            if (pkg != null) {
                isAttributionTagValid = isAttributionInPackage(pkg, attributionTag);
                isAttributionTagValid = isAttributionInPackage(pkg, attributionTag);
                pkgUid = UserHandle.getUid(userId, UserHandle.getAppId(pkg.getUid()));
                pkgUid = UserHandle.getUid(userId, pkgState.getAppId());
                bypass = getBypassforPackage(pkg);
                bypass = getBypassforPackage(pkgState);
            }
            }
            if (!isAttributionTagValid) {
            if (!isAttributionTagValid) {
                AndroidPackage proxyPkg = proxyPackageName != null
                AndroidPackage proxyPkg = proxyPackageName != null
+19 −14
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.android.server.om.OverlayManagerService.TAG;


import android.annotation.IntDef;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.content.om.OverlayInfo;
import android.content.om.OverlayInfo;
import android.content.om.OverlayableInfo;
import android.content.om.OverlayableInfo;
import android.os.Build.VERSION_CODES;
import android.os.Build.VERSION_CODES;
@@ -32,6 +33,7 @@ import android.text.TextUtils;
import android.util.Slog;
import android.util.Slog;


import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;


import java.io.IOException;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
@@ -99,16 +101,17 @@ final class IdmapManager {
     * </ul>.
     * </ul>.
     */
     */
    @IdmapStatus int createIdmap(@NonNull final AndroidPackage targetPackage,
    @IdmapStatus int createIdmap(@NonNull final AndroidPackage targetPackage,
            @NonNull final AndroidPackage overlayPackage, String overlayBasePath,
            @NonNull PackageState overlayPackageState, @NonNull final AndroidPackage overlayPackage,
            String overlayName, int userId) {
            String overlayBasePath, String overlayName, @UserIdInt int userId) {
        if (DEBUG) {
        if (DEBUG) {
            Slog.d(TAG, "create idmap for " + targetPackage.getPackageName() + " and "
            Slog.d(TAG, "create idmap for " + targetPackage.getPackageName() + " and "
                    + overlayPackage.getPackageName());
                    + overlayPackage.getPackageName());
        }
        }
        final String targetPath = targetPackage.getBaseApkPath();
        final String targetPath = targetPackage.getSplits().get(0).getPath();
        try {
        try {
            int policies = calculateFulfilledPolicies(targetPackage, overlayPackage, userId);
            int policies = calculateFulfilledPolicies(targetPackage, overlayPackageState,
            boolean enforce = enforceOverlayable(overlayPackage);
                    overlayPackage, userId);
            boolean enforce = enforceOverlayable(overlayPackageState, overlayPackage);
            if (mIdmapDaemon.verifyIdmap(targetPath, overlayBasePath, overlayName, policies,
            if (mIdmapDaemon.verifyIdmap(targetPath, overlayBasePath, overlayName, policies,
                    enforce, userId)) {
                    enforce, userId)) {
                return IDMAP_IS_VERIFIED;
                return IDMAP_IS_VERIFIED;
@@ -174,13 +177,14 @@ final class IdmapManager {
     * Checks if overlayable and policies should be enforced on the specified overlay for backwards
     * Checks if overlayable and policies should be enforced on the specified overlay for backwards
     * compatibility with pre-Q overlays.
     * compatibility with pre-Q overlays.
     */
     */
    private boolean enforceOverlayable(@NonNull final AndroidPackage overlayPackage) {
    private boolean enforceOverlayable(@NonNull PackageState overlayPackageState,
            @NonNull final AndroidPackage overlayPackage) {
        if (overlayPackage.getTargetSdkVersion() >= VERSION_CODES.Q) {
        if (overlayPackage.getTargetSdkVersion() >= VERSION_CODES.Q) {
            // Always enforce policies for overlays targeting Q+.
            // Always enforce policies for overlays targeting Q+.
            return true;
            return true;
        }
        }


        if (overlayPackage.isVendor()) {
        if (overlayPackageState.isVendor()) {
            // If the overlay is on a pre-Q vendor partition, do not enforce overlayable
            // If the overlay is on a pre-Q vendor partition, do not enforce overlayable
            // restrictions on this overlay because the pre-Q platform has no understanding of
            // restrictions on this overlay because the pre-Q platform has no understanding of
            // overlayable.
            // overlayable.
@@ -189,14 +193,15 @@ final class IdmapManager {


        // Do not enforce overlayable restrictions on pre-Q overlays that are signed with the
        // Do not enforce overlayable restrictions on pre-Q overlays that are signed with the
        // platform signature or that are preinstalled.
        // platform signature or that are preinstalled.
        return !(overlayPackage.isSystem() || overlayPackage.isSignedWithPlatformKey());
        return !(overlayPackageState.isSystem() || overlayPackage.isSignedWithPlatformKey());
    }
    }


    /**
    /**
     * Retrieves a bitmask for idmap2 that represents the policies the overlay fulfills.
     * Retrieves a bitmask for idmap2 that represents the policies the overlay fulfills.
     */
     */
    private int calculateFulfilledPolicies(@NonNull final AndroidPackage targetPackage,
    private int calculateFulfilledPolicies(@NonNull final AndroidPackage targetPackage,
            @NonNull final AndroidPackage overlayPackage, int userId)  {
            @NonNull PackageState overlayPackageState, @NonNull final AndroidPackage overlayPackage,
            @UserIdInt int userId)  {
        int fulfilledPolicies = OverlayablePolicy.PUBLIC;
        int fulfilledPolicies = OverlayablePolicy.PUBLIC;


        // Overlay matches target signature
        // Overlay matches target signature
@@ -221,28 +226,28 @@ final class IdmapManager {
        }
        }


        // Vendor partition (/vendor)
        // Vendor partition (/vendor)
        if (overlayPackage.isVendor()) {
        if (overlayPackageState.isVendor()) {
            return fulfilledPolicies | OverlayablePolicy.VENDOR_PARTITION;
            return fulfilledPolicies | OverlayablePolicy.VENDOR_PARTITION;
        }
        }


        // Product partition (/product)
        // Product partition (/product)
        if (overlayPackage.isProduct()) {
        if (overlayPackageState.isProduct()) {
            return fulfilledPolicies | OverlayablePolicy.PRODUCT_PARTITION;
            return fulfilledPolicies | OverlayablePolicy.PRODUCT_PARTITION;
        }
        }


        // Odm partition (/odm)
        // Odm partition (/odm)
        if (overlayPackage.isOdm()) {
        if (overlayPackageState.isOdm()) {
            return fulfilledPolicies | OverlayablePolicy.ODM_PARTITION;
            return fulfilledPolicies | OverlayablePolicy.ODM_PARTITION;
        }
        }


        // Oem partition (/oem)
        // Oem partition (/oem)
        if (overlayPackage.isOem()) {
        if (overlayPackageState.isOem()) {
            return fulfilledPolicies | OverlayablePolicy.OEM_PARTITION;
            return fulfilledPolicies | OverlayablePolicy.OEM_PARTITION;
        }
        }


        // System_ext partition (/system_ext) is considered as system
        // System_ext partition (/system_ext) is considered as system
        // Check this last since every partition except for data is scanned as system in the PMS.
        // Check this last since every partition except for data is scanned as system in the PMS.
        if (overlayPackage.isSystem() || overlayPackage.isSystemExt()) {
        if (overlayPackageState.isSystem() || overlayPackageState.isSystemExt()) {
            return fulfilledPolicies | OverlayablePolicy.SYSTEM_PARTITION;
            return fulfilledPolicies | OverlayablePolicy.SYSTEM_PARTITION;
        }
        }


+7 −8
Original line number Original line Diff line number Diff line
@@ -28,7 +28,6 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
import com.android.internal.util.CollectionUtils;
import com.android.server.pm.pkg.AndroidPackage;


import java.io.IOException;
import java.io.IOException;
import java.util.List;
import java.util.List;
@@ -112,13 +111,13 @@ public class OverlayActorEnforcer {
        }
        }


        final String targetPackageName = overlayInfo.targetPackageName;
        final String targetPackageName = overlayInfo.targetPackageName;
        final AndroidPackage targetPkgInfo = mPackageManager.getPackageForUser(targetPackageName,
        var targetPkgState = mPackageManager.getPackageStateForUser(targetPackageName, userId);
                userId);
        var targetPkg = targetPkgState == null ? null : targetPkgState.getAndroidPackage();
        if (targetPkgInfo == null) {
        if (targetPkg == null) {
            return ActorState.TARGET_NOT_FOUND;
            return ActorState.TARGET_NOT_FOUND;
        }
        }


        if (targetPkgInfo.isDebuggable()) {
        if (targetPkg.isDebuggable()) {
            return ActorState.ALLOWED;
            return ActorState.ALLOWED;
        }
        }


@@ -189,13 +188,13 @@ public class OverlayActorEnforcer {
        }
        }


        String actorPackageName = actorUriPair.first;
        String actorPackageName = actorUriPair.first;
        AndroidPackage actorPackage = mPackageManager.getPackageForUser(actorPackageName, userId);
        var actorPackageState = mPackageManager.getPackageStateForUser(actorPackageName, userId);
        if (actorPackage == null) {
        if (actorPackageState == null || actorPackageState.getAndroidPackage() == null) {
            return ActorState.ACTOR_NOT_FOUND;
            return ActorState.ACTOR_NOT_FOUND;
        }
        }


        // Currently only pre-installed apps can be actors
        // Currently only pre-installed apps can be actors
        if (!actorPackage.isSystem()) {
        if (!actorPackageState.isSystem()) {
            return ActorState.ACTOR_NOT_PREINSTALLED;
            return ActorState.ACTOR_NOT_PREINSTALLED;
        }
        }


+53 −47
Original line number Original line Diff line number Diff line
@@ -91,7 +91,7 @@ import com.android.server.SystemConfig;
import com.android.server.SystemService;
import com.android.server.SystemService;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;


import libcore.util.EmptyArray;
import libcore.util.EmptyArray;


@@ -426,9 +426,9 @@ public final class OverlayManagerService extends SystemService {
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageAdded " + packageName);
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageAdded " + packageName);
                for (final int userId : userIds) {
                for (final int userId : userIds) {
                    synchronized (mLock) {
                    synchronized (mLock) {
                        final AndroidPackage pkg = mPackageManager.onPackageAdded(
                        var packageState = mPackageManager.onPackageAdded(packageName, userId);
                                packageName, userId);
                        if (packageState != null && !mPackageManager.isInstantApp(packageName,
                        if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) {
                                userId)) {
                            try {
                            try {
                                updateTargetPackagesLocked(
                                updateTargetPackagesLocked(
                                        mImpl.onPackageAdded(packageName, userId));
                                        mImpl.onPackageAdded(packageName, userId));
@@ -449,9 +449,9 @@ public final class OverlayManagerService extends SystemService {
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageChanged " + packageName);
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageChanged " + packageName);
                for (int userId : userIds) {
                for (int userId : userIds) {
                    synchronized (mLock) {
                    synchronized (mLock) {
                        final AndroidPackage pkg = mPackageManager.onPackageUpdated(
                        var packageState = mPackageManager.onPackageUpdated(packageName, userId);
                                packageName, userId);
                        if (packageState != null && !mPackageManager.isInstantApp(packageName,
                        if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) {
                                userId)) {
                            try {
                            try {
                                updateTargetPackagesLocked(
                                updateTargetPackagesLocked(
                                        mImpl.onPackageChanged(packageName, userId));
                                        mImpl.onPackageChanged(packageName, userId));
@@ -472,9 +472,9 @@ public final class OverlayManagerService extends SystemService {
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageReplacing " + packageName);
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageReplacing " + packageName);
                for (int userId : userIds) {
                for (int userId : userIds) {
                    synchronized (mLock) {
                    synchronized (mLock) {
                        final AndroidPackage pkg = mPackageManager.onPackageUpdated(
                        var packageState = mPackageManager.onPackageUpdated(packageName, userId);
                                packageName, userId);
                        if (packageState != null && !mPackageManager.isInstantApp(packageName,
                        if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) {
                                userId)) {
                            try {
                            try {
                                updateTargetPackagesLocked(mImpl.onPackageReplacing(packageName,
                                updateTargetPackagesLocked(mImpl.onPackageReplacing(packageName,
                                        systemUpdateUninstall, userId));
                                        systemUpdateUninstall, userId));
@@ -495,9 +495,9 @@ public final class OverlayManagerService extends SystemService {
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageReplaced " + packageName);
                traceBegin(TRACE_TAG_RRO, "OMS#onPackageReplaced " + packageName);
                for (int userId : userIds) {
                for (int userId : userIds) {
                    synchronized (mLock) {
                    synchronized (mLock) {
                        final AndroidPackage pkg = mPackageManager.onPackageUpdated(
                        var packageState = mPackageManager.onPackageUpdated(packageName, userId);
                                packageName, userId);
                        if (packageState != null && !mPackageManager.isInstantApp(packageName,
                        if (pkg != null && !mPackageManager.isInstantApp(packageName, userId)) {
                                userId)) {
                            try {
                            try {
                                updateTargetPackagesLocked(
                                updateTargetPackagesLocked(
                                        mImpl.onPackageReplaced(packageName, userId));
                                        mImpl.onPackageReplaced(packageName, userId));
@@ -1123,11 +1123,11 @@ public final class OverlayManagerService extends SystemService {
    };
    };


    private static final class PackageManagerHelperImpl implements PackageManagerHelper {
    private static final class PackageManagerHelperImpl implements PackageManagerHelper {
        private static class AndroidPackageUsers {
        private static class PackageStateUsers {
            private AndroidPackage mPackage;
            private PackageState mPackageState;
            private final Set<Integer> mInstalledUsers = new ArraySet<>();
            private final Set<Integer> mInstalledUsers = new ArraySet<>();
            private AndroidPackageUsers(@NonNull AndroidPackage pkg) {
            private PackageStateUsers(@NonNull PackageState packageState) {
                this.mPackage = pkg;
                this.mPackageState = packageState;
            }
            }
        }
        }
        private final Context mContext;
        private final Context mContext;
@@ -1139,7 +1139,7 @@ public final class OverlayManagerService extends SystemService {
        // intent, querying the PackageManagerService for the actual current
        // intent, querying the PackageManagerService for the actual current
        // state may lead to contradictions within OMS. Better then to lag
        // state may lead to contradictions within OMS. Better then to lag
        // behind until all pending intents have been processed.
        // behind until all pending intents have been processed.
        private final ArrayMap<String, AndroidPackageUsers> mCache = new ArrayMap<>();
        private final ArrayMap<String, PackageStateUsers> mCache = new ArrayMap<>();
        private final Set<Integer> mInitializedUsers = new ArraySet<>();
        private final Set<Integer> mInitializedUsers = new ArraySet<>();


        PackageManagerHelperImpl(Context context) {
        PackageManagerHelperImpl(Context context) {
@@ -1155,18 +1155,22 @@ public final class OverlayManagerService extends SystemService {
         * @return a map of package name to all packages installed in the user
         * @return a map of package name to all packages installed in the user
         */
         */
        @NonNull
        @NonNull
        public ArrayMap<String, AndroidPackage> initializeForUser(final int userId) {
        public ArrayMap<String, PackageState> initializeForUser(final int userId) {
            if (!mInitializedUsers.contains(userId)) {
            if (!mInitializedUsers.contains(userId)) {
                mInitializedUsers.add(userId);
                mInitializedUsers.add(userId);
                mPackageManagerInternal.forEachInstalledPackage(
                mPackageManagerInternal.forEachPackageState((packageState -> {
                        (pkg) -> addPackageUser(pkg, userId), userId);
                    if (packageState.getPkg() != null
                            && packageState.getUserStateOrDefault(userId).isInstalled()) {
                        addPackageUser(packageState, userId);
                    }
                }));
            }
            }


            final ArrayMap<String, AndroidPackage> userPackages = new ArrayMap<>();
            final ArrayMap<String, PackageState> userPackages = new ArrayMap<>();
            for (int i = 0, n = mCache.size(); i < n; i++) {
            for (int i = 0, n = mCache.size(); i < n; i++) {
                final AndroidPackageUsers pkg = mCache.valueAt(i);
                final PackageStateUsers pkg = mCache.valueAt(i);
                if (pkg.mInstalledUsers.contains(userId)) {
                if (pkg.mInstalledUsers.contains(userId)) {
                    userPackages.put(mCache.keyAt(i), pkg.mPackage);
                    userPackages.put(mCache.keyAt(i), pkg.mPackageState);
                }
                }
            }
            }
            return userPackages;
            return userPackages;
@@ -1174,11 +1178,11 @@ public final class OverlayManagerService extends SystemService {


        @Override
        @Override
        @Nullable
        @Nullable
        public AndroidPackage getPackageForUser(@NonNull final String packageName,
        public PackageState getPackageStateForUser(@NonNull final String packageName,
                final int userId) {
                final int userId) {
            final AndroidPackageUsers pkg = mCache.get(packageName);
            final PackageStateUsers pkg = mCache.get(packageName);
            if (pkg != null && pkg.mInstalledUsers.contains(userId)) {
            if (pkg != null && pkg.mInstalledUsers.contains(userId)) {
                return pkg.mPackage;
                return pkg.mPackageState;
            }
            }
            try {
            try {
                if (!mPackageManager.isPackageAvailable(packageName, userId)) {
                if (!mPackageManager.isPackageAvailable(packageName, userId)) {
@@ -1193,9 +1197,9 @@ public final class OverlayManagerService extends SystemService {
        }
        }


        @NonNull
        @NonNull
        private AndroidPackage addPackageUser(@NonNull final String packageName,
        private PackageState addPackageUser(@NonNull final String packageName,
                final int user) {
                final int user) {
            final AndroidPackage pkg = mPackageManagerInternal.getPackage(packageName);
            final PackageState pkg = mPackageManagerInternal.getPackageStateInternal(packageName);
            if (pkg == null) {
            if (pkg == null) {
                Slog.w(TAG, "Android package for '" + packageName + "' could not be found;"
                Slog.w(TAG, "Android package for '" + packageName + "' could not be found;"
                        + " continuing as if package was never added", new Throwable());
                        + " continuing as if package was never added", new Throwable());
@@ -1205,23 +1209,23 @@ public final class OverlayManagerService extends SystemService {
        }
        }


        @NonNull
        @NonNull
        private AndroidPackage addPackageUser(@NonNull final AndroidPackage pkg,
        private PackageState addPackageUser(@NonNull final PackageState pkg,
                final int user) {
                final int user) {
            AndroidPackageUsers pkgUsers = mCache.get(pkg.getPackageName());
            PackageStateUsers pkgUsers = mCache.get(pkg.getPackageName());
            if (pkgUsers == null) {
            if (pkgUsers == null) {
                pkgUsers = new AndroidPackageUsers(pkg);
                pkgUsers = new PackageStateUsers(pkg);
                mCache.put(pkg.getPackageName(), pkgUsers);
                mCache.put(pkg.getPackageName(), pkgUsers);
            } else {
            } else {
                pkgUsers.mPackage = pkg;
                pkgUsers.mPackageState = pkg;
            }
            }
            pkgUsers.mInstalledUsers.add(user);
            pkgUsers.mInstalledUsers.add(user);
            return pkgUsers.mPackage;
            return pkgUsers.mPackageState;
        }
        }




        @NonNull
        @NonNull
        private void removePackageUser(@NonNull final String packageName, final int user) {
        private void removePackageUser(@NonNull final String packageName, final int user) {
            final AndroidPackageUsers pkgUsers = mCache.get(packageName);
            final PackageStateUsers pkgUsers = mCache.get(packageName);
            if (pkgUsers == null) {
            if (pkgUsers == null) {
                return;
                return;
            }
            }
@@ -1229,20 +1233,20 @@ public final class OverlayManagerService extends SystemService {
        }
        }


        @NonNull
        @NonNull
        private void removePackageUser(@NonNull final AndroidPackageUsers pkg, final int user) {
        private void removePackageUser(@NonNull final PackageStateUsers pkg, final int user) {
            pkg.mInstalledUsers.remove(user);
            pkg.mInstalledUsers.remove(user);
            if (pkg.mInstalledUsers.isEmpty()) {
            if (pkg.mInstalledUsers.isEmpty()) {
                mCache.remove(pkg.mPackage.getPackageName());
                mCache.remove(pkg.mPackageState.getPackageName());
            }
            }
        }
        }


        @Nullable
        @Nullable
        public AndroidPackage onPackageAdded(@NonNull final String packageName, final int userId) {
        public PackageState onPackageAdded(@NonNull final String packageName, final int userId) {
            return addPackageUser(packageName, userId);
            return addPackageUser(packageName, userId);
        }
        }


        @Nullable
        @Nullable
        public AndroidPackage onPackageUpdated(@NonNull final String packageName,
        public PackageState onPackageUpdated(@NonNull final String packageName,
                final int userId) {
                final int userId) {
            return addPackageUser(packageName, userId);
            return addPackageUser(packageName, userId);
        }
        }
@@ -1289,14 +1293,15 @@ public final class OverlayManagerService extends SystemService {
        public OverlayableInfo getOverlayableForTarget(@NonNull String packageName,
        public OverlayableInfo getOverlayableForTarget(@NonNull String packageName,
                @NonNull String targetOverlayableName, int userId)
                @NonNull String targetOverlayableName, int userId)
                throws IOException {
                throws IOException {
            final AndroidPackage packageInfo = getPackageForUser(packageName, userId);
            var packageState = getPackageStateForUser(packageName, userId);
            if (packageInfo == null) {
            var pkg = packageState == null ? null : packageState.getAndroidPackage();
            if (pkg == null) {
                throw new IOException("Unable to get target package");
                throw new IOException("Unable to get target package");
            }
            }


            ApkAssets apkAssets = null;
            ApkAssets apkAssets = null;
            try {
            try {
                apkAssets = ApkAssets.loadFromPath(packageInfo.getBaseApkPath());
                apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath());
                return apkAssets.getOverlayableInfo(targetOverlayableName);
                return apkAssets.getOverlayableInfo(targetOverlayableName);
            } finally {
            } finally {
                if (apkAssets != null) {
                if (apkAssets != null) {
@@ -1311,14 +1316,15 @@ public final class OverlayManagerService extends SystemService {
        @Override
        @Override
        public boolean doesTargetDefineOverlayable(String targetPackageName, int userId)
        public boolean doesTargetDefineOverlayable(String targetPackageName, int userId)
                throws IOException {
                throws IOException {
            AndroidPackage packageInfo = getPackageForUser(targetPackageName, userId);
            var packageState = getPackageStateForUser(targetPackageName, userId);
            if (packageInfo == null) {
            var pkg = packageState == null ? null : packageState.getAndroidPackage();
            if (pkg == null) {
                throw new IOException("Unable to get target package");
                throw new IOException("Unable to get target package");
            }
            }


            ApkAssets apkAssets = null;
            ApkAssets apkAssets = null;
            try {
            try {
                apkAssets = ApkAssets.loadFromPath(packageInfo.getBaseApkPath());
                apkAssets = ApkAssets.loadFromPath(pkg.getSplits().get(0).getPath());
                return apkAssets.definesOverlayable();
                return apkAssets.definesOverlayable();
            } finally {
            } finally {
                if (apkAssets != null) {
                if (apkAssets != null) {
@@ -1370,8 +1376,8 @@ public final class OverlayManagerService extends SystemService {


            for (int i = 0, n = mCache.size(); i < n; i++) {
            for (int i = 0, n = mCache.size(); i < n; i++) {
                final String packageName = mCache.keyAt(i);
                final String packageName = mCache.keyAt(i);
                final AndroidPackageUsers pkg = mCache.valueAt(i);
                final PackageStateUsers pkg = mCache.valueAt(i);
                pw.print(TAB1 + packageName + ": " + pkg.mPackage + " users=");
                pw.print(TAB1 + packageName + ": " + pkg.mPackageState + " users=");
                pw.println(TextUtils.join(", ", pkg.mInstalledUsers));
                pw.println(TextUtils.join(", ", pkg.mInstalledUsers));
            }
            }
        }
        }
+31 −16

File changed.

Preview size limit exceeded, changes collapsed.

Loading