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

Commit 7afbbec4 authored by Juan Yescas's avatar Juan Yescas
Browse files

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
parent 71e11ae9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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<android.app.ActivityManager.MemoryInfo> CREATOR;
    field public long advertisedMem;
    field public long availMem;
    field public boolean lowMemory;
    field public long threshold;
+12 −0
Original line number Diff line number Diff line
@@ -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();
+19 −0
Original line number Diff line number Diff line
@@ -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();
+3 −0
Original line number Diff line number Diff line
@@ -72,4 +72,7 @@ public class ProcessTest extends TestCase {
        assertEquals(-1, Process.getThreadGroupLeader(BAD_PID));
    }

    public void testGetAdvertisedMem() {
        assertTrue(Process.getTotalMemory() <= Process.getAdvertisedMem());
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -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;