在上次使用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 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
gradlew assembleDebug
会出现这个报错:
解决方法:
在你的project中找到build.gradle,打开后在首行添加:
task assemble
{
}
如图:
之后在运行一次gradlew assembleDebug即可成功:
gradlew installDebug
在手机上确定下载:
此刻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
好了,最后还是回到问题的根本:其实使用pyminitouch不需要root,为什么要执着于用root??
以上解决问题的方法仅限于有root权限,并且使用的是STF-minitouch框架的。实在是太艰难了,重新开始吧,在这个过程也学了不少东西了。这是吃了学艺不精的苦!!
fine
重新开始:
pyminitouch仅限于Android版本小于11的手机,现在使用的真机基本版本都是已经超过11了,现在只能弄一个安卓的虚拟机进行使用。
使用Android Studio创建虚拟机
打开AVD Mangerment
选择一个合适的机型之后next
配置
注意!!汲取前面的经验,选择Google APIS的版本,以及Android11.0一下的版本。
配置完成,打开虚拟机
按照以前的步骤再来一遍:
获取设备名称
adb devices
获取管理员权限
adb shell
从$到#,终于实现了。
确定设备平台
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
使用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的使用流程吧:
检查设备CPU类型
下载指定版本的minitouch
push到手机上,授权(这个最难搞),运行
创建socket,连接它
通过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)
使用的虚拟器:
出现的问题:
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
触发完成!!!单击屏幕成功!!