文章目錄
- 現象
- 原因分析與解決
- 排查手機內部minicap
- 解決minicap問題
- 查看移動端Android SDK版本
- 查看minicap支持版本
- 單次方案
- 多次方案
- 最后問題-如何支持Android SDK 32+
現象
原因分析與解決
由于atxserver2在與Android動終端的鏈接過程中使用了agent:atxserver2-android-provider,按照項目中使用方法成功連接。當運行這個項目后,手機連接入電腦將自動安裝minicap、minitouch、atx-agent、whatsinput.apk、app-uiautomator-test.apk。
而負責手機界面傳輸的則是minicap這一個程序,因此主要的問題肯定存在于minicap中。
排查手機內部minicap
minicap這一程序能夠運行的條件需要同時安裝minicap和minicap.so兩個文件,在手機的/data/local/tmp文件夾下。
使用以下命令可以進入文件夾中查看:(鍵入exit以退出)
adb shell
cd data/local/tmp
ls
如果文件夾中不存在minicap和minicap.so,表示安裝失敗;
如果存在,可以運行以下adb命令,測試minicap是否可以運行:
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 2800x1840@2800x1840/0 -t
屏幕大小部分理論上應該填寫設備的實際情況,
/0
表示設備旋轉角度,-t
表示測試
minicap正常運行,會有如下圖顯示;未出現如下圖,都可認定為無效minicap,可能是版本/機型不匹配等原因導致的。
如果minicap測試結果正,常還是無法在網頁端正確顯示,建議重啟docker或重新插入移動端。
解決minicap問題
如果是minicap安裝,但是測試不通過,需要先刪除不匹配的minicap和minicap.so,如下:
adb shell
cd data/local/tmp
rm minicap
rm minicap.so
exit
現象中的第二截圖,其實已經提示了出現minicap安裝錯誤的原因:
ATX 此應用SDK版本太低,無法正常運行,請及時更新或聯系開發者
安裝的應用(minicap)Android SDK版本太低,而移動端系統Android SDK版本太高。
minicap版本太低,是因為官方給出的程序沒有進行更新。
查看移動端Android SDK版本
首先,查看移動端Android SDK版本;
移動終端的CPU架構是arm64-v8a
,Android SDK的版本31
查看minicap支持版本
通過對于項目源碼的分析,項目所指向的minicap下載源openatx/stf-binaries(截止文章時間,master分支對應的tag0.3.2),最新版本只更新到Android SDK 30
,如果使用的移動設備Android SDK高于30,則不會安裝正確的版本或者直接安裝失敗。
經過我長時間的研究發現,這一切的原因是uiautomator2這一個庫沒有實時更新所導致的,那么下面我將會給出兩個解決方案。
單次方案
既然能找到對應版本的minicap.so,可以直接將版本匹配的minicap
和minicap.so
(移動端Android SDK 31)下載,然后推送到移動端,即可解決。
然后通過adb命令推送到移動端:
adb push /home/data/minicap /data/local/tmp
adb push /home/data/minicap.so /data/local/tmp
再次測試minicap是否正常運行;
多次方案
如果有很多移動端需要連接,且版本都不匹配,單個一一推送太麻煩。上文中也提到了錯誤是因為uiautomator2庫沒有更新,因此我們就需要自行修改模塊中的代碼,從而讓以后每一臺移動端都可以下載版本匹配的minicap.so。
首先先找到自己uiautomator2庫安裝的位置,本人使用的是pip安裝,路徑為:
pip3 show uiautomator2
在其中我們需要修改的文件是init.py,有三個地方。我將使用vim界面進行截圖,各位可以打開自己的編譯器進行修改。
1.文件中211行(minicap)、220行(minitouch),需要修改代碼為如圖所示的路徑:
/0.3.0/node_modules/@devicefarmer
替換為/0.3.2/node_modules
,因為原路徑下版本不匹配;
220可以不修改,minitouch版本沒有影響
后續倉庫升級,需要修改為最新的tag
2.最后是代碼的第378行,需要修改>號后的數字為32
(因為當前最高版本為31)
修改完成后,保存退出,然后打開終端運行下面的代碼:
python -m uiautomator2 init
執行此命令即將文初提到的五個文件安裝到移動端,下載文件會比較慢,耐心等待;
如果出現download error,是因為文件會默認從一個鏡像中下載,在鏡像中沒有Android SDK 32及以后版本的文件,所以會失敗,鏡像下載失敗后,再從github中下載。
如果因為超時失敗,就再次運行代碼。
最終輸出Successfully init AdbDevice就表示安裝完成,可以測試minicap是否可用。
測試通過后,重啟docker再重連手機,就發現成功顯示手機屏幕。
最后問題-如何支持Android SDK 32+
目前您必須使用minicap-debug.apk方法。從Android 12及更高版本開始,團隊不再提供minicap.so方法。
需要自己編譯啦
https://github.com/DeviceFarmer/minicap/pull/58