From 6a193b5db039d093b0c1ac39c1f5827468a848d8 Mon Sep 17 00:00:00 2001 From: Stanislav Zholnin Date: Wed, 5 May 2021 10:34:32 +0100 Subject: [PATCH] Do not hold AppOpsService lock while calling DeviceConfig Fix: 187095462 Test: locally tested Change-Id: I8916ee89cc9862368c11b7648c67d27441fef3d8 --- .../android/server/appop/DiscreteRegistry.java | 15 +++++++++------ .../android/server/appop/HistoricalRegistry.java | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/appop/DiscreteRegistry.java b/services/core/java/com/android/server/appop/DiscreteRegistry.java index 63b41b7892809..f67d4ab3c4e86 100644 --- a/services/core/java/com/android/server/appop/DiscreteRegistry.java +++ b/services/core/java/com/android/server/appop/DiscreteRegistry.java @@ -150,17 +150,20 @@ final class DiscreteRegistry { } void systemReady() { - synchronized (mOnDiskLock) { - mDiscreteAccessDir = new File(new File(Environment.getDataSystemDirectory(), "appops"), - "discrete"); - createDiscreteAccessDirLocked(); - mDiscreteOps = new DiscreteOps(); - } DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_PRIVACY, AsyncTask.THREAD_POOL_EXECUTOR, (DeviceConfig.Properties p) -> { setDiscreteHistoryParameters(p); }); setDiscreteHistoryParameters(DeviceConfig.getProperties(DeviceConfig.NAMESPACE_PRIVACY)); + synchronized (mOnDiskLock) { + synchronized (mInMemoryLock) { + mDiscreteAccessDir = new File( + new File(Environment.getDataSystemDirectory(), "appops"), + "discrete"); + createDiscreteAccessDirLocked(); + mDiscreteOps = new DiscreteOps(); + } + } } private void setDiscreteHistoryParameters(DeviceConfig.Properties p) { diff --git a/services/core/java/com/android/server/appop/HistoricalRegistry.java b/services/core/java/com/android/server/appop/HistoricalRegistry.java index 72e582e594b4e..55560150d53ad 100644 --- a/services/core/java/com/android/server/appop/HistoricalRegistry.java +++ b/services/core/java/com/android/server/appop/HistoricalRegistry.java @@ -246,10 +246,10 @@ final class HistoricalRegistry { + " by which to push history on next write"); } } - mDiscreteRegistry.systemReady(); } } } + mDiscreteRegistry.systemReady(); } private boolean isPersistenceInitializedMLocked() {