手把手教你實現Android真機遠端截圖

孤舟蓑翁發表於2021-11-22

先看效果演示

 接下來手把手教你實現這樣的效果。 

minicap簡介  

  minicap是一個可以遠端獲取android螢幕畫面的開源庫,它在低版本的Android系統上採用截圖的方式獲取畫面,在Android4.2以上系統上採用建立VirtualDisplay的方式來獲取畫面、效能大大提高。 minicap的核心功能都在minicap.so中實現,如果要進行二次開發直接引用即可。

1.mincap下載

1.1 clone程式碼

git clone https://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

adb(Android Debug Bridge),安卓平臺除錯橋,是連線Android手機與PC端的橋樑,通過adb可以管理、操作模擬器和裝置,如安裝軟體、檢視裝置軟硬體引數、系統升級、執行shell命令等。

1) 下載安裝adb 

2) 在環境變數配置中新增adb路徑,按鍵Windows+R開啟執行,輸入sysdm.cpl,回車,彈出系統屬性對話方塊  在高階==》環境變數==》系統變數==》path,新增adb可執行檔案的資料夾路徑。

 

2.2.2 連線裝置

需要手機開啟除錯者模式,開啟  設定==>開發人員選項==>USB除錯,開啟即可。開發人員選項在Android4.2以下,可以直接看到。 在Android 4.2及以上版本中預設是隱藏的。開啟開發人員選項的方法是:開啟 設定==>關於手機,連續點選版本號7次即可。

首次除錯,手機會彈出是否允許某臺電腦以USB方式除錯該手機的問詢對話方塊,勾選允許使用這臺計算機進行除錯。

               

然後用adb devices命令,檢視已連線的裝置。如果裝置列表為空,可以嘗試一下:1) 在充電和檔案傳輸模式之間切換一下 ;2)重新開啟USB除錯許可權 ; 3)撤銷USB除錯許可權重新賦權;4) 重啟手機 

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

 

 參考文件

 

 

相關文章