有很多读者在拿到Android设备以后,可能会试着通过Google提供的工具来获得系统的内存使用情况。Google提供了一个工具叫DDMS,通过此工具可以获取内存的使用状况。
DDMS的全称是Dalvik Debug Monitor Service,是Android开发环境中的Dalvik虚拟机调试监控服务。它提供为测试设备截屏、针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等服务。
1.如何启动DDMS
DDMS工具存放在“SDK–tools/”路径下,启动DDMS的方法如下所示。
(1)直接双击ddms.bat运行。
(2)在Eclipes调试程序的过程中启动DDMS,在Eclipes中的界面如图4-1所示。然后选择“Other”按钮,如图4-2所示。
图4-1 Eclipes中的界面
图4-2 选择“Other”后的界面
此时双击图4-2中的“DDMS”按钮就可以启动了。DDMS对模拟器(Emulator)和外接测试机有同等效用。如果系统检测到它们(VM)同时运行,那么DDMS将会默认指向Emulator。以上两种启动后的操作有些不一样,建议分别尝试下。
2.DDMS的工作原理
DDMS将搭建起IDE与测试终端(Emulator或者Connected Device)的链接,它们应用各自独立的端口监听调试器的信息,DDMS可以实时监测与测试终端的连接情况。当有新的测试终端连接后,DDMS将捕捉到终端的ID(即运行进程),如图4-3所示。并通过adb命令建立调试器,从而实现发送指令到测试终端的目的。
DDMS监听第一个测试终端进程的端口为8600,下一个为8601,如果有更多终端进程,则按照这个顺序依次类推。DDMS通过8700端口接收所有测试终端的指令。
图4-3 捕捉到终端的ID
在图4-3中可以看到所有与DDMS连接的终端的详细信息,以及每个终端正在运行的进程名,每个进程最右边相对应的是连接的端口。因为Android是基于Linux内核开发的操作平台,同时也保留了Linux中特有的进程ID,它介于进程名和端口号之间。在图4-3中,在面板的右上角有一排很重要的按键他们分别是Debug the selected process、Update Threads、Update Heap、Stop Process和ScreenShot。
3.Emulator Control
通过“Emulator Control”面板上的一些功能设置可以非常容易的使测试终端模拟真实手机所具备的一些交互功能,例如,接听电话、根据选项模拟各种不同网络情况、模拟接受SMS消息和发送虚拟地址坐标用于测试GPS功能等。如图4-4所示。
图4-4 Emulator Control面板
图4-5中各个选项的具体说明如下所示:
(1)Telephony Status:通过选项设置模拟语音质量以及信号连接模式。
图4-5 Heap的界面
(2)Telephony Actions:模拟电话接听和发送SMS到测试终端。
(3)Location Control:模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识,可以通过以下3种方式:
●Manual:手动为终端发送二维经纬坐标。
●GPX:通过GPX文件导入序列动态变化地理坐标,从而模拟行进中的GPS变化的数值。
●KML:通过KML文件导入独特的地理标识,并根据变化的地理坐标以动态形式显示在测试终端。(www.daowen.com)
4.Threads、Heap、File Exporler
Threads、Heap、File Exporler属于同一面板,例如“Heap”界面如图4-5所示。
通过File Exporler面板可以查看Android模拟器中的文件,可以很方便的导入/导出文件。
5.Locate、Console
Locate面板用于显示输出的调试信息,Console面板显示Android模拟器输出及加载程序等信息。界面如图4-6所示。
图4-6 Locate和Console面板
6.使用DDMS获取内存数据
在DDMS中有一个很不错的内存监测工具Heap,使用Heap可以监测应用进程使用内存情况,具体操作步骤如下:
(1)启动Eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都已打开。
(2)将手机通过连接至电脑,连接时需要确认手机是处于“USB调试”模式,而不是“Mass Storage。
(3)连接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息。
(4)单击选中想要监测的进程,比如“system_process”进程。
(5)单击选中Devices视图界面中最上方一排图标中的“Update Heap”按钮。
(6)单击Heap视图中的“Cause GC”按钮;
(7)此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况,如图4-7所示。
图4-7 内存使用情况
在图4-8中列出了系统一些进程的使用情况。其中系统随时可以用的两项内存是Free和Buffers,因为编者设置的系统只有128M的内存,所以可用内存看上去已经很少了。编者在此系统试着运行相对很占内存的游戏时,并没有发现内存不足的问题。鉴于这个原因,我们从另一个角度去分析。
接下来我们用本章第6.2.2小节的方法进行获取内存情况,/proc/meminfo文件内容的截图,如图4-8所示。
图4-8 /proc/meminfo文件内容的截图
在图4-8所示的截图中,对于Linux系统来说,可以立即使用的内存为:
系统总共可用的内存为:
通过计算我们可以发现系统目前还有52%的内存处于空闲状态,与我们从DDMS中得到的数据差很多。或者说系统“隐藏”了内存。
由此可见,Android系统为了加快系统的运行速度会在系统允许的情况下,大量的使用内存作为应用程序的缓存。而当系统内存紧张的时候,会首先释放缓存中的内存,这也就是我依旧能运行占内存比较大的游戏的原因。由此可以总结道,如果想得到每个Android应用程序的内存比例,可以使用DDMS来得到。如果想判断系统内存更详细的信息,可以通过Linux的proc/meminfo获取。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。