Android 从本质上说是 Linux,因此可以把 Android 当作 Linux 来访问,从而达到访问系统信息的目的:
proc 文件系统
proc 文件系统是Linux内核开发人员为了减少系统调用的复杂性而引入的一种特殊文件系统。
有了这种文件系统,用户只需要像查看文本文件一样就能够读取内核中的各种数据,给开发人员和系统管理员带来很大的便利。
很多Linux常用命令都是依靠分析/proc目录下的文件来运行的,比如 ls,ps 等。
1、读取CPU和内存等信息。
分析 /proc/cpuinfo 这个文件,就能获得 CPU信息。
adb shell
# cat /proc/cpuinfo
1 processor : 0
2 vendor_id : GenuineIntel
3 cpu family : 6
4 model : 44
5 model name : Intel(R) Xeon(R) CPU X5690 @ 3.47GHz
6 stepping : 2
7 cpu MHz : 3457.854
8 cache size : 12288 KB
9 physical id : 1
10 siblings : 12
11 core id : 0
12 cpu cores : 6
13 apicid : 32
14 initial apicid : 32
15 fpu : yes
16 fpu_exception : yes
17 cpuid level : 11
18 wp : yes
分析 /proc/meminfo ,就能获得内存信息
adb shell
# cat /proc/meminfo
MemTotal: 49547076 kB
MemFree: 1624196 kB
Buffers: 5142232 kB
Cached: 35067120 kB
SwapCached: 125516 kB
Active: 20914880 kB
Inactive: 21564532 kB
Active(anon): 6347300 kB
Inactive(anon): 6626488 kB
Active(file): 14567580 kB
Inactive(file): 14938044 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 94429180 kB
SwapFree: 93320184 kB
Dirty: 840520 kB
Writeback: 0 kB
AnonPages: 2153040 kB
Mapped: 31568 kB
Shmem: 10702180 kB
Slab: 4696188 kB
SReclaimable: 4333116 kB
SUnreclaim: 363072 kB
KernelStack: 3016 kB
PageTables: 23548 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 119202716 kB
Committed_AS: 14210008 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 409616 kB
VmallocChunk: 34334162428 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 44516 kB
DirectMap2M: 4136960 kB
DirectMap1G: 46137344 kB
MemTotal: 所有可用RAM大小。
MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。
Buffers: 用来给文件做缓冲大小。
Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache minus SwapCache)。
SwapCached: 被高速缓冲存储器(cache memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。
Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。
Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。
SwapTotal: 交换空间的总大小。
SwapFree: 未被使用交换空间的大小。
Dirty: 等待被写回到磁盘的内存大小。
Writeback: 正在被写回到磁盘的内存大小。
AnonPages: 未映射页的内存大小。
Mapped: 设备和文件等映射的大小。
Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。
SReclaimable: 可收回Slab的大小。
SUnreclaim: 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
PageTables: 管理内存分页页面的索引表的大小。
NFS_Unstable: 不稳定页表的大小。
注:用 Android SDK 的 ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo) 也能获得当前可用内存的大小
public class CMDExecute {
public synchronized String run(String [] cmd, String workdirectory) throws IOException {
String result = "";
try {
ProcessBuilder builder = new ProcessBuilder(cmd);
InputStream in = null;
//设置一个路径
if (workdirectory != null) {
builder.directory(new File(workdirectory));
builder.redirectErrorStream(true);
Process process = builder.start();
in = process.getInputStream();
byte[] re = new byte[1024];
while (in.read(re) != -1)
result = result + new String(re);
}
if (in != null) {
in.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
用代码来查看操作系统版本:
在可行性分析中给出的CMDExencute类来调用系统的cat命令获取该文件的内容,实现代码如下:
public static String fetch_version_info() {
String result = null;
CMDExecute cmdexe = new CMDExecute();
try {
String[ ] args = {"/system/bin/cat", "/proc/version"};
result = cmdexe.run(args, "system/bin/");
} catch (IOException ex) {
ex.printStackTrace();
}
return result;
}
Linux version 3.0.0-12-server (buildd@crested) (gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) ) #20-Ubuntu SMP Fri Oct 7 16:36:30 UTC 2011
获取网络信息
要获取手机设备的网络信息,只要读取/system/bin/netcfg中的信息就可以了,关键代码如下:
publicstatic String fetch_netcfg_info() {
String result = null;
CMDExecute cmdexe = new CMDExecute();
try {
String[ ] args ={"/system/bin/netcfg"};
result = cmdexe.run(args,"/system/bin/");
} catch (IOException ex) {
Log.i("fetch_process_info","ex=" + ex.toString());
}
return result;
}