从图片对比的角度看启动时间
目前测启动时间用得较多的方法:
1.am start -W 只获取activity的启动时间
2.高速相机 以真实的用户体验去获取应用的启动时间
第一种可能得不到我们想要的。
第二种过于依赖硬件设备
-
冷启动:这时候你的应用程序的进程是没有创建的. 这也是大部分应用的使用场景.用户在桌面上点击你应用的 icon 之后,首先要创建进程,然后才启动 MainActivity.用户在桌面上点击这个 Activity 的时候,系统会直接起这个 Activity. 我们知道 Activity 在启动的时候会走 onCreate/onStart/onResume .这几个回调函数.
-
热启动:如果是你按Back键,并没有将应用进程杀掉的话,那么执行上述命令就会快一些,因为不用创建进程了,只需要启动一个Activity即可。这也就是我们说的应用热启动。
扩展一种方法:
以高速相机的对比思维获取启动时间,采用图片对比的方式:
存在两个重点:
1.快速截图
2.高效对比图片
下面采用的是uiuatomator完成以上的两点:
第一个是快速截图,截图的图片必须经过压缩,时间大概提升300ms一张图片。大概70-100ms完成一张的截图
// 显式调用 Bitmap screenshot = mUiAutomation.takeScreenshot(); // 压缩 screenshot = compress(screenshot);
/**
* 简单压缩一下图片
* */
Bitmap compress(Bitmap bitmap) {
System.out.println("source bitmap :" + bitmap.getByteCount());
if (bitmap != null)
{
bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() / 6, bitmap.getHeight() / 6, true); //以6倍缩小
System.out.println("compress bitmap :" + bitmap.getByteCount());
return bitmap;
}
return bitmap;
}
图片对比:
//压缩后在读取图片像素点做对比 BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一 options.inPreferredConfig = Bitmap.Config.RGB_565; //2条线程分别读取上下两半的图片,得出不相似的百分比 public void run() { for (int y = xx; y < yy; y++) { for (int x = 0; x < bitmap1.getWidth(); x++) { if (bitmap1.getPixel(x, y) != bitmap2.getPixel(x, y)) { synchronized (this) { ImageUtil.numDiffPixels++; } } } } ImageUtil.countdownLatch.countDown(); }
整体流程:
ShellUtil.startApp(AppInfo.PACKAGE_BROWSER, AppInfo.ACTIVITY_BROWSER); //1.启动被测应用 takeScreen t = new takeScreen(api); //2.实例化截图的线程类 for (int a = 0; a < time; a++) { cachedThreadPool.execute(t); //3.以100ms的间隔截图25张 api.sleep(100); } api.sleep(2000); //两秒收分析,收集结果 String[] result = loadImage.compareOnBegin("/sdcard/" + AutoBase.REPORTPATH + "/" + AutoBase.REPORTPATH, yes);
String[] result 是一个数组,原因是图片读取是从开头到结尾,会读取两张图片相似度小于80%的图片,记录时间,用当前时间减去第一张的时间,等于启动速度。。