Содержание
В этой статье расскажем о том, как получить информацию о 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:
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:
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 | > |