安装环境

安装前准备

  • 下载 Android studio 软件,点击这里下载
  • 下载 STFService.apk,下载 github 项目
  • 下载 NDK ,进行环境变量配置
  • 下载 netcat ,进行环境变量配置(建议下载 1.11)

设备参数

  • 操作系统:Windows10
  • Android 版本:11
  • 手机型号:小米 10 青春版
  • MIUI 版本:MIUI 12.5.9
  • 手机分辨率:2400*1080
  • JVAV 版本:java 11.0.13 2021-10-19 LTS

安装 scrcpy

  • 具体可以阅读 scrcpy 文档 ,这里我直接下载zip包并解压进入cmd窗口

  • 使得手机进入调试状态

    • 小米手机进入我的设备——>全部参数——>连续点击 MIUI 版本直至出现您已处于开发者模式无,无需进行此操作
    • 进入设置——>更多设置——>开发者选项——>打开:
      • USB 调试
      • USB 安装
      • USB 调试(安全设置)
      • 指针位置
    • 关闭 MIUI 优化
  • 输入

    adb devices
    

    查看你的设备是否连接成功,如果未连接成功,大概有一下几点原因及解决方法:

    • 数据线有问题(能充电不代表就可以连接 usb 调试)
    • USB 接口不匹配
    • 安装更新驱动
  • 输入scrcpy就可以将手机投屏到电脑

https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220320170529.png

安装 pyminitouch

## 关于conda
conda create -n game python=3.8
conda activate game

## 安装第三库方
torch # 我使用conda安装的1.8.0
torchvision
pynput
pyminitouch

adb 安装 minitouch

  • 将 minitouch 的 github 项目 clone 到本地

  • 进入项目根目录,运行以下命令,你将得到一个libs文件,我这里将 libs 文件压缩,上传到我的阿里云,需要的点击这里 自取,解压到包含 adb.exe 文件同一个路径

    • git submodule init
    • git submodule update
    • ndk-build
  • 通过运行adb shell getprop ro.product.cpu.abi查找你的设备支持的 ABI,我的是 arm64-v8a

    https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321153837.png

  • 使用adb push libs/arm64-v8a/minitouch /data/local/tmp/将 minitouch 推送到手机

  • 最后使用adb shell /data/local/tmp/minitouch进行验证,显示下图则表示正常

    https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321153948.png

Android studio (简称 AS) 安装 apk

  • 用 AS 打开 github 下载文件,让其自动下载,速度很慢,解决方法可以参考这里

  • 打开命令行,windows 运行gradlew assembleDebug,下载很慢,需要耐心的等待(我下载开了加速)

  • AS 运行gradlew installDebug显示安装成功,进入手机设置查看应用管理

启动相关服务

启动 server

  • 参考这个 issue 运行adb shell am start -n jp.co.cyberagent.stf/.IdentityActivity以及 adb shell am startservice -n jp.co.cyberagent.stf/.Service先启动 apk

  • 接着运行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:stfservicenc localhost 1100,可能会出现乱码,但是不影响后续进行

    https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321111431.png

启动 agent

  • adb forward tcp:1090 localabstract:stfagent
  • adb shell pm path jp.co.cyberagent.stf命令输出替换到下一行命名黄色字体
  • adb shell export CLASSPATH="package:/data/app/~~zB9xl9M-zGIyGRMCCW55fQ==/jp.co.cyberagent.stf-bRDi125T34moZQVkvAHr3A==/base.apk";exec app_process /system/bin jp.co.cyberagent.stf.Agent

https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321112103.png

启动 minitouch

  • 我在输入adb shell /data/local/tmp/minitouch时候,权限无法获取,输入adb shell chmod 755 /data/local/tmp/minitouch解决

  • 接着运行adb shell /data/local/tmp/minitouch出现 using Android InputManager

启动 minitouch-2

  • adb forward tcp:1090 localabstract:minitouch

  • nc localhost 1090

  • 输入 socket 相关指令就可以,下图为输入指令以及对应界面相应

    https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220320230455.png

📖 参考文献

  1. GitHub - DeviceFarmer/minitouch: Minimal multitouch event producer for Android.
  2. GitHub - williamfzc/pyminitouch: python wrapper of minitouch, for better experience
  3. MIUI 12 折腾 minitouch,windows10 环境_CrazyU 的博客-CSDN 博客_minitouch
  4. GitHub - openstf/STFService.apk: Monitor and perform various actions on your Android device. Not meant for actual user devices.
  5. Android 开发文档

编写 python 用 socket 传递信息

💡 现在存在的问题是,我如何自动化地将 socket 信息传递到 tcp:1090。当我直接调用 pyminitouch 时,一直报错,在这里我手动先编写了传递 socket 字节的 python 代码:

import socket
import time
import sys
from pyminitouch.utils import str2byte

content = "d 0 500 500 50\\nc\\nd 1 500 600 50\\nw 5000\\nc\\nu 0\\nu 1\\nc\\n"
HOST = '127.0.0.1'
PORT = 1090

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.sendall(str2byte(content))
time.sleep(0.5)
sock.shutdown(socket.SHUT_WR)

res = ''

while True:
    data = sock.recv(1024)
    if (not data):
        break
    res += data.decode()

print(res)
print('closed')
sock.close()
  • 在运行这个程序之前我们需要查看 minitouch cmd 是否为下图所示,如果是需要ctrl+c停止程序运行,继续输入adb shell /data/local/tmp/minitouch直到尾行出现using Android InputManager

  • 在此进入 minitouch2 cmd,输入adb forward tcp:1090 localabstract:minitouch不要输入nc localhost 1090

  • 程序运行结果如下图

    https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321114229.png https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321114354.png

总结一下(需启动 6 个 cmd 窗口)

https://cdn.jsdelivr.net/gh/ShaohanTian/MyBlog/img/20220321113328.png

  • server cmd
    • 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
    • nc localhost 1100
  • agent cmd
    • adb forward tcp:1090 localabstract:stfagent
    • adb shell pm path jp.co.cyberagent.stf命令输出替换到下一行标记字体
    • adb shell export CLASSPATH="package:/data/app/~~zB9xl9M-zGIyGRMCCW55fQ==/jp.co.cyberagent.stf-bRDi125T34moZQVkvAHr3A==/base.apk";exec app_process /system/bin jp.co.cyberagent.stf.Agent
  • minitouch cmd
    • 输入adb shell /data/local/tmp/minitouch时候,权限若无法获取,输入adb shell chmod 755 /data/local/tmp/minitouch解决
    • 接着运行adb shell /data/local/tmp/minitouch出现 using Android InputManager
  • minitouch-2 cmd
    • adb forward tcp:1090 localabstract:minitouch
    • nc localhost 1090(cmd 框直接输入指令的时候需要执行,使用 python 代码传递不需要输入)
    • cmd 窗口直接输入 socket 相关指令
  • scrcpy cmd
    • 输入scrcpy即可
  • jupyter cmd
    • 输入jupyter lab即可