用smem来查看Android内存使用情况

现在我们用agcc来编译一个真正有用的东西(smem),然后让它跑在Android上面,这是一个用来查看Memory Usage的工具,它比Android原生的procmem准确。
对做Memory Optimization是很有用处的一个命令工具。
如何搭建编译smem的编译环境请参考在Android上運行本地C語言代碼,文中有说明怎么搭建和使用aggc来编译在Android上运行的本地程序
详细信息查看http://www.elinux.org/Using_smem_on_Android

现在开始让它跑在Android上面吧

最开始我用Mercurial下载了最新的源码(hg clone http://selenic.com/repo/smem)编译,发现出错。
找到一封邮件(http://selenic.com/pipermail/smem/2010-November.txt)说是可能和操作系统版本有关系,我是Ubuntu_X64的机器。
所以又重新下载了http://www.selenic.com/smem/download/smem-0.9.tar.gz,这个版本对于我来说是好用的。

具体使用步骤比较简单,解压出来放到一个文件夹。

/smem-0.9$ agcc smemcap.c -o a-smem
/smem-0.9$ adb remount
/smem-0.9$ adb shell mkdir /data/smem
/smem-0.9$ adb push a-smem /data/smem
/smem-0.9$ adb shell
# cd /data/smem
# ./a-smem >> memdata-moto.tar
/smem-0.9$ adb pull /data/smem/smem_data_moto.tar
/smem-0.9$ smem -S smem_data_moto.tar

执行这个命令后会得到如下输出

  PID User     Command                         Swap      USS      PSS      RSS 
 1439 1008     /system/bin/akmd2                  0       32       32       36 
12021 0        /system/bin/debuggerd              0       48       49      156 
 1431 0        /system/bin/installd               0       68       70      204 
 1432 1017     /system/bin/keystore /data/        0       72       73      168 
 1410 1001     /system/bin/nvm_daemon             0       76       77      204 
 1447 1000     /system/bin/secclkd                0       76       77      192 
 1403 1000     /system/bin/servicemanager         0       80       81      196 
 1430 1002     /system/bin/dbus-daemon --s        0       84       86      212 
18130 0        /system/bin/dhcpcd -ABKL ti        0       92       94      248 
 1409 0        /system/bin/usbd                   0      100      102      240 
 1433 0        /system/xbin/ssmgrd                0      100      102      240 
 1451 0        opprofdaemon                       0      100      107      276 
 1421 1001     /system/bin/rild_tcmd              0      100      121      344 
 1413 0        /system/bin/gkisystem              0      112      125      332 
 1423 0        /system/bin/catcommands            0      108      125      352 
 1437 1001     /system/bin/panic_daemon           0      124      126      316 
 1405 0        /system/bin/netd                   0      144      152      300 
 1404 0        /system/bin/vold                   0      152      160      316 
 1422 0        /system/bin/battd                  0      164      167      372 
19390 0        /system/bin/sh -                   0      144      173      376 
 1449 0        location                           0      168      191      428 
 1402 0        /sbin/adbd                         0      228      228      248 
    1 0        /init                              0      260      260      288 
 1444 1001     /system/bin/brcm_guci_drv -        0      276      287      496 
 1758 0        /system/bin/wpa_supplicant         0      324      326      476 
 1435 0        /system/bin/tcmd                   0      344      347      536 
19392 0        ./a-smem                           0      336      361      540 
 1407 0        /system/bin/rild                   0      472      506      828 
 1448 0        protocol_driver                    0      740      776     1096 
 1426 0        zygote /bin/app_process -Xz        0     1064     1742    12332 
 1427 1013     /system/bin/mediaserver            0     2028     2034     2324 
19278 10021    android.process.media              0     2388     3335    16900 
 1783 10049    com.motorola.usb                   0     2552     3360    15012 
19257 10074    com.picplz.rangefinder             0     2612     3578    17232 
19266 10093    com.google.android.apps.plu        0     3180     4161    17876 
 2481 10070    com.tencent.mm:push                0     3908     4562    15608 
19311 10053    com.google.android.apps.map        0     2808     5167    21776 
19344 10085    cn.com.fetion                      0     4152     6327    21236 
18709 10053    com.google.android.apps.map        0     5420     6561    20100 
 2011 10030    com.android.mms                    0     5720     6585    18920 
 1834 10059    com.google.process.gapps           0     6004     6704    17952 
19375 10022    com.android.email                  0     5616     6994    21076 
19330 10086    com.tencent.WBlog                  0     4064     7054    22436 
19302 10053    com.google.android.apps.map        0     4940     7510    24692 
 1780 1001     com.android.phone                  0     8960     9690    21508 
 1773 10069    com.cootek.smartinputv5            0     9400    10111    21592 
 7687 10004    android.process.acore              0    12364    14029    26980 
 1693 1000     system_server                      0    39128    40908    57464 

这样你就可以看出Android上每个process所占用的内存情况,基本可以满足日常使用了,简单好用。
更多更高级的用法可以参见主页http://www.selenic.com/smem/。