1. 介绍
对于Android软件的测试,可以使用adb
来实现;
2. 测试工具栈
2.1 ADB安装
3. 常见工具库
uiautomator2
:⭐️5.4k,针对模拟器使用
也就是说只有确认通过adb devices
确认连接上设备之后,才能发挥作用;
adbutils
:⭐️577,跟uiautomator2一样也是openatx开发的函数库。
adb_shell
:⭐️461
4. 常用命令
4.1 重启adb服务
adb kill-server; if ($?) { adb start-server }
4.2 Adb shell 命令:启动设备的一个 shell 会话执行命令
4.2.1 Q:Adb shell 命令执行的都是跟Linux相关的命令,是吗?
ChatGPT4:
- 您的理解基本正确。当您使用
adb shell
命令时,实际上是在Android设备的shell环境中执行命令,而Android的底层操作系统是基于Linux内核的。因此,大多数在adb shell
中执行的命令都是Linux命令。- 虽然
adb shell
提供了对许多标准Linux命令的访问,但是需要注意的是,并非所有Linux命令都在Android中可用,因为Android的Linux内核是定制化的,某些命令可能因为安全、性能或其他原因而被移除或修改。此外,Android设备通常还提供了一些特定于Android的命令和工具,用于管理设备特有的功能和应用。
4.2 确认Android版本
adb shell getprop ro.build.version.release
4.3 确认 Android SDK level
adb shell getprop ro.build.version.sdk
ChatGPT:
命令adb shell getprop ro.build.version.release
和adb shell getprop ro.build.version.sdk
用于获取 Android 设备(包括模拟器)的不同系统属性。它们的主要区别在于提供的信息类型:
adb shell getprop ro.build.version.release
:
- 这个命令返回的是 Android 设备的发布版本号,也就是用户界面上通常看到的 Android 版本,例如 “11”, “10”, “9” 等。
- 这个版本号表示的是 Android 操作系统的公开发布版本。
adb shell getprop ro.build.version.sdk
:
- 这个命令返回的是 Android 设备的SDK 版本号,也称为 API 级别,例如 “30”, “29”, “28” 等。
- 这个数字代表了 Android 应用编程接口(API)的版本,开发者使用这个版本号来确定应用可以使用的 API 功能和行为。不同的 SDK 版本可能会支持不同的 API 功能集。
总的来说,
ro.build.version.release
提供了更通用的、面向用户的 Android 版本信息,而ro.build.version.sdk
提供了更专业的、面向开发者的 API 级别信息。开发者通常关心 API 级别,因为这影响着应用程序的兼容性和可用的 API 功能。
4.4 获得屏幕尺寸
adb shell wm size
adb -s emulator-5554 shell kill -9 PID
4.2 进程管理
4.2.1 根据PID结束进程
adb -s emulator-5554 shell kill -9 PID
Note:
-s
:表示"serial",用于指定目标设备序列号。-9
:信号编号SIGKILL
,表示一个强制终止进程的信号。与SIGTERM
(默认的kill
信号,编号为15
)不同,SIGKILL
信号不可被捕获或忽略,它将强制进程立即退出。
4.2.2 结束minitouch 进程
adb shell killall -9 /data/local/tmp/minitouch
Note:
killall
:这是一个Linux/Unix系统中的命令,用于杀死指定名字的进程;而kill -9
命令则需要给出进程对应的PID;
adb -s emulator-5554 shell ps | findstr minitouch | `
ForEach-Object { adb -s emulator-5554 shell kill -9 ($_.Trim() -split '\s+')[1] }
4.2.3 显示所有进程
adb -s emulator-5554 shell ps
显示包含“minitouch”的进程信息(Windows)
adb -s emulator-5554 shell ps | findstr minitouch
5. Pyminitouch
5.1 关于只能存在一个连接的测试 [TODO]
5.2 已知问题
(1)测试脚本执行完毕后,/data/local/tmp/minitouch进程没有正常释放
(2)不支持对同一设备ID创建多个MNTDevice实例
Minitouch不支持多连接指令发送
Minitouch在文档中提到:
于是,Minitouch不支持多连接指令发送
ChatGPT4:
由于minitouch仅支持一次一个连接,这意味着在使用其Python封装pyminitouch
时,也应遵循相同的限制。具体来说,这意味着在同一时间内,应避免创建多个MNTDevice
类的实例来同时控制设备。以防止可能出现的事件流混乱、驱动程序混淆,甚至是设备冻结的风险。在这种情况下,最佳做法是一次仅使用一个MNTDevice
实例进行操作。
反思:具体的情况还是需要测试,因为这往往意味着需要使用单例模式
(3)封装型动作是同步的
Pyminitouch在封装型动作中加入了"time.sleep(self._delay / 1000 + config.DEFAULT_DELAY)" (CommandBuilder.publish),导致封装型动作都是阻塞式的;
(4)所以基于CommandBuilder.publish的动作都是阻塞式的
如果想使用异步操作,只能使用基于"with safe_connection(_DEVICE_ID) as conn"的写法;
5.3 重构的必要性
由于pyminitouch
的触控函数不是异步的,并且由于使用了“with-statement”,于是无法直接封装成单例模式,所以还是需要进行重构;
6. Minitouch
参考资料
6.1 已知问题
(1)在终端中使用Ctrl+C终止后,/data/local/tmp/minitouch进程没有正常释放
我们已经在【DeviceFarmer/minitouch】主页上提出了issue,不过目前没有收到回复;
(2)minitouch-server进程不会自动关闭
我们注意到即使使用mnt_process.kill()
关闭命令行会话后,minitouch的服务器进程也不会自动关闭,于是会出现如下的警告信息,
6.2 环境配置:安装NDK
Bard: Android官方推荐安装NDK的方式是“使用 Android Studio 安装”。Android Studio 会自动安装NDK,并将NDK与 Android Studio 集成在一起。这使得开发原生代码更加方便快捷。
6.2.1 安装 Android Studio
Bard: Android Studio was developed by Google, though it is built on top of JetBrains’ IntelliJ IDEA platform. Google released the first version in 2013 and continues to maintain and improve it as the official Integrated Development Environment (IDE) for Android app development.
6.1.2 配置NDK&ADB环境变量
通过 Android Studio 安装的NDK通常位于:
C:\Users\您的用户名\AppData\Local\Android\Sdk\ndk\版本号
ADB所在目录格式:
C:\Users\username\AppData\Local\Android\Sdk\platform-tools
6.3 Running minitouch on Windows-PS
Note: 自带run.sh脚本无法在 Windows-PS终端中运行。
所以我们采用“run manually”的方式运行minitouch;
Note: Minitouch的文档给出的是Linux系统上的命令,所以相关的命令需要针对 Windows-PS终端进行修改。
6.3.1 获取ABI
$ABI = adb shell getprop ro.product.cpu.abi
打印输出源文件路径
echo libs/$ABI/minitouch
6.3.2 增加minitouch文件的执行权限
adb shell chmod +x /data/local/tmp/minitouch
Note:
chmod +x
: This is a Linux command that changes the mode of a file. Specifically,+x
adds execute permissions to the file.
6.3.3 测试minitouch安装
adb shell /data/local/tmp/minitouch -h
执行命令后,输出信息如下:
WARNING: linker: /data/local/tmp/minitouch: unsupported flags DT_FLAGS_1=0x8000001
Usage: /data/local/tmp/minitouch [-h] [-d <device>] [-n <name>] [-v] [-i] [-f <file>]
-d <device>: Use the given touch device. Otherwise autodetect.
-n <name>: Change the name of of the abtract unix domain socket. (minitouch)
-v: Verbose output.
-i: Uses STDIN and doesn't start socket.
-f <file>: Runs a file with a list of commands, doesn't start socket.
-h: Show help.
可以看到会存在一个WARNING,于是我们咨询了Perplexity,
Perplexity:
The warning messageunsupported flags DT_FLAGS_1=0x8000001
is related to the dynamic linker/loader in Android. This message typically appears when you’re trying to run a binary that was compiled with a version of the Android NDK (Native Development Kit) that is newer than the Android version on the device where you’re trying to run the binary.
不过,经过探索后发现Perplexity的回复是不准确的,具体来说:WARNING: linker: /data/local/tmp/minitouch: unsupported flags DT_FLAGS_1=0x8000001,不是由NDK版本不匹配引起的;
探索过程如下:为了验证这个WARNING这个警告是否是由于NDK版本与设备不兼容导致的,
I. 需要获取当前Android设备的 API level
adb shell getprop ro.build.version.sdk
可知 API level = 25;
II. 查看使用的NDK版本
操作路径:Android Studio ⇒ ⚙️Settings ⇒ SDK Manager… ⇒ Languages & Frameworks - Android SDK ⇒ SDK Tools ⇒ 选中下方 Show Package Details
A. 在 Android Studio 中点击⚙️设置按钮
6.3.4 启动minitouch服务器
控制台命令
adb shell /data/local/tmp/minitouch
示例输出信息
输出信息如下(在PyCharm中显示红色文字):
WARNING: linker: /data/local/tmp/minitouch: unsupported flags DT_FLAGS_1=0x8000001
Type A touch device androVM Virtual Input (1600x900 with 2 contacts) detected on /dev/input/event4 (score 11200)
启动等待
time.sleep(2) # 等待minitouch启动
如果不进行wait,可能后续使用时minitouch还未启动完成,导致失败;
这里我们使用多线工作来实现“延时代码隐藏”;
6.3.5 端口转发
检测占用
netstat -ano | findstr 1111
Netstat的全称是"network statistics",中文翻译为"网络统计",用来显示网络相关信息。
开启转发
adb forward tcp:1111 localabstract:minitouch
南溪:可以理解成"adb forward tcp:1111 to localabstract:minitouch".
停止转发
adb forward --remove tcp:1111
在释放端口后,可以再次使用"netstat -ano | findstr port_num"的命令来检测端口是否成功释放;
6.3.6 建立连接
ncat localhost 1111
Troubleshooting
(1)minitouch
程序可以运行,但是触摸操作没有反应
原因:使用的port已经被占用
在进行触控命令测试时,需要选择合适的端口;
否则会出现触摸命令无效的情况。
具体的代码实现请参考【pyminitouch/connection.py】;
6.4 API使用说明
6.4.1 输入指令格式
正确示例如下:
content = "d 0 795 698 100\nc\nu 0\nc\n"
常见错误举例
content = """
d 0 795 698 100\n
c\n
u 0\n
c\n
"""
6.5 创建PR
git clone https://github.com/songyuc/minitouch.git