因为想跟随大佬的脚步搞一下手机强化学习 王者荣耀
卡在了minitouch这一步,由于minitouch 不支持android10及以上,必须跟随instruction安装服务才可以
具体英文步骤可以参考
然后安装服务必须要安装android studio
然后下载 STFService.apk
git clone https://github.com/DeviceFarmer/STFService.apk.git
下载之后按照指示运行
./gradlew assembleDebug
但是这一步会报错,所以就用AS把文件夹打开,让其自动下载,看是否能够编译成功
不得不说AS这个速度是真的够慢的,各位开发Android的程序猿工资高不是没有道理,等这个实在太心焦了
下载完成之后 直接build 报错,
那就先不管他,用AS的terminal按照指示运行一下,结果提示
Gradle 7.2 requires Java 8 or later to run. You are currently using Java 7.
囧,再去安装一下最新的 java,当然了 安装完毕之后要把 JAVA_HOME的path改成最新的版本,然后验证一下版本是否已经更改,更改之后重启AS
这时运行还是会报错,因为build_tools没有被accept, 所以按照要求,选择tools-sdk manager,将相应的sdk tools 30.0.2及以上版本勾选安装即可
然后再次运行gradlew 编译成功,只不过会提示api有过期,不知道后面会不会再有坑
然后运行
gradlew installDebug
即可,注意手机要连接电脑,并且打开通过usb安装apk功能,这时会弹出提示是否安装,10s内点击确认即可,(强烈建议做好之后把这个选项去掉哦,防止后面手机丢了被人刷机)
提示将app-debug.apk安装成功,而且这个apk是no lauch icon的,怪不得我找不到apk安在哪里了
然后要启动两个service,如何启动呢?
按照指示运行
adb shell am startservice --user 0 \
-a jp.co.cyberagent.stf.ACTION_START \
-n jp.co.cyberagent.stf/.Service
提示startservice error
Exception occurred while executing 'startservice':
java.lang.IllegalArgumentException: No intent supplied
继续查呗,根据这个提示应该是我们的命令行不能多行,只用一行的话,可以成功
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: app is in background uid null
这么看起来应该是已经运行成功失败了,查了一下 Android26以后不允许用startservice 启动 ,我们试一下 ,在我怀疑没有安装成功的时候,通过设置-应用管理里面找到了STFService,说明安装是成功的了
然后还有一个古早的issue,不知道对其他人有没有用
https://github.com/openstf/stf/issues/407https://github.com/openstf/stf/issues/407
adb shell am start-foreground-service
提示Not Found . no service started ,关键我这个只有后台,没有前台啊?
简书上说应该先启动apk,再启动service,但是启动了apk,service依然找不到啊,在这里我决定,设置apk自启动的情况下,将手机重启一下,果然重启之后,提示成功!
Starting service: Intent { act=jp.co.cyberagent.stf.ACTION_START cmp=jp.co.cyberagent.stf/.Service }
然后继续下一步
这里需要检查一下
运行
adb forward tcp:1100 localabstract:stfservice
这样子的话 服务应该在 1100端口开启成功了,然后connect即可 ,这时候打开手机可以看到STFService is running 的提示
nc localhost 1100
但这时又报错了,nc这个命令找不到?太棒了,居然是linux下面的命令,先不管他跳过
早知道切换ubuntu来搞事了
后面成功安装之后 ,监听了乱码。。要换一个成熟的cmd才可以
所以呢,下一步要启动agent,有一丢丢的复杂(官网说的,现在用windows就更复杂一些了)
运行
adb shell pm path jp.co.cyberagent.stf | \
tr -d '\r' | awk -F: '{print $2}'
需要注意到,我们后面的命令是没有的,所以只运行第一句即可
我这里得到的位置是
package:/data/app/~~4ivWI8g_C36NgJZ09hAesg==/jp.co.cyberagent.stf-VGHYjSvLJGeV0xoDQy_uRQ==/base.apk
大胆猜测大家的位置都差不太多
然后呢下一步
adb shell export CLASSPATH="$APK"\; \
exec app_process /system/bin jp.co.cyberagent.stf.Agent
我们又有命令运行不了了
这时,回过头看一下,这个apk安装成功之后,service启动了,是否可以装minitouch然后把后面的步骤跳过呢?但是从instruction来看,
you need to take care of running the service and agent, before running minicap.
如果windows不行 只能切换到ubuntu下面搞了
先尝试运行后面的步骤
adb forward tcp:1090 localabstract:stfagent
提示1090 也不知道是不是算运行成功
然后要run一下minicap (并不知道为什么说是run minicap 下面确实将minitouch推送到device上)
adb shell getprop ro.product.cpu.abi
可以给出你自己对应的cpu型号 然后
adb push libs/$ABI/minitouch /data/local/tmp/
将对应的ABI下的minitouch推送到tmp文件夹中
然后继续运行
adb shell /data/local/tmp/minitouch
会报错! 因为我们的版本是android11, 怎么又绕回来了。。
但是现在运行不一样了
open: Permission denied
Unable to open device /dev/input/event7 for inspectionopen: Permission denied
Unable to open device /dev/input/event6 for inspectionopen: Permission denied
Unable to open device /dev/input/event5 for inspectionopen: Permission denied
Unable to open device /dev/input/event1 for inspectionopen: Permission denied
Unable to open device /dev/input/event2 for inspectionopen: Permission denied
Unable to open device /dev/input/event4 for inspectionopen: Permission denied
Unable to open device /dev/input/event0 for inspectionopen: Permission denied
Unable to open device /dev/input/event3 for inspectionUnable to find a suitable touch device
using Android InputManager
注意最后一句,using input manager ,如果agent没有启动,会提示connection failed
所以直接运行socket 版本的命令试一下
adb forward tcp:1111 localabstract:minitouch
所以,如何验证我到底是不是把minitouch安装成功了呢?
迫于无奈还是下一个nc 吧
netcat 1.11 for Win32/Win64https://eternallybored.org/misc/netcat/下载 解压 设置环境变量
启动好之后,顺序执行 minitouch的一系列操作
adb shell /data/local/tmp/minitouch
adb forward tcp:1111 localabstract:minitouch
nc localhost 1111
现在可以确认 minitouch已经安装成功了,那么就可以参考他人的minitouch教程
STF-minitouch的使用_saii的专栏-CSDN博客_minitouch我们经常会遇到这样子的情况,需要演示一些手机上的一些界面的时候。不能够把手机上的影像投影到电脑上,同时在电脑上操作手机。也可能是我了解的比较少吧。最近在论坛上看到了 [STF 框架之 minitouch 工具] (https://testerhome.com/topics/4400) 其实里面已经介绍的很详细了,只是使用C#的来实现的。对于c#确实不太熟悉,所以就拿了 minicap_java Dhttps://blog.csdn.net/qq744746842/article/details/50950301STF 框架之 minicap 工具 · TesterHomehttps://testerhome.com/topics/3115STF 框架之 minitouch 工具 · TesterHomehttps://testerhome.com/topics/4400但是他们都是针对老版本的,也就是说直接操作minitouch,现在minitouch通过inputmanager和手机进行交流,这个信息流我没搞懂啊? minitouch和Agent/Service之间的通信顺序是什么呢?
总之我现在在minitouch界面 发的都没有反应
using Android InputManager
v
d 0 10 10 50
m 0 10 10 100
m 0 10 10 100\n
m 0 10 10 100 \n
m 0 100 100 50\n
我怀疑是端口问题 那我们再尝试看看?
经过一番摸索 还是要运行
adb forward tcp:1111 localabstract:minitouch
nc localhost 1111
这时运行就会有一些和Minitouch主页接近的提示了 包括 version 以及pid
如果有输入的话,在Agent 的界面,有相应的反应,虽然手机还是没有操作
不过呢 在qq的看点页面 始终没办法给个反应 灵机一动 返回主页面进行尝试,成功了哦?
d 0 100 100 50\n
c
commit 之后才会有动作 我们来录个屏看一看
好!告一段落,然后研究一下键盘的映射和pyminitouch相关 再继续
现在不知道是不是需要把minicap一起用上,毕竟我希望先有自己的训练数据,这样子给AI打个样,会更好一些,如果minicap可以把键位映射给省去,就更好了
总结一下:
Service和Agent启动以后,minitouch也转发到Agent监听的窗口,然后通过启动的minitouch 发送按键,目前用的是4个cmd窗口
不知道能不能减少
[server]
adb shell am start-foreground-service --user 0 -a jp.co.cyberagent.stf.ACTION_START -n jp.co.cyberagent.stf/.Service
adb forward tcp:1100 localabstract:stfservice
nc64 localhost 1100
[agent]
adb forward tcp:1090 localabstract:stfagent
adb shell pm path jp.co.cyberagent.stf
adb shell export CLASSPATH="package:/data/app/~~xNM5OyPoTlGp65bZ9WdgJw==/jp.co.cyberagent.stf-W2c4h9a5TaG0tdkexyFq6A==/base.apk";exec app_process /system/bin jp.co.cyberagent.stf.Agent
[minitouch]
adb shell /data/local/tmp/minitouch
[minitouch-2]
adb forward tcp:1090 localabstract:minitouch
nc localhost 1090
最终在minitouch-2界面输入,
d 0 100 100 50\n
c
对应的手机就有反应