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;
}