cpu,内存监控作为android性能测试的一部分,在日常工作中使用也比较频繁,一般测试人员都是直接adb命令输出结果或者android studio上查看内存,Cpu的趋势,再深入一点就是性能分析定位了。由于本人水平有限,就先分享个android apk 监控指定应用的cpu和内存。先附上两张效果图:
原理如下
输入需要监控的应用包名,输入监控的间隔时间,输入监控的总时间,点击监控就会执行监控命令,点击监控统计会在图标显示各项参数的最大值,最小值,平局值。点击监控详情会跳转到新的界面,展示详细的监控参数
代码如下
1.先在manifest文件加上如下权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2.MainActivity代码如下
package com.example.monitor;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainActivity extends AppCompatActivity {
EditText editText_times,editText_min,editText_package;
Button button_top,button_reporte,cpu_btn,start_app,start_time;
TextView countDown,cpu_max,cpu_min,cpu_ave,rss_max,rss_min,rss_ave,vss_max,vss_min,vss_ave;
TextView total_time,wait_time,completa_time;
FileUtils fu=new FileUtils();
List cpu,rss,vss=new ArrayList<String>();
ListUtils lu=new ListUtils();
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//监控详情按钮,点击后通过intent传值到新的activity
cpu_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
cpu= fu.readcpu("/mnt/sdcard/topInfo.txt",editText_package);
rss= fu.readrss("/mnt/sdcard/topInfo.txt",editText_package);
vss=fu.readvss("/mnt/sdcard/topInfo.txt",editText_package);
String times=fu.read("/mnt/sdcard/totime.csv");
String totalTime=fu.read("/mnt/sdcard/totaltime.csv");
Intent intent = new Intent(MainActivity.this,TopDetailActivity.class);
intent.putExtra("times",times);
intent.putExtra("totalTime",totalTime);
intent.putStringArrayListExtra("cpu", (ArrayList) cpu);//key就是自己定义一个String的字符串就行了
intent.putStringArrayListExtra("vss", (ArrayList) vss);
intent.putStringArrayListExtra("rss", (ArrayList) rss);
startActivity(intent);
} catch (Exception e) {
Toast toast=Toast.makeText(MainActivity.this, "监控文件被删除", Toast.LENGTH_SHORT);
toast.show();
}
}
});
//监控报告按钮
button_reporte.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread() {
@Override
public void run() {//在run()方法实现业务逻辑;
//...
//更新UI操作;
handler.post(new Runnable() {
@Override
public void run() {
List<String>str_cpu= null;
List<String>str_vss= null;
List<String>str_rss= null;
try {
str_cpu = fu.readcpu("/mnt/sdcard/topInfo.txt",editText_package);
str_rss=fu.readrss("/mnt/sdcard/topInfo.txt",editText_package);
str_vss=fu.readvss("/mnt/sdcard/topInfo.txt",editText_package);
List cpu_info=lu.StrToInt(str_cpu);
List rss_info=lu.StrToInt(str_rss);
List vss_info=lu.StrToInt(str_vss);
double ave=lu.listAverage(cpu_info);
double ave1=lu.listAverage(rss_info);
double ave2=lu.listAverage(vss_info);
Log.i("cpuinfo", Collections.max(str_cpu));
Log.i("cpuinfo", Collections.min(str_cpu));