手把手教你實現Android真機遠程截屏
- 2021 年 11 月 22 日
- 筆記
先看效果演示

接下來手把手教你實現這樣的效果。
minicap簡介
minicap是一個可以遠程獲取android螢幕畫面的開源庫,它在低版本的Android系統上採用截屏的方式獲取畫面,在Android4.2以上系統上採用創建VirtualDisplay的方式來獲取畫面、性能大大提高。 minicap的核心功能都在minicap.so中實現,如果要進行二次開發直接引用即可。
1.mincap下載
1.1 clone程式碼
git clone //github.com/openstf/minicap.git
cd minicap
git submodule init // 初始化jni/vendor/libjpeg-turbo子倉庫配置
git submodule update // 更新jni/vendor/libjpeg-turbo子倉庫程式碼
1.2 minicap倉庫目錄結構
minicap
|-example 簡單的示例客戶端,連接minicap服務端,轉換為web顯示
|-jni 源程式碼,minicap為純c/c++
| |-minicap 簡單的示例服務端,實現將捕獲到的幀通過網路傳輸的功能
| |-minicap-shared 核心功能庫,實現捕獲畫面、並通知listener的功能
| | |-aosp 實際實現
| | |-libs 已經編譯好的so庫
| | |-android-xx 對應API版本為xx的so庫,實現方法有所不同
| | |-src 源程式碼
| | |-mock 空實現
| |-vendor 依賴的第三方庫
| |
|-libs 編譯後的輸出目錄
2.mincap編譯
2.1 下載ndk-build

2.2 用ndk-build 編譯mincap安裝包
2.2.1 下載配置adb
1) 下載安裝adb
2) 在環境變數配置中添加adb路徑,按鍵Windows+R打開運行,輸入sysdm.cpl,回車,彈出系統屬性對話框 在高級==》環境變數==》系統變數==》path,添加adb可執行文件的文件夾路徑。

2.2.2 連接設備
需要手機打開調試者模式,打開 設置==>開發人員選項==>USB調試,打開即可。開發人員選項在Android4.2以下,可以直接看到。 在Android 4.2及以上版本中默認是隱藏的。打開開發人員選項的方法是:打開 設置==>關於手機,連續點擊版本號7次即可。
首次調試,手機會彈出是否允許某台電腦以USB方式調試該手機的問詢對話框,勾選允許使用這台電腦進行調試。

然後用adb devices命令,查看已連接的設備。如果設備列表為空,可以嘗試一下:1)重新開啟USB調試許可權 ; 2)撤銷USB調試許可權重新賦權;3) 重啟手機
adb devices

2.2.3 查看手機CPU支援的ABI(CPU指令架構)
不同的Android手機使用不同的CPU,而不同的 CPU支援不同的指令集,CPU與指令集的每種組合都有專屬的應用二進位介面,即 ABI(全稱:ApplicationBinary Interface)
adb shell getprop ro.product.cpu.abi

2.2.4 獲取手機設備的sdk
adb shell getprop ro.build.version.sdk

2.2.5 執行編譯
ndk-build可以通過APP_PLATFORM參數設置目標平台,默認是android-14,這裡指定的是android-26(8.0),實際並沒有什麼影響,因為只有minicap-shared的實現是平台相關的,但我們使用了編譯好的庫;通過APP_ABI可以指定指令平台,如果不指定默認將編譯全部的armeabi-v7a、arm64-v8a、x86、x86_64平台。
執行完畢後,在libs/armeabi-v7a下會生成minicap、minicap.so、minicap-nopie三個文件,實際用到的只有minicap,這裡生成的minicap.so是一個空實現。
ndk-build.cmd APP_PLATFORM=android-26 APP_ABI=arm64-v8a
3. 運行minicap項目示例
3.1 運行minicap項目中的example內的服務端
3.1.1 將編譯好的兩個文件push到手機設備上
so文件一定用minicap-master\jni\minicap-shared\aosp\libs\android-26\arm64-v8a\minicap.so,cpu架構要匹配.否則會導致與系統不兼容,運行會報錯
adb push libs/arm64-v8a/minicap data/local/tmp
adb push jni/minicap-shared/aosp/libs/android-26/arm64-v8a/minicap.so data/local/tmp
3.1.2 設置文件執行許可權
adb shell chmod 777 data/local/tmp/minicap
adb shell chmod 777 data/local/tmp/minicap.so
3.1.3 獲取android設備解析度
adb shell wm size
3.1.4 啟動服務端
# 測試伺服器是否可用
adb shell LD_LIBRARY_PATH=data/local/tmp data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t
# 啟動伺服器
adb shell LD_LIBRARY_PATH=data/local/tmp data/local/tmp/minicap -P 1080x1920@1080x1920/0
3.1.5 使用adb工具進行埠映射,將服務端的埠映射到1717,客戶端node讀取伺服器傳送數據的埠是1717
adb forward tcp:1717 localabstract:minicap
3.2 運行minicap項目中的example內的客戶端
3.2.1 安裝依賴
yarn
3.2.2 啟動客戶端
node app.js
參考文檔

