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

Commit 063baa77 authored by Hai Zhang's avatar Hai Zhang
Browse files

Refactor restorePermissionState() locking.

Don't call outside under permission data lock.

Bug: 158736025
Test: presubmit
Change-Id: I1d39d6ac77abb5dfe84b6a2a73d4373a8dfc36b5
parent 692f27bf
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -207,13 +207,13 @@ public abstract class ApexManager {
    /**
     * Returns the active apex package's name that contains the (apk) package.
     *
     * @param containedPackage The (apk) package that might be in a apex
     * @param containedPackageName The (apk) package that might be in a apex
     * @return the apex package's name of {@code null} if the {@code containedPackage} is not inside
     *         any apex.
     */
    @Nullable
    public abstract String getActiveApexPackageNameContainingPackage(
            @NonNull AndroidPackage containedPackage);
            @NonNull String containedPackageName);

    /**
     * Retrieves information about an apexd staged session i.e. the internal state used by apexd to
@@ -650,15 +650,14 @@ public abstract class ApexManager {

        @Override
        @Nullable
        public String getActiveApexPackageNameContainingPackage(AndroidPackage containedPackage) {
            Objects.requireNonNull(containedPackage);
        public String getActiveApexPackageNameContainingPackage(String containedPackageName) {
            Objects.requireNonNull(containedPackageName);
            synchronized (mLock) {
                Preconditions.checkState(mPackageNameToApexModuleName != null,
                        "APEX packages have not been scanned");
                int numApksInApex = mApksInApex.size();
                for (int apkInApexNum = 0; apkInApexNum < numApksInApex; apkInApexNum++) {
                    if (mApksInApex.valueAt(apkInApexNum).contains(
                            containedPackage.getPackageName())) {
                    if (mApksInApex.valueAt(apkInApexNum).contains(containedPackageName)) {
                        String apexModuleName = mApksInApex.keyAt(apkInApexNum);

                        int numApexPkgs = mPackageNameToApexModuleName.size();
@@ -1080,8 +1079,8 @@ public abstract class ApexManager {
        @Override
        @Nullable
        public String getActiveApexPackageNameContainingPackage(
                @NonNull AndroidPackage containedPackage) {
            Objects.requireNonNull(containedPackage);
                @NonNull String containedPackageName) {
            Objects.requireNonNull(containedPackageName);

            return null;
        }
+525 −550

File changed.

Preview size limit exceeded, changes collapsed.

+4 −11
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.RollbackInfo;
@@ -44,13 +43,11 @@ import android.util.SparseArray;

import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
import com.android.server.PackageWatchdog;
import com.android.server.PackageWatchdog.FailureReasons;
import com.android.server.PackageWatchdog.PackageHealthObserver;
import com.android.server.PackageWatchdog.PackageHealthObserverImpact;
import com.android.server.pm.ApexManager;
import com.android.server.pm.parsing.pkg.AndroidPackage;

import java.io.BufferedReader;
import java.io.File;
@@ -342,15 +339,11 @@ final class RollbackPackageHealthObserver implements PackageHealthObserver {
    private boolean isModule(String packageName) {
        // Check if the package is an APK inside an APEX. If it is, use the parent APEX package when
        // querying PackageManager.
        PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
        AndroidPackage apkPackage = pmi.getPackage(packageName);
        if (apkPackage != null) {
        String apexPackageName = mApexManager.getActiveApexPackageNameContainingPackage(
                    apkPackage);
                packageName);
        if (apexPackageName != null) {
            packageName = apexPackageName;
        }
        }

        PackageManager pm = mContext.getPackageManager();
        try {