Merge "[pm] unlock mInstallLock before dexopt" into main
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 19a0ba7..908b47d 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -985,13 +985,13 @@
}
void installPackagesTraced(List<InstallRequest> requests) {
- synchronized (mPm.mInstallLock) {
- try {
- Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installPackages");
- installPackagesLI(requests);
- } finally {
- Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
- }
+ mPm.mInstallLock.lock();
+ try {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installPackages");
+ installPackagesLI(requests);
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ mPm.mInstallLock.unlock();
}
}
@@ -2590,22 +2590,30 @@
final boolean performDexopt = DexOptHelper.shouldPerformDexopt(installRequest,
dexoptOptions, mContext);
if (performDexopt) {
- Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
+ // dexopt can take long, and ArtService doesn't require installd, so we release
+ // the lock here and re-acquire the lock after dexopt is finished.
+ mPm.mInstallLock.unlock();
+ try {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");
- // This mirrors logic from commitReconciledScanResultLocked, where the library files
- // needed for dexopt are assigned.
- PackageSetting realPkgSetting = installRequest.getRealPackageSetting();
+ // This mirrors logic from commitReconciledScanResultLocked, where the library
+ // files needed for dexopt are assigned.
+ PackageSetting realPkgSetting = installRequest.getRealPackageSetting();
- // Unfortunately, the updated system app flag is only tracked on this PackageSetting
- boolean isUpdatedSystemApp =
- installRequest.getScannedPackageSetting().isUpdatedSystemApp();
+ // Unfortunately, the updated system app flag is only tracked on this
+ // PackageSetting
+ boolean isUpdatedSystemApp =
+ installRequest.getScannedPackageSetting().isUpdatedSystemApp();
- realPkgSetting.getPkgState().setUpdatedSystemApp(isUpdatedSystemApp);
+ realPkgSetting.getPkgState().setUpdatedSystemApp(isUpdatedSystemApp);
- DexoptResult dexOptResult =
- DexOptHelper.dexoptPackageUsingArtService(installRequest, dexoptOptions);
- installRequest.onDexoptFinished(dexOptResult);
- Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ DexoptResult dexOptResult = DexOptHelper.dexoptPackageUsingArtService(
+ installRequest, dexoptOptions);
+ installRequest.onDexoptFinished(dexOptResult);
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ } finally {
+ mPm.mInstallLock.lock();
+ }
}
}
PackageManagerServiceUtils.waitForNativeBinariesExtractionForIncremental(
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ae485ed..121cf3f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -626,7 +626,7 @@
// Lock for state used when installing and doing other long running
// operations. Methods that must be called with this lock held have
// the suffix "LI".
- final Object mInstallLock;
+ final PackageManagerTracedLock mInstallLock;
// ----------------------------------------------------------------
@@ -1692,8 +1692,8 @@
final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
Trace.TRACE_TAG_PACKAGE_MANAGER);
t.traceBegin("create package manager");
- final PackageManagerTracedLock lock = new PackageManagerTracedLock();
- final Object installLock = new Object();
+ final PackageManagerTracedLock lock = new PackageManagerTracedLock("mLock");
+ final PackageManagerTracedLock installLock = new PackageManagerTracedLock("mInstallLock");
HandlerThread backgroundThread = new ServiceThread("PackageManagerBg",
Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
index 83f3b16..ae2eaeb 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
@@ -86,7 +86,7 @@
private final Context mContext;
private final PackageManagerTracedLock mLock;
private final Installer mInstaller;
- private final Object mInstallLock;
+ private final PackageManagerTracedLock mInstallLock;
private final Handler mBackgroundHandler;
private final Executor mBackgroundExecutor;
private final List<ScanPartition> mSystemPartitions;
@@ -144,7 +144,7 @@
private final Singleton<PackageMonitorCallbackHelper> mPackageMonitorCallbackHelper;
PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock,
- Installer installer, Object installLock, PackageAbiHelper abiHelper,
+ Installer installer, PackageManagerTracedLock installLock, PackageAbiHelper abiHelper,
Handler backgroundHandler,
List<ScanPartition> systemPartitions,
Producer<ComponentResolver> componentResolverProducer,
@@ -254,7 +254,7 @@
return mAbiHelper;
}
- public Object getInstallLock() {
+ public PackageManagerTracedLock getInstallLock() {
return mInstallLock;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerTracedLock.java b/services/core/java/com/android/server/pm/PackageManagerTracedLock.java
index 75e1803f..303b8b9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerTracedLock.java
+++ b/services/core/java/com/android/server/pm/PackageManagerTracedLock.java
@@ -16,6 +16,9 @@
package com.android.server.pm;
+import android.annotation.Nullable;
+import android.util.Slog;
+
import java.util.concurrent.locks.ReentrantLock;
/**
@@ -23,4 +26,31 @@
* injection, similar to {@link ActivityManagerGlobalLock}.
*/
public class PackageManagerTracedLock extends ReentrantLock {
+ private static final String TAG = "PackageManagerTracedLock";
+ private static final boolean DEBUG = false;
+ @Nullable private final String mLockName;
+
+ public PackageManagerTracedLock(@Nullable String lockName) {
+ mLockName = lockName;
+ }
+
+ public PackageManagerTracedLock() {
+ this(null);
+ }
+
+ @Override
+ public void lock() {
+ super.lock();
+ if (DEBUG && mLockName != null) {
+ Slog.i(TAG, "locked " + mLockName);
+ }
+ }
+
+ @Override
+ public void unlock() {
+ super.unlock();
+ if (DEBUG && mLockName != null) {
+ Slog.i(TAG, "unlocked " + mLockName);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/UserDataPreparer.java b/services/core/java/com/android/server/pm/UserDataPreparer.java
index 1d41401..ef32485 100644
--- a/services/core/java/com/android/server/pm/UserDataPreparer.java
+++ b/services/core/java/com/android/server/pm/UserDataPreparer.java
@@ -52,11 +52,11 @@
private static final String TAG = "UserDataPreparer";
private static final String XATTR_SERIAL = "user.serial";
- private final Object mInstallLock;
+ private final PackageManagerTracedLock mInstallLock;
private final Context mContext;
private final Installer mInstaller;
- UserDataPreparer(Installer installer, Object installLock, Context context) {
+ UserDataPreparer(Installer installer, PackageManagerTracedLock installLock, Context context) {
mInstallLock = installLock;
mContext = context;
mInstaller = installer;
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
index 9e11fa2..e545a49 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
@@ -71,7 +71,7 @@
@Mock
private Installer mInstaller;
- private Object mInstallLock;
+ private PackageManagerTracedLock mInstallLock;
@Before
public void setup() {
@@ -79,7 +79,7 @@
TEST_USER.serialNumber = TEST_USER_SERIAL;
Context ctx = InstrumentationRegistry.getContext();
FileUtils.deleteContents(ctx.getCacheDir());
- mInstallLock = new Object();
+ mInstallLock = new PackageManagerTracedLock();
MockitoAnnotations.initMocks(this);
mUserDataPreparer = new TestUserDataPreparer(mInstaller, mInstallLock, mContextMock,
ctx.getCacheDir());
@@ -238,8 +238,8 @@
private static class TestUserDataPreparer extends UserDataPreparer {
File testDir;
- TestUserDataPreparer(Installer installer, Object installLock, Context context,
- File testDir) {
+ TestUserDataPreparer(Installer installer, PackageManagerTracedLock installLock,
+ Context context, File testDir) {
super(installer, installLock, context);
this.testDir = testDir;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
index c9aab53..396edae 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
@@ -186,7 +186,7 @@
class Mocks {
val lock = PackageManagerTracedLock()
- val installLock = Any()
+ val installLock = PackageManagerTracedLock()
val injector: PackageManagerServiceInjector = mock()
val systemWrapper: PackageManagerServiceInjector.SystemWrapper = mock()
val context: Context = mock()