zoukankan      html  css  js  c++  java
  • 从图片对比的角度看启动时间

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

    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%的图片,记录时间,用当前时间减去第一张的时间,等于启动速度。。
  • 相关阅读:
    EF CORE EntityFrameworkCore中关系模式一对一、一对多、多对多的使用
    C# LINQ中Join与GroupJoin的区别
    C#中HttpWebRequest、WebClient、HttpClient的使用
    .Net 性能优化--EFCore(EntityFrameworkCore)
    .Net 性能优化--缓存--分布式缓存
    .Net 性能优化--缓存--http缓存
    .Net 性能优化--缓存--分布式缓存 --sqlserver缓存
    .Net 性能优化--缓存--分布式缓存--reids缓存
    获取Kafka每个分区最新Offset的几种方法
    Wireshark使用入门
  • 原文地址:https://www.cnblogs.com/season-xie/p/6422049.html
Copyright © 2011-2022 走看看