首页 > 代码库 > 从图片对比的角度看启动时间

从图片对比的角度看启动时间

目前测启动时间用得较多的方法:

1.am start -W  只获取activity的启动时间

-W:等目标Activity启动后才返回
-n:用于设置Intent的Component

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%的图片,记录时间,用当前时间减去第一张的时间,等于启动速度。。

 

从图片对比的角度看启动时间