From 38b1683735696bba5cfa74ac1721e9f6328d5173 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 23 Jun 2021 17:18:35 +0800 Subject: [PATCH] Obtain DisplayMetrics from DisplaymanagerGlobal directly Previously we use cache to store value returned from DisplayManagerGlobal#getAdjustedDisplay(int, DisplayAdjustments) in RM#getAdjustedDisplay(int, DisplayAdjustments). Since RM#getAdjustedDisplay(int, DisplayAdjustments) is just used in RM#getDisplayMetrics(int, DisplayAdjustments), we can furthur call getDisplayInfo(int) from DisplayManagerGlobal and call DisplayInfo#getAppMetrics to obtain DisplayMetrics directly. Also, #getDisplayInfo has binder cache, so we don't need another cache to store returned DisplayMetrics value from DisplayManagerGlobal. Before this CL [1/1] android.app.ResourcesManagerPerfTest#getDisplayMetrics: PASSED (10.844s) getDisplayMetrics_median: 1840 perfetto_file_path: /sdcard/test_results/android.app.ResourcesManagerPerfTest_getDisplayMetrics/PerfettoListener/perfetto_android.app.ResourcesManagerPerfTest_getDisplayMetrics-1.pb getDisplayMetrics_mean: 1857 getDisplayMetrics_min: 1817 getDisplayMetrics_standardDeviation: 35 After this CL, com.android.perftests.core (1 Test) [1/1] android.app.ResourcesManagerPerfTest#getDisplayMetrics: PASSED (11.185s) getDisplayMetrics_median: 733 perfetto_file_path: /sdcard/test_results/android.app.ResourcesManagerPerfTest_getDisplayMetrics/PerfettoListener/perfetto_android.app.ResourcesManagerPerfTest_getDisplayMetrics-1.pb getDisplayMetrics_mean: 733 getDisplayMetrics_min: 725 getDisplayMetrics_standardDeviation: 5 Test: atest android.app.ResourcesManagerPerfTest#getDisplayMetrics fixes: 191662456 Change-Id: I934ecae19431800a9a4e0f3e3821e80ef4b5d8cf --- core/java/android/app/ResourcesManager.java | 61 +++------------------ 1 file changed, 7 insertions(+), 54 deletions(-) diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index f28c760d54d95..e469b1fde2e5e 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -42,10 +42,10 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.Log; -import android.util.Pair; import android.util.Slog; import android.view.Display; import android.view.DisplayAdjustments; +import android.view.DisplayInfo; import android.window.WindowContext; import com.android.internal.annotations.VisibleForTesting; @@ -56,7 +56,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; @@ -250,12 +249,6 @@ public class ResourcesManager { private final WeakHashMap mActivityResourceReferences = new WeakHashMap<>(); - /** - * A cache of DisplayId, DisplayAdjustments to Display. - */ - private final ArrayMap, SoftReference> - mAdjustedDisplays = new ArrayMap<>(); - /** * Callback implementation for handling updates to Resources objects. */ @@ -331,10 +324,12 @@ public class ResourcesManager { */ @VisibleForTesting protected @NonNull DisplayMetrics getDisplayMetrics(int displayId, DisplayAdjustments da) { - DisplayMetrics dm = new DisplayMetrics(); - final Display display = getAdjustedDisplay(displayId, da); - if (display != null) { - display.getMetrics(dm); + final DisplayManagerGlobal displayManagerGlobal = DisplayManagerGlobal.getInstance(); + final DisplayMetrics dm = new DisplayMetrics(); + final DisplayInfo displayInfo = displayManagerGlobal != null + ? displayManagerGlobal.getDisplayInfo(displayId) : null; + if (displayInfo != null) { + displayInfo.getAppMetrics(dm, da); } else { dm.setToDefaults(); } @@ -374,45 +369,6 @@ public class ResourcesManager { } } - /** - * Returns an adjusted {@link Display} object based on the inputs or null if display isn't - * available. This method is only used within {@link ResourcesManager} to calculate display - * metrics based on a set {@link DisplayAdjustments}. All other usages should instead call - * {@link ResourcesManager#getAdjustedDisplay(int, Resources)}. - * - * @param displayId display Id. - * @param displayAdjustments display adjustments. - */ - private Display getAdjustedDisplay(final int displayId, - @Nullable DisplayAdjustments displayAdjustments) { - final DisplayAdjustments displayAdjustmentsCopy = (displayAdjustments != null) - ? new DisplayAdjustments(displayAdjustments) : new DisplayAdjustments(); - final Pair key = - Pair.create(displayId, displayAdjustmentsCopy); - SoftReference sd; - synchronized (mLock) { - sd = mAdjustedDisplays.get(key); - } - if (sd != null) { - final Display display = sd.get(); - if (display != null) { - return display; - } - } - final DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); - if (dm == null) { - // may be null early in system startup - return null; - } - final Display display = dm.getCompatibleDisplay(displayId, key.second); - if (display != null) { - synchronized (mLock) { - mAdjustedDisplays.put(key, new SoftReference<>(display)); - } - } - return display; - } - /** * Returns an adjusted {@link Display} object based on the inputs or null if display isn't * available. @@ -1332,9 +1288,6 @@ public class ResourcesManager { return false; } - // Things might have changed in display manager, so clear the cached displays. - mAdjustedDisplays.clear(); - int changes = mResConfiguration.updateFrom(config); if (compat != null && (mResCompatibilityInfo == null || !mResCompatibilityInfo.equals(compat))) {