Як отримати інформацію про 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 >

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі