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

Commit a627c094 authored by Fyodor Kupolov's avatar Fyodor Kupolov
Browse files

Hold wakelock while dexopting

Bug: 19521294
Change-Id: Ieed9b98ecb4a3332ce652d76c2bac8c312917ca1
parent ea4eb326
Loading
Loading
Loading
Loading
+25 −1
Original line number Original line Diff line number Diff line
@@ -17,9 +17,12 @@
package com.android.server.pm;
package com.android.server.pm;


import android.annotation.Nullable;
import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageParser;
import android.content.pm.PackageParser;
import android.os.PowerManager;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.WorkSource;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;
import android.util.Slog;
import android.util.Slog;
@@ -51,8 +54,14 @@ final class PackageDexOptimizer {
    private final PackageManagerService mPackageManagerService;
    private final PackageManagerService mPackageManagerService;
    private ArraySet<PackageParser.Package> mDeferredDexOpt;
    private ArraySet<PackageParser.Package> mDeferredDexOpt;


    private final PowerManager.WakeLock mDexoptWakeLock;
    private volatile boolean mSystemReady;

    PackageDexOptimizer(PackageManagerService packageManagerService) {
    PackageDexOptimizer(PackageManagerService packageManagerService) {
        this.mPackageManagerService = packageManagerService;
        this.mPackageManagerService = packageManagerService;
        PowerManager powerManager = (PowerManager)packageManagerService.mContext.getSystemService(
                Context.POWER_SERVICE);
        mDexoptWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*dexopt*");
    }
    }


    /**
    /**
@@ -72,7 +81,18 @@ final class PackageDexOptimizer {
            done = null;
            done = null;
        }
        }
        synchronized (mPackageManagerService.mInstallLock) {
        synchronized (mPackageManagerService.mInstallLock) {
            final boolean useLock = mSystemReady;
            if (useLock) {
                mDexoptWakeLock.setWorkSource(new WorkSource(pkg.applicationInfo.uid));
                mDexoptWakeLock.acquire();
            }
            try {
                return performDexOptLI(pkg, instructionSets, forceDex, defer, done);
                return performDexOptLI(pkg, instructionSets, forceDex, defer, done);
            } finally {
                if (useLock) {
                    mDexoptWakeLock.release();
                }
            }
        }
        }
    }
    }


@@ -244,4 +264,8 @@ final class PackageDexOptimizer {
        }
        }
        mDeferredDexOpt.add(pkg);
        mDeferredDexOpt.add(pkg);
    }
    }

    void systemReady() {
        mSystemReady = true;
    }
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -13310,6 +13310,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        storage.registerListener(mStorageListener);
        storage.registerListener(mStorageListener);
        mInstallerService.systemReady();
        mInstallerService.systemReady();
        mPackageDexOptimizer.systemReady();
    }
    }
    @Override
    @Override