From 7afbbec42f4d30be77a818552aa2201e54c8b798 Mon Sep 17 00:00:00 2001 From: Juan Yescas Date: Tue, 23 Aug 2022 07:09:21 +0000 Subject: Add new field in MemoryInfo to get advertised memory size. This API will get the advertised memory size from the bootloader parameter passed to the kernel. The advertised memory size might be different from the MemTotal value in /proc/meminfo. This could be due the original design manufacturer (ODM) reserved part of the memory for the Trusted Execution Environment. Test: Run test caes Bug: 231718727 Change-Id: I06494cb9013048d73a83f2180a9241c2259d46eb --- core/api/current.txt | 1 + core/java/android/app/ActivityManager.java | 12 ++++++++++++ core/java/android/os/Process.java | 19 +++++++++++++++++++ core/tests/coretests/src/android/os/ProcessTest.java | 3 +++ .../core/java/com/android/server/am/ProcessList.java | 2 ++ 5 files changed, 37 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index 644a194f6ed1..05e2a9aa7286 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -4415,6 +4415,7 @@ package android.app { method public void readFromParcel(android.os.Parcel); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field public long advertisedMem; field public long availMem; field public boolean lowMemory; field public long threshold; diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 5d1d225f4d2d..6f9a98d8313f 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -29,6 +29,7 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; @@ -2812,6 +2813,15 @@ public class ActivityManager { * {@link ActivityManager#getMemoryInfo}. */ public static class MemoryInfo implements Parcelable { + /** + * The advertised memory of the system, as the end user would encounter in a retail display + * environment. This value might be different from {@code totalMem}. This could be due to + * many reasons. For example, the ODM could reserve part of the memory for the Trusted + * Execution Environment (TEE) which the kernel doesn't have access or knowledge about it. + */ + @SuppressLint("MutableBareField") + public long advertisedMem; + /** * The available memory on the system. This number should not * be considered absolute: due to the nature of the kernel, a significant @@ -2861,6 +2871,7 @@ public class ActivityManager { } public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(advertisedMem); dest.writeLong(availMem); dest.writeLong(totalMem); dest.writeLong(threshold); @@ -2872,6 +2883,7 @@ public class ActivityManager { } public void readFromParcel(Parcel source) { + advertisedMem = source.readLong(); availMem = source.readLong(); totalMem = source.readLong(); threshold = source.readLong(); diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index e06e7326a860..b3afaecca849 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -26,6 +26,7 @@ import android.annotation.TestApi; import android.annotation.UptimeMillisLong; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build.VERSION_CODES; +import android.sysprop.MemoryProperties; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -1336,6 +1337,24 @@ public class Process { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public static final native void sendSignalQuiet(int pid, int signal); + /** + * @return The advertised memory of the system, as the end user would encounter in a retail + * display environment. If the advertised memory is not defined, it returns + * {@code getTotalMemory()} rounded. + * + * @hide + */ + public static final long getAdvertisedMem() { + String formatSize = MemoryProperties.memory_ddr_size().orElse("0KB"); + long memSize = FileUtils.parseSize(formatSize); + + if (memSize == Long.MIN_VALUE) { + return FileUtils.roundStorageSize(getTotalMemory()); + } + + return memSize; + } + /** @hide */ @UnsupportedAppUsage public static final native long getFreeMemory(); diff --git a/core/tests/coretests/src/android/os/ProcessTest.java b/core/tests/coretests/src/android/os/ProcessTest.java index ae4edb97aab0..52846dfbb14b 100644 --- a/core/tests/coretests/src/android/os/ProcessTest.java +++ b/core/tests/coretests/src/android/os/ProcessTest.java @@ -72,4 +72,7 @@ public class ProcessTest extends TestCase { assertEquals(-1, Process.getThreadGroupLeader(BAD_PID)); } + public void testGetAdvertisedMem() { + assertTrue(Process.getTotalMemory() <= Process.getAdvertisedMem()); + } } diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 178b6bbe755e..eb6a3b3a3cea 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -27,6 +27,7 @@ import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT; import static android.os.Process.SYSTEM_UID; import static android.os.Process.THREAD_PRIORITY_BACKGROUND; import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY; +import static android.os.Process.getAdvertisedMem; import static android.os.Process.getFreeMemory; import static android.os.Process.getTotalMemory; import static android.os.Process.killProcessQuiet; @@ -1524,6 +1525,7 @@ public final class ProcessList { void getMemoryInfo(ActivityManager.MemoryInfo outInfo) { final long homeAppMem = getMemLevel(HOME_APP_ADJ); final long cachedAppMem = getMemLevel(CACHED_APP_MIN_ADJ); + outInfo.advertisedMem = getAdvertisedMem(); outInfo.availMem = getFreeMemory(); outInfo.totalMem = getTotalMemory(); outInfo.threshold = homeAppMem; -- cgit v1.2.3-59-g8ed1b