Как получить информацию о RAM-памяти (ОЗУ) в Android

июня
03
2012
Метки: android ram

Содержание

В этой статье расскажем о том, как получить информацию о RAM-памяти в сматрфонах под управлением Android.

Чтобы получить эту информацию, необходимо прочитать файл /proc/meminfo. Ниже пример содержимого этого файла:


MemTotal:         423332 kB
MemFree:           62916 kB
Buffers:            2504 kB
Cached:           181760 kB
SwapCached:            0 kB
Active:           228072 kB
Inactive:          99324 kB
Active(anon):     129172 kB
Inactive(anon):    14888 kB
Active(file):      98900 kB
Inactive(file):    84436 kB
Unevictable:         260 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                80 kB
Writeback:             0 kB
AnonPages:        143440 kB
Mapped:            53428 kB
Shmem:               668 kB
Slab:              15468 kB
SReclaimable:       8084 kB
SUnreclaim:         7384 kB
KernelStack:        4432 kB
PageTables:        10104 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      211664 kB
Committed_AS:    1576592 kB
VmallocTotal:     163840 kB
VmallocUsed:       74740 kB
VmallocChunk:      53252 kB

Прочитать его можно следующим образом:


package com.seostella.deviceinfo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class DeviceInfoActivity extends Activity {
	private static final String TAG = "DeviceInfoActivity";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		getTotalMemory();
	}

	public void getTotalMemory() {
		String procMemInfo = "/proc/meminfo";
		String temp;
		int readBlockSize = 8192;
		try {
			FileReader fileReader = new FileReader(procMemInfo);
			BufferedReader bufferedReader = new BufferedReader(fileReader, readBlockSize);
			while ((temp = bufferedReader.readLine()) != null) {
				Log.i(TAG, temp);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Расскажем вкратце о некоторых значениях файла /proc/meminfo.

MemTotal — общее количество памяти в килобайтах. Некоторое количество памяти резервируется системой и здесь не указано.

MemFree — объем доступной памяти для приложений.

Buffers — объем памяти, используемый для буферов, которые занимаются записью данных на диск.

Cached — память, используемая как кэш.

SwapCached — информация, которая была прочитана со swap, но не удалена оттуда. Поэтому эта память в любой момент может быть очищена и использована системой.

Active — объем памяти в активном использовании и освобождение ее крайне маловероятно.

Inactive — память, которая является буфером или кэшем, которая может быть в любой момент освобождена или записана в swap.

Active(anon) — часть Active памяти, используемая программами.

Inactive(anon) — часть Inactive памяти, используемая программами.

Active(file) — часть Active памяти, используемая файлами.

Inactive(file) — часть Inactive памяти, используемая файлами.

SwapTotal — общий объем доступной swap-памяти (области подкачки).

SwapFree — свободное количество swap-памяти (области подкачки).

Dirty — объем памяти, который ожидает своей записи на диск.

Writeback — объем памяти, который в данный момент записываются на диск.

AnonPages — объем памяти, который не ассоциирован с файлами. В основном, это память, используемая приложениями.

Mapped — объем памяти, используемый устройствами, файлами и библиотеками с использованием комманды mmap.

Slab — объем памяти, которую используют некоторые мелкие утилиты ядра, для которых резервирование памяти ядром неэффективно.

PageTables - объем памяти, зарезервированный под таблицу страниц.

CommitLimit — объем памяти, который может быть выделен системой.

Committed_AS — объем памяти, выделенная всем процессам в системе.

VMallocTotal — общий объем виртуального адресного пространства.

VMallocUsed — общий объем используемого виртуального адресного пространства.

VMallocChunk — наибольший беспрерывный блок памяти, который доступен в виртуальном адресном пространстве.

И, в качестве бонуса, представим удобный класс для получения любых свойств файла /proc/meminfo. Итак, код класса ProcMeminfoProperty:

ProcMeminfoProperty.java

package com.seostella.proc.meminfo;

public class ProcMeminfoProperty {
	public static final String MEM_TOTAL 		= "MemTotal";
	public static final String MEM_FREE 		= "MemFree";
	public static final String BUFFERS 			= "Buffers";
	public static final String CACHED 			= "Cached";
	public static final String SWAP_CACHED 		= "SwapCached";
	public static final String ACTIVE 			= "Active";
	public static final String INACTIVE 		= "Inactive";
	public static final String ACTIVE_ANON 		= "Active(anon)";
	public static final String INACTIVE_ANON 	= "Inactive(anon)";
	public static final String ACTIVE_FILE 		= "Active(file)";
	public static final String INACTIVE_FILE 	= "Inactive(file)";
	public static final String UNEVICTABLE 		= "Unevictable";
	public static final String MLOCKED 			= "Mlocked";
	public static final String SWAP_TOTAL 		= "SwapTotal";
	public static final String SWAP_FREE 		= "SwapFree";
	public static final String DIRTY 			= "Dirty";
	public static final String WRITEBACK 		= "Writeback";
	public static final String ANON_PAGES 		= "AnonPages";
	public static final String MAPPED 			= "Mapped";
	public static final String SHMEM 			= "Shmem";
	public static final String SLAB 			= "Slab";
	public static final String SRECLAIMABLE 	= "SReclaimable";
	public static final String SUNRECLAIM 		= "SUnreclaim";
	public static final String KERNEL_STACK 	= "KernelStack";
	public static final String PAGE_TABLES 		= "PageTables";
	public static final String NFS_UNSTABLE 	= "NFS_Unstable";
	public static final String BOUNCE 			= "Bounce";
	public static final String WRITEBACK_TMP 	= "WritebackTmp";
	public static final String COMMIT_LIMIT 	= "CommitLimit";
	public static final String COMMITTED_AS 	= "Committed_AS";
	public static final String VMALLOC_TOTAL 	= "VmallocTotal";
	public static final String VMALLOC_USED 	= "VmallocUsed";
	public static final String VMALLOC_CHUNK 	= "VmallocChunk";
	
	
	private String name;
	private long amountCount;
	private String amountMeasure;

	public ProcMeminfoProperty(String name, long amountCount,
			String amountMeasure) {
		super();
		this.name = name;
		this.amountCount = amountCount;
		this.amountMeasure = amountMeasure;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getAmountCount() {
		return amountCount;
	}

	public void setAmountCount(long amountCount) {
		this.amountCount = amountCount;
	}

	public String getAmountMeasure() {
		return amountMeasure;
	}

	public void setAmountMeasure(String amountMeasure) {
		this.amountMeasure = amountMeasure;
	}

}

Парсер файла /proc/meminfo:

ProcMeminfoParser.java

package com.seostella.proc.meminfo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

public class ProcMeminfoParser {
	private static final String PROC_MEMINFO_FILENAME = "/proc/meminfo";

	public static HashMap<String, ProcMeminfoProperty> parseProcMeminfo() {
		String procMemInfo = PROC_MEMINFO_FILENAME;
		
		HashMap<String, ProcMeminfoProperty> procMeminfoProperties = new HashMap<String, ProcMeminfoProperty>();
		ProcMeminfoProperty property;
	
		String temp;
		int readBlockSize = 8192;
		
		try {
			FileReader fileReader = new FileReader(procMemInfo);
			BufferedReader bufferedReader = new BufferedReader(fileReader, readBlockSize);
			
			while ((temp = bufferedReader.readLine()) != null) {
				
				property = parseProcMeminfoLine( temp );
				if( property != null ){
					procMeminfoProperties.put( property.getName(), property );
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return procMeminfoProperties;
	}

	private static ProcMeminfoProperty parseProcMeminfoLine(String line) {
		String name;
		String[] amount;
		long amountCount;
		String amountMeasure;
		String[] parts = line.split(":");
		if (parts != null && parts.length == 2 && parts[0] != null
				&& parts[1] != null) {
			name = parts[0];
			amount = parts[1].trim().split(" ");
			if (amount != null && amount.length == 2 && amount[0] != null
					&& amount[1] != null) {
				try {
					amountCount = Long.parseLong(amount[0]);
				} catch (NumberFormatException e) {
					amountCount = 0L;
				}

				amountMeasure = amount[1];

				return new ProcMeminfoProperty(name, amountCount, amountMeasure);
			}

			return new ProcMeminfoProperty(name, 0, "");
		}

		return null;
	}

}

Пример использования парсера:


HashMap<String, ProcMeminfoProperty> meminfoProperties = ProcMeminfoParser.parseProcMeminfo();

Log.i( TAG, 
		"total memory: " + meminfoProperties.get( ProcMeminfoProperty.MEM_TOTAL ).getAmountCount() 
		+ " free memory: " + meminfoProperties.get( ProcMeminfoProperty.MEM_FREE ).getAmountCount() );

< Как получить информацию о прошивке телефона в Android Информация о постоянном хранилище в Android >

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии