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

參考資料

前輩博客

OpenSTF倉庫

DeviceFarmer倉庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM