加快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
的高速
安装
首先需要依赖NDK
、adb
、git
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 '\r')
SDK=$(adb shell getprop ro.build.version.sdk | tr -d '\r')
拷贝文件到设备:
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)