Зміст
У цій статті розповімо про те, як отримати інформацію про 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 | > |