首页 > 代码库 > LikeMonkey,更新功能,小优化
LikeMonkey,更新功能,小优化
经过上次的LikeMonkey工具开发,目前测试算是比较稳定,这个时候,开发人员的需求又来了
开发人员需要一个可以在测试中实时查看被测应用内存占用的功能,可以在初期测试中观察内存占用情况,于是....继续修改.....
话说,ActivityManager这个东西确实是个相当不错的东西,在网上仔细研究了一下,对于管理方面的部分功能还是很实用的,这次的内存监听依然使用的是ActivityManager
首先我们再注册一个service,用他来专门进行被测进程内存的监听工作并将内存信息写入手机本地存储,废话不多说,直接上代码:
//用于进行被测程序内存占用统计的servicepackage test.Monkey;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.List;import android.app.ActivityManager;import android.app.Service;import android.app.ActivityManager.RunningAppProcessInfo;import android.content.Intent;import android.os.Debug;import android.os.Environment;import android.os.IBinder;import android.text.format.Formatter;import android.util.Log;import android.widget.Toast;public class MemInfoService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } boolean setwhile=true; public void onCreate(){ final ActivityManager ActivityList=(ActivityManager)getApplicationContext().getSystemService(ACTIVITY_SERVICE); Toast.makeText(getApplicationContext(), "内存统计service已启动", 3000).show(); new Thread(){ public void run(){ while(setwhile) { ActivityManager.MemoryInfo mem=new ActivityManager.MemoryInfo(); ActivityList.getMemoryInfo(mem); long memsize=mem.availMem; String leftMemSize = Formatter.formatFileSize(getBaseContext(), memsize); Log.e("baih", "剩余内存:"+leftMemSize); //获取进程内存占用 List<RunningAppProcessInfo> mRuning = ActivityList.getRunningAppProcesses(); for(ActivityManager.RunningAppProcessInfo amPro:mRuning) { if(amPro.processName.equals("com.stnts.suileyoo.gamecenter")) { int[] muMem=new int[]{amPro.pid}; Debug.MemoryInfo[] memoryInfo=ActivityList.getProcessMemoryInfo(muMem); double memSiz=memoryInfo[0].dalvikPrivateDirty/1024.0; int temp=(int) (memSiz*100); memSiz=temp/100.0; String ProInfo="";// File sdcardDir=Environment.getExternalStorageDirectory();// String path=sdcardDir.getPath()+"/LikeMonkey_doc";// File path1=new File(path);// if(!path1.exists())// {// path1.mkdirs();// } ProInfo+="本机剩余内存:"+leftMemSize+" "+"程序包名:"+amPro.processName+" "+"\nPID:"+amPro.pid+" "+"\n内存占用:"+memSiz+"MB\n"+"\r\n"; Log.e("baih",ProInfo); File file=new File("/mnt/sdcard/LikeMonkey_doc", "MemInfo_LikeMonkey.txt"); try { if(!file.exists()){ boolean creatFile = file.createNewFile(); System.out.println("创建文件:" + creatFile); } FileWriter mWriter=new FileWriter(file,true); mWriter.write(ProInfo); mWriter.flush(); mWriter.close();// BufferedWriter mWriter = new BufferedWriter(new FileWriter(file));// mWriter.write(ProInfo);// mWriter.flush();// mWriter.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else{ continue; } } try { Thread.sleep(30000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }.start(); } public void onDestory(){ setwhile=false; }}
我们从网上可以查到,ActivityManager有一个MemoryInfo对象,可以进行进程的内存获取;同时我们需要RunningAppProcessInfo获取到当前系统正在运行的进程的集合,然后去遍历这个集合,根据每个元素的processName(包名)字段去筛选我们需要获取内存信息的进程,然后通过ActivityManager的getProcessMemoryInfo方法去获取到这个进程的内存值,通过换算得到进程的内存占用信息;然后将这个进程的各项信息,比如包名,PID,内存占用等信息逐条写入到手机本地存储的文件中,并且保持30秒读取一次,效果如下:
目前,Logcat输出,进程内存占用输出功能就都齐全了,算是勉强完成了开发人员的需求
另贴一下ActivityManager的各项知识,真心很好用
ActivityManager 类:
获取方法 ActivityManager mActivityManager (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
常用的静态内部类如下(下面具体介绍):
ActivityManager.MemoryInfo: 系统可用内存信息
ActivityManager.RecentTaskInfo: 最近的任务信息
ActivityManager.RunningAppProcessInfo: 正在运行的进程信息
ActivityManager.RunningServiceInfo: 正在运行的服务信息
ActivityManager.RunningTaskInfo: 正在运行的任务信息
常用方法:
public void getMemoryInfo(ActivityManager.MemoryInfo outInfo)
说明:获取系统可用内存信息,数据封装在outInfo对象上
public Debug.MemoryInfo getProcessMemoryInfo(int[ ] pids
说明:获取每个进程ID(集合)占用的内存大小(集合), pid和MemoryInfo是一一对应的。
参数: pids 进程ID的集合
PS :我们可以通过调用Debug.MemoryInfo 的dalvikPrivateDirty字段获取进程占用的内存大小(单位为KB)
public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcess()
说明: 获取系统里正在运行的进程
<>(int maxNum)
说明: 获取系统里所有正在运行的服务
参数:可能服务的最大值(赋予一常数即可,20、50都OK)
<>(int maxNum)
说明:获取系统里正在运行的服务
参数: 同上
<(int maxNum, int flags)
说明:获取系统里最近启动的任务
参数: 同上,flags一般为0即可
说明:立即杀掉给定包名的进程,释放进程占用的资源(内存等),如果需要,系统会再次重新启动该进程。系统
PS:系统进程是杀不死的,只能杀死用户进程。但我没有找到好的方法辨别系统进程还是用户进程。但可以肯定的是,
能够杀死的一定是用户进程。
public void restartPackage(String packageName)
说明:该方法已弃用,等同于killBackgroundProcess 。
ActivityManager.MemoryInfo类
常用字段:
long availMem 系统可用内存
long threshold系统内存不足的阀值,即临界值
boolean lowMemory 如果当前可用内存<=threshold,该值为真
ActivityManager.RunningAppProcessInfo类
常用字段:
int pid 进程ID
int uid 进程所在的用户ID
String processName 进程名,默认是包名或者由android:process=””属性指定
String [ ] pkgList 运行在该进程下的所有应用程序包名
LikeMonkey,更新功能,小优化