• 加快adb截图


    加快adb截图

    传统截图方法

    adb shell screencap -p /sdcard/screen.png
    adb pull /sdcard/screen.png ./screen.png
    

    此方法可以通过省略写入手机内存的步骤,稍微优化:

    adb exec-out screencap -p > ./screen.png
    

    经过测试(1080x2400分辨率,画面较复杂),截图一次大约耗时0.8s

    优秀截图方法

    使用OpenSTF开发的工具minicap快速截图,可以达到100~200ms的高速

    安装

    首先需要依赖NDKadbgit

    yay android-ndk
    sudo pacman -S android-tools
    

    之后下载minicap源码:

    git clone https://github.com/openstf/minicap.git && cd minicap
    

    随后加载子模块:

    git submodule init
    git submodule update
    

    构建:(其实从这一步开始可以使用官方无脑脚本,详见./README.md

    ndk-build
    

    由于所需要的程序文件minicap及其共享库文件minicap.so都需要选择与手机架构、安卓sdk版本相适应,用以下命令获取:

    ABI=$(adb shell getprop ro.product.cpu.abi | tr -d '
    ')
    SDK=$(adb shell getprop ro.build.version.sdk | tr -d '
    ')
    

    拷贝文件到设备:

    adb push libs/$ABI/minicap /data/local/tmp/
    adb push jni/minicap-shared/aosp/libs/android-$SDK/$ABI/minicap.so /data/local/tmp/
    

    注: /data/local/tmp这个目录权限设定比较宽松,适合放置程序

    获取分辨率信息

    网上的博文普遍使用adb shell dumpsys window来获取,但是我发现其有的时候并不完全靠谱,于是我直接在手机设置里查到本机分辨率:1080x2400

    使用

    通过adb shell来调用minicap程序,每次都需要指定运行库位置:

    adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap
    

    可以使用-h参数查看帮助文档:

    $ adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -h
    Usage: /data/local/tmp/minicap [-h] [-n <name>]
      -d <id>:       Display ID. (0)
      -n <name>:     Change the name of the abtract unix domain socket. (minicap)
      -P <value>:    Display projection (<w>x<h>@<w>x<h>/{0|90|180|270}).
      -Q <value>:    JPEG quality (0-100).
      -s:            Take a screenshot and output it to stdout. Needs -P.
      -S:            Skip frames when they cannot be consumed quickly enough.
      -r <value>:    Frame rate (frames/s)  -t:            Attempt to get the capture method running, then exit.
      -i:            Get display information in JSON format. May segfault.
      -h:            Show help.
    

    minicap支持多种操作,具体用法懒得写了,可以看参考链接。

    (本文的精髓应该在玄学问题处理)

    玄学问题处理

    找不到 android-30 ?

    由于OpenSTF的仓库处于佛系更新状态,并没有支持Android11,因此可以选择下载积极更新的fork版本:

    git clone https://github.com/DeviceFarmer/minicap.git && cd minicap
    

    崩溃?

    Vector<> have different types

    Abort.

    这似乎是一部分系统的bug,详见issue。有神仙老哥给出了修复方案,但是我们不需要自己改代码重新编译,因为有好心老哥帮所有人编译好了:Xiaomi_Vector_issue

    无法运行?

    CANNOT LINK EXECUTABLE "/data/local/tmp/minicap": "/data/local/tmp/minicap.so" is 32-bit instead of 64-bit

    .so文件弄成32位的了,但是好心老哥没有写清楚哪个是64位。

    经过尝试应该是nw_minicap.so,但是名字要改回minicap.so

    参考资料

    前辈博客

    OpenSTF仓库

    DeviceFarmer仓库

  • 相关阅读:
    C++ Primer读书笔记
    谨慎使用多线程中的fork
    C++中多线程与Singleton的那些事儿
    浅谈指针的比较
    条件变量的陷阱与思考
    2014年终总结
    循环队列的一种实现模型
    react-native使用jest、enzyme进行单元测试
    富文本编辑器开发原理
    模拟实现单元测试中的异步测试
  • 原文地址:https://www.cnblogs.com/terrasse/p/fast-adb.html
Copyright © 2020-2023  润新知