Android 读取系统信息

来源:互联网 发布:圣贝口腔 知乎 编辑:程序博客网 时间:2024/05/29 10:05

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 kBMemFree:         1624196 kBBuffers:         5142232 kBCached:         35067120 kBSwapCached:       125516 kBActive:         20914880 kBInactive:       21564532 kBActive(anon):    6347300 kBInactive(anon):  6626488 kBActive(file):   14567580 kBInactive(file): 14938044 kBUnevictable:           0 kBMlocked:               0 kBSwapTotal:      94429180 kBSwapFree:       93320184 kBDirty:            840520 kBWriteback:             0 kBAnonPages:       2153040 kBMapped:            31568 kBShmem:          10702180 kBSlab:            4696188 kBSReclaimable:    4333116 kBSUnreclaim:       363072 kBKernelStack:        3016 kBPageTables:        23548 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:    119202716 kBCommitted_AS:   14210008 kBVmallocTotal:   34359738367 kBVmallocUsed:      409616 kBVmallocChunk:   34334162428 kBHardwareCorrupted:     0 kBAnonHugePages:         0 kBHugePages_Total:       0HugePages_Free:        0HugePages_Rsvd:        0HugePages_Surp:        0Hugepagesize:       2048 kBDirectMap4k:       44516 kBDirectMap2M:     4136960 kBDirectMap1G:    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;
}


原创粉丝点击