加快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