【ADB & Minitouch】Android测试的学习笔记

1. 介绍

对于Android软件的测试,可以使用adb来实现;

2. 测试工具栈

2.1 ADB安装

请参考博文《Android测试——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.releaseadb shell getprop ro.build.version.sdk 用于获取 Android 设备(包括模拟器)的不同系统属性。它们的主要区别在于提供的信息类型:

  1. adb shell getprop ro.build.version.release
    • 这个命令返回的是 Android 设备的发布版本号,也就是用户界面上通常看到的 Android 版本,例如 “11”, “10”, “9” 等。
    • 这个版本号表示的是 Android 操作系统的公开发布版本。
  2. 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:
Note that currently only one connection at a time is supported. This is mainly because it would otherwise be too easy to submit broken event streams, confusing the driver and possibly freezing the device until a reboot (which, by the way, you’d most likely have to do with adb reboot due to the unresponsive screen).

于是,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 message unsupported 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⚙️SettingsSDK Manager…Languages & Frameworks - Android SDKSDK 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 创建PR

git clone https://github.com/songyuc/minitouch.git
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值