Python+scrcpy+pyminitouch实现自动化(三)——实现触摸

在上次使用pyminitouch的时候出现了这个问题:

AssertionError: minitouch did not work.

之后我就开始努力解决这个问题,去网上搜罗了minitouch的使用方法。在上一篇文章中我已经把minitouch push到手机上了。

关于minitouch工具的文章:STF 框架之 minitouch 工具 · TesterHome,在里面已经介绍的很详细了。

  • minitouch:提供一个socket接口用来在Android设备上的多点触摸以及手势。它能够支持api 10以上的设备且不需要通过root,但是根据不同的cpu的ABI需要使用不同的minitouch。

使用:

  • 判断设备CPU的ABI:

adb shell getprop ro.product.cpu.abi armeabi-v7a

  •  adb push 对应的 minitouch文件到设备上
adb push libs/$ABI/minitouch /data/local/tmp/

 其中的libs/$ABI是你电脑中minitouch的路径,我的是C:\Users\auus\minitouch

  • push过去的文件需要执行时是需要权限的,在上一篇文章我不成功我发现是因为我粗心没有给其权限的问题。

    需要使用adb shell去给予权限。之后出现了这个问题:

    /system/bin/sh: su: inaccessible or not found

查询相关资料后,如果进入adb shell时,前缀中含有美元符号$,则表示不是以root身份运行。如果前缀是#,那么就是root身份运行。

现在的问题是我想输入su切回root权限,发现却无法执行 T T,流下了毫无技术的泪水。

其实并不是找不到su命令,只是因为没有root权限,也执行不了su命令。这根本就是一个死胡同。

对于虚拟机的解决方法:打开Android Studio,将默认的Google play改为Google APIS。

对于真机的解决方法:需要打开你手机的root,我使用的是小米的手机,打开root权限需要先打开开发者选项,之后进入Bootloader模式。

我的手机是MIUI13稳定版,所以要换成开发版属实是有点小题大做了,并且minitouch本身不需要root权限,是要执行文件中的东西需要root权限,之后我就采取了下面的方法:打开事先装好的Android Studio

具体步骤参考:https://github.com/DeviceFarmer/STFService.apk#building

  • 安装STFService.apk

git clone https://github.com/DeviceFarmer/STFService.apk.git

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第1张图片

  •  按照指示运行
gradlew assembleDebug

会出现这个报错:

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第2张图片

 解决方法:

在你的project中找到build.gradle,打开后在首行添加:

task assemble
{

}

如图:

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第3张图片

 之后在运行一次gradlew assembleDebug即可成功:

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第4张图片

  •  继续运行
gradlew installDebug

在手机上确定下载:

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第5张图片

此刻app-debug.apk安装成功。

  • 启动两个service:

adb shell am startservice --user 0  -a jp.co.cyberagent.stf.ACTION_START  -n jp.co.cyberagent.stf/.Service
  • 出现了新的问题:

    Starting service: Intent { act=jp.co.cyberagent.stf.ACTION_START cmp=jp.co.cyberagent.stf/.Service } Error: Not found; no service started.

我觉得是因为我的手机上并没有STFService.apk,所以我使用adb push,将我所下载的STFService.apk传到手机上:

adb push C:\Users\auus\AndroidStudioProjects\MyApplication\STFService.apk /data/local/tmp

使用命令查看是否加载成功:

adb shell
cd /data/local/tmp
ls

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第6张图片

好了,最后还是回到问题的根本:其实使用pyminitouch不需要root,为什么要执着于用root??

以上解决问题的方法仅限于有root权限,并且使用的是STF-minitouch框架的。实在是太艰难了,重新开始吧,在这个过程也学了不少东西了。这是吃了学艺不精的苦!!

fine

重新开始:

  • pyminitouch仅限于Android版本小于11的手机,现在使用的真机基本版本都是已经超过11了,现在只能弄一个安卓的虚拟机进行使用。

  • 使用Android Studio创建虚拟机

  1. 打开AVD Mangerment

 Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第7张图片

  1. Create Virtual Device

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第8张图片

 

  1. 选择一个合适的机型之后next

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第9张图片 

  1. 配置

注意!!汲取前面的经验,选择Google APIS的版本,以及Android11.0一下的版本。

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第10张图片 Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第11张图片

  1. 配置完成,打开虚拟机

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第12张图片  Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第13张图片

按照以前的步骤再来一遍:

  • 获取设备名称

adb devices
  • 获取管理员权限

adb shell

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第14张图片

从$到#,终于实现了。

  • 确定设备平台

adb shell getprop ro.product.cpu.abi

  • 将minitouch push到设备上(minitouch的获取在上一篇文章中)

adb push C:/Users/auus/minitouch /data/local/tmp

  • 使用adb shell查看

adb shell
/data/local/tmp
ls

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第15张图片

  • 使用chmod提升权限

C:\Users\auus\AndroidStudioProjects\MyApplication>adb shell
generic_x86_arm:/ $ su
generic_x86_arm:/ # /data/local/tmp/minitouch
/system/bin/sh: /data/local/tmp/minitouch: can't execute: Is a directory
126|generic_x86_arm:/ # cd /data/local/tmp
generic_x86_arm:/data/local/tmp # chmod 777 minitouch
1|generic_x86_arm:/data/local/tmp # ls -l
total 4
drwxrwxrwx 6 shell shell 4096 2022-03-10 08:47 minitouch

关于chmod:作用在于修改文件、目录的权限。

语法:chmod [对谁操作] [操作符] [赋予的权限] 文件名

操作对象:

u -- user 表现文件或目录的所有者。

g --group 表现文件或目录所属的用户组

o --other 其他用户

a --all 所有用户

操作符:

+添加权限

-减少权限

=直接给定一个权限

权限

r 、w 、x

100、010、001

chmod a=rwx 1.txt = chmod 777 1.txt

  • 本地端口转发

adb forward tcp:1111 localabstract:minitouch
  • 启动minitouch

adb shell /data/local/tmp/minitouch

出现的问题:

/system/bin/sh: /data/local/tmp/minitouch: can't execute: Is a directory

出现这个问题后我就没有去刻意解决了,我看到网上也有很多人没办法解决这个问题,应该是手机root权限的问题,那就关于STF-minitouch的研究就到这一步吧。

  • 最后关于minitouch使用方法:

Usage: /data/local/tmp/minitouch [-h] [-d ] [-n ] [-v] [-i] [-f ]
  -d : Use the given touch device. Otherwise autodetect.
  -n :   Change the name of of the abtract unix domain socket. (minitouch)
  -v:          Verbose output.
  -i:          Uses STDIN and doesn't start socket.
  -f :   Runs a file with a list of commands, doesn't start socket.
  -h:          Show help.

回到pyminitouch:

使用minitouch的体验感实在是太差了,有很多不该有的小问题,解决方法也很少,编辑的可读性也很差,所以就再次回到pyminitouch。

注意:pyminitouch只支持Android 11以下!!

pyminitouch = python + minitouch。简化了minitouch使用的流程,总结一下minitouch的使用流程吧:

  1. 检查设备CPU类型

  2. 下载指定版本的minitouch

  3. push到手机上,授权(这个最难搞),运行

  4. 创建socket,连接它

  5. 通过socket连接它,它返回信息给你还是这样的 d 0 10 10 50,可读性低

好吧,使用回pyminitouch吧。

使用虚拟器+pycharm:

from pyminitouch import safe_connection, safe_device, MNTDevice, CommandBuilder

#使用虚拟器adb devices获取
_DEVICE_ID = 'emulator-5554'

device = MNTDevice(_DEVICE_ID)

# print the maximum x and Y coordinates
print("max x:", device.connection.max_x)
print("max y:", device.connection.max_y)

 使用的虚拟器:

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第16张图片

 出现的问题:

Note: device /dev/input/mouse0 is not supported by libevdev
Note: device /dev/input/mice is not supported by libevdev
Type B touch device qwerty2 (32767x32767 with 11 contacts) detected on /dev/input/event1 (score 43762)
Note: hard-limiting maximum number of contacts to 10
binding socket: Address already in use
Unable to start server on minitouch

问题在于服务器被占用了!!在Android Studio中执行下面命令:

adb kill-server

Python+scrcpy+pyminitouch实现自动化(三)——实现触摸_第17张图片

 触发完成!!!单击屏幕成功!!

你可能感兴趣的:(自动化,android-studio,python,android)