Emmagee是监控指定被测应用在使用过程中占用机器的CPU、内存、流量资源的性能测试小工具。项目如图:

主要源码分析:
-
public class CpuInfo { //测试cpu 封装cpu信息 当前时间被测应用占用的CPU使用率以及总体CPU使用量
-
public class EncryptData { //提供加密算法,可以对输入的字符串进行加密、解密操作
-
public class MailSender { //发送邮件给多个接收者、抄送邮件
-
public class MemoryInfo { //操作内存 封装内存消息 当前时间被测应用占用的内存量,以及占用的总体内存百分比,剩余内存量
-
public class ProcessInfo { //获得进程消息
-
public class TrafficInfo { //流量 信息 应用从启动开始到当前时间消耗的流量数
-
public class EmmageeService extends Service { //关键服务 所有的操作都基于该服务 操作如下:
-
private void readSettingInfo(Intent intent) { //读取配置文件
-
try {
-
Properties properties = new Properties();
-
properties.load(new FileInputStream(settingTempFile));
-
String interval = properties.getProperty("interval").trim();
-
isFloating = "true"
-
.equals(properties.getProperty("isfloat").trim()) ? true
-
: false;
-
sender = properties.getProperty("sender").trim();
-
password = properties.getProperty("password").trim();
-
recipients = properties.getProperty("recipients").trim();
-
time = "".equals(interval) ? "5" : interval;
-
recipients = properties.getProperty("recipients");
-
receivers = recipients.split("\s+");
-
smtp = properties.getProperty("smtp");
-
} catch (IOException e) {
-
time = "5";
-
isFloating = true;
-
Log.e(LOG_TAG, e.getMessage());
-
}
-
}
-
private void createResultCsv() { //创建保存文件
-
//测试数据写入到CSV文件中,同时存储在手机中
-
Calendar cal = Calendar.getInstance();
-
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
-
String mDateTime;
-
if ((Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk")))
-
mDateTime = formatter.format(cal.getTime().getTime() + 8 * 60 * 60
-
* 1000);
-
else
-
mDateTime = formatter.format(cal.getTime().getTime());
-
-
if (android.os.Environment.getExternalStorageState().equals(
-
android.os.Environment.MEDIA_MOUNTED)) {
-
resultFilePath = android.os.Environment
-
.getExternalStorageDirectory()
-
+ File.separator
-
+ "Emmagee_TestResult_" + mDateTime + ".csv";
-
} else {
-
resultFilePath = getBaseContext().getFilesDir().getPath()
-
+ File.separator + "Emmagee_TestResult_" + mDateTime
-
+ ".csv";
-
}
-
try {
-
File resultFile = new File(resultFilePath);
-
resultFile.createNewFile();
-
out = new FileOutputStream(resultFile);
-
osw = new OutputStreamWriter(out, "GBK");
-
bw = new BufferedWriter(osw);
-
long totalMemorySize = memoryInfo.getTotalMemory();
-
String totalMemory = fomart.format((double) totalMemorySize / 1024);
-
bw.write("指定应用的CPU内存监控情况rn" + "应用包名:," + packageName + "rn"
-
+ "应用名称: ," + processName + "rn" + "应用PID: ," + pid
-
+ "rn" + "机器内存大小(MB):," + totalMemory + "MBrn"
-
+ "机器CPU型号:," + cpuInfo.getCpuName() + "rn"
-
+ "机器android系统版本:," + memoryInfo.getSDKVersion() + "rn"
-
+ "手机型号:," + memoryInfo.getPhoneType() + "rn" + "UID:,"
-
+ uid + "rn");
-
bw.write("时间" + "," + "应用占用内存PSS(MB)" + "," + "应用占用内存比(%)" + ","
-
+ " 机器剩余内存(MB)" + "," + "应用占用CPU率(%)" + "," + "CPU总使用率(%)"
-
+ "," + "流量(KB):" + "rn");
-
} catch (IOException e) {
-
Log.e(LOG_TAG, e.getMessage());
-
}
-
}
-
private void createFloatingWindow() { //创建浮动窗口
-
//可以选择开启浮窗功能,浮窗中实时显示被测应用占用性能数据信息
-
//在浮窗中可以快速启动或者关闭手机的wifi网络
-
SharedPreferences shared = getSharedPreferences("float_flag",
-
Activity.MODE_PRIVATE);
-
SharedPreferences.Editor editor = shared.edit();
-
editor.putInt("float", 1);
-
editor.commit();
-
windowManager = (WindowManager) getApplicationContext()
-
.getSystemService("window");
-
wmParams = ((MyApplication) getApplication()).getMywmParams();
-
wmParams.type = 2002;
-
wmParams.flags |= 8;
-
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
-
wmParams.x = 0;
-
wmParams.y = 0;
-
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
-
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
-
wmParams.format = 1;
-
windowManager.addView(viFloatingWindow, wmParams);
-
viFloatingWindow.setOnTouchListener(new OnTouchListener() {
-
public boolean onTouch(View v, MotionEvent event) {
-
x = event.getRawX();
-
y = event.getRawY() - 25;
-
switch (event.getAction()) {
-
case MotionEvent.ACTION_DOWN:
-
// state = MotionEvent.ACTION_DOWN;
-
startX = x;
-
startY = y;
-
mTouchStartX = event.getX();
-
mTouchStartY = event.getY();
-
Log.d("startP", "startX" + mTouchStartX + "====startY"
-
+ mTouchStartY);
-
break;
-
case MotionEvent.ACTION_MOVE:
-
// state = MotionEvent.ACTION_MOVE;
-
updateViewPosition();
-
break;
-
-
case MotionEvent.ACTION_UP:
-
// state = MotionEvent.ACTION_UP;
-
updateViewPosition();
-
showImg();
-
mTouchStartX = mTouchStartY = 0;
-
break;
-
}
-
return true;
-
}
-
});
-
-
btnWifi.setOnClickListener(new OnClickListener() {
-
@Override
-
public void onClick(View v) {
-
try {
-
btnWifi = (Button) viFloatingWindow.findViewById(R.id.wifi);
-
String buttonText = (String) btnWifi.getText();
-
String wifiText = getResources().getString(
-
R.string.openwifi);
-
if (buttonText.equals(wifiText)) {
-
wifiManager.setWifiEnabled(true);
-
btnWifi.setText(R.string.closewifi);
-
} else {
-
wifiManager.setWifiEnabled(false);
-
btnWifi.setText(R.string.openwifi);
-
}
-
} catch (Exception e) {
-
Toast.makeText(viFloatingWindow.getContext(), "操作wifi失败",
-
Toast.LENGTH_LONG).show();
-
Log.e(LOG_TAG, e.toString());
-
}
-
}
-
});
-
}
-
private void dataRefresh() {//刷新数据
-
int pidMemory = memoryInfo.getPidMemorySize(pid, getBaseContext());
-
long freeMemory = memoryInfo.getFreeMemorySize(getBaseContext());
-
String freeMemoryKb = fomart.format((double) freeMemory / 1024);
-
String processMemory = fomart.format((double) pidMemory / 1024);
-
ArrayList<String> processInfo = cpuInfo.getCpuRatioInfo();
-
if (isFloating) {
-
String processCpuRatio = "0";
-
String totalCpuRatio = "0";
-
String trafficSize = "0";
-
int tempTraffic = 0;
-
double trafficMb = 0;
-
boolean isMb = false;
-
if (!processInfo.isEmpty()) {
-
processCpuRatio = processInfo.get(0);
-
totalCpuRatio = processInfo.get(1);
-
trafficSize = processInfo.get(2);
-
if ("".equals(trafficSize) && !("-1".equals(trafficSize))) {
-
tempTraffic = Integer.parseInt(trafficSize);
-
if (tempTraffic > 1024) {
-
isMb = true;
-
trafficMb = (double) tempTraffic / 1024;
-
}
-
}
-
}
-
if ("0".equals(processMemory) && "0.00".equals(processCpuRatio)) {
-
closeOpenedStream();
-
isServiceStop = true;
-
return;
-
}
-
if (processCpuRatio != null && totalCpuRatio != null) {
-
txtUnusedMem.setText("占用内存:" + processMemory + "MB" + ",机器剩余:"
-
+ freeMemoryKb + "MB");
-
txtTotalMem.setText("占用CPU:" + processCpuRatio + "%"
-
+ ",总体CPU:" + totalCpuRatio + "%");
-
if ("-1".equals(trafficSize)) {
-
txtTraffic.setText("本程序或本设备不支持流量统计");
-
} else if (isMb)
-
txtTraffic.setText("消耗流量:" + fomart.format(trafficMb)
-
+ "MB");
-
else
-
txtTraffic.setText("消耗流量:" + trafficSize + "KB");
-
}
-
}
-
}