使用docker部署atxserver后,在网页左侧无法显示手机的屏幕,并且点击位置也与实际有较大偏差。经过研究发现是手机没有正确的安装minicap和minicap.so导致屏幕实时传输失败。
1.错误界面
图1 错误界面
2.原因分析与解决
由于atxserver2在与手机的链接过程中使用了另一个项目:atxserver2-android-provider,本人使用的是windows操作系统,按照项目中使用方法成功连接。当运行这个项目后,手机连接入电脑将自动安装minicap,minitouch,atx-agent,whatsinput.apk,app-uiautomator-test.apk。而负责手机界面传输的则是minicap这一个程序,因此主要的问题肯定存在于minicap中。
项目地址:atxserver2-android-provider
1.排查手机内部minicap
通过上网查询,minicap这一程序能够运行的条件需要同时安装minicap和minicap.so两个文件,目录在手机的/data/local/tmp文件夹中,使用以下命令可以进入文件夹中查看:(键入exit以退出)
adb shell
cd data/local/tmp
ls
如果文件夹中存在minicap和minicap.so,可以运行以下代码测试minicap是否可以运行:(屏幕大小部分理论上应该填写设备的实际情况,不过好像填错不会影响结果,/0表示设备旋转角度,-t表示测试)
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1440x1980@1440x1980/0 -t
如果出现以下输出,则表示手机中的minicap不可用,可能是版本/机型不匹配等原因导致的。
图2 无效minicap测试结果
而以下的输出则表示minicap版本与当前手机适配,可以正常运行。
图3 正常minicap测试结果
如果minicap测试结果正常还是无法在网页端正确显示,建议重启docker或重新插入手机,可能就好了
2.解决minicap问题
无论是minicap没有安装,还是minicap测试不通过,肯定需要重新安装,所以这边建议可以将已经安装的minicap和minicap.so删除(如有),命令如下:
adb shell
cd data/local/tmp
rm minicap
rm minicap.so
exit
出现minicap安装错误,大概率是因为手机的android sdk版本太高,而官方给出的程序没有进行更新。通过我对于项目源码的分析,项目所指向的minicap下载源只更新到android sdk 28,如果使用的测试设备安卓版本高于28,则不会安装正确的版本。经过我长时间的研究发现,这一切的原因是uiautomator2这一个库没有实时更新所导致的,那么下面我将会给出两个解决方案。
图 4 uiautomator原下载仓库
3.我是懒鬼,我就想这一次连上以后不管了
对于这种情况,可以将正确的minicap和minicap.so推送到设备上即可解决。
在操作之前,首先应当查询自己的设备的cpu架构和安卓sdk版本:
adb shell getprop ro.product.cpu.abi
adb shell getprop ro.build.version.sdk
在获取之后,我们只需要去openatx/stf-binaries/tree/0.3.2的仓库中找到自己所需要的版本的两个文件就好啦!
下载解压后,下面两个文件就是我们需要的minicap和minicap.so文件,其中arm64-v8a是我的cpu架构,android-31是我的安卓sdk版本号,换成上面查询到的自己的即可。
node_modules/minicap-prebuilt/prebuild/arm64-v8a/bin/minicap
node_modules/minicap-prebuilt/prebuild/arm64-v8a/lib/android-31/minicap.so
然后就可以push到手机中啦,命令如下。(命令中将两个文件放在了c盘中,自行替换路径)
adb push C:/minicap /data/local/temp
adb push D:/minicap.so /data/local/temp
这样就安装成功了,再次运行上文中的测试代码应该就可以得到正确的结果了。
4.我以后有好多手机想要链接,有没有一劳永逸的办法
如果想要一劳永逸,那么我们就需要对源码进行调整。上文中也提到了错误是因为uiautomator2库没有更新,因此我们就需要自行修改库中的代码从而让以后每一台手机都可以正常的下载两个文件。
首先先找到自己uiautomator2库安装的位置,本人使用的是pip安装,路径为:
C:\Users\自己的用户名\AppData\Local\Programs\Python\Python38\Lib\site-packages\uiautomator2
在其中我们需要修改的文件是init.py,有三个地方。我将使用vim界面进行截图,各位可以打开自己的编译器进行修改。
1.首先是代码的第211行,需要修改代码为如图所示的路径:
图5 代码211行
2.其次是代码的第 220行,需要修改代码为如图所示的路径:(此处可以不操作,minitouch版本没有影响)
图6 代码220行
3.最后是代码的第378行,需要修改>号后的数字为32(因为当前最高版本为31)
图7 代码378行
三处修改完成后记得保存退出,然后打开终端运行下面的代码:
python -m uiautomator2 init
执行此命令即将文初提到的五个文件安装到手机中,输出结果:
图8 执行结果
下载文件会比较慢,出现download error是因为文件默认从一个镜像中先下载,下载失败后从github中下载,在镜像中没有android sdk29及以后版本的文件,所以会失败。如果因为超时失败,就再次运行代码。最终输出Successfully init AdbDevice就表示安装完成,可以按照前文测试minicap是否可用,本人操作后成功通过。
5.收尾
测试通过后,重启docker再重连手机,就发现成功显示手机屏幕啦。
图 9 最终界面
3. 总结
困扰了我三天的问题终于得到了解决,尝试过自己编译也无法成功通过测试,最终还是依靠不断地读代码和查资料找到了解决方案。如果后续uiautomator2继续更新了可能这篇博客就没有用了吧hhhh,不过要是没有更新,只要有地方可以下载到后续版本的minicap和minicap.so,在三个修改的地方进行地址的替换也应该可以达到最终的效果。
要是这篇博客对你有所帮助的话请给个赞支持一下哦~
最后祝大家学习顺利,科研成功!