Android 中 如何利用am input 命令做自动压力测试

本文介绍了如何在Android设备上利用'am'和'input'命令进行自动压力测试,以模拟用户操作如点击、滑动和拍照,特别是在Camera应用中测试不同分辨率下连续拍摄的稳定性。通过adb shell命令启动应用、模拟触摸事件以及滑动操作,并提供简化代码的函数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      在工作中,经常会有压力测试的需求,比如要测试Camera 在不同分辨率下联系拍100张照片,检查程序是否异常。Android 本身有很多种方法做压力测试,这里介绍最简单的测试方法,用am 和 input 命令实现。

 

就拿测试Camera 在不同分辨率下联系拍100张照片这一个例子来说,步骤如下:

 

1.启动camera 应用程序

 

adb shell am start -n com.android.camera/.Camera

 

2.模拟点击屏幕中间,把隐藏的菜单显示出来,为下一步选择不同分辨率做准备

 

input motionevent 25 25 down

input motionevent 25 25 up

 

也可以用下面的函数来简化代码:

 

function click()
{
adb shell input motionevent $1 $2 down
adb shell input motionevent $1 $2 up
}

click 25 25

 

3.模拟点击屏幕,弹出不同分辨率的选择。

click 100 150


4.选择分辨率

click 100 150

 

5.拍照

    adb shell input keyevent 27 #camera key pressed

 

至此,程序已经实现了模拟屏幕点击,按键的操作,下面在看看看如何实现模拟滑动的步骤。

 

1.首先检查手机的input 是否支持滑

### 关于ADB批处理命令的使用方法 ADB(Android Debug Bridge)是一种通用工具,用于在PC端与安卓设备之间建立通信。其核心机制涉及`adb server`、`adb client`以及设备上的`adbd`守护进程之间的交互[^1]。 #### 批处理命令的基础概念 ADB支持通过单次调用执行多个命令的方式完成批量操作。这种功能可以通过脚本语言或者直接利用ADB内置的功能来实现。以下是几种常见的实现方式: #### 方法一:通过Shell Script组合命令 可以将多个ADB命令写入到一个Shell脚本文件中,并逐行执行这些命令。例如,在Linux或MacOS环境下创建一个名为`batch_adb.sh`的脚本文件: ```bash #!/bin/bash adb devices adb shell input keyevent 26 # 锁屏/解锁屏幕 adb shell am start -a android.intent.action.VIEW -d http://www.example.com/ ``` 运行此脚本即可依次执行其中定义的所有ADB命令。注意每条命令都需要单独成行,并确保脚本具有可执行权限。 #### 方法二:管道符串联命令 另一种简单的方法是在同一行内使用分号`;`隔开各个独立的ADB指令,从而形成一条复合型命令字符串。比如下面的例子展示了如何连续发送几个按键事件给目标设备: ```bash adb shell input keyevent 4; adb shell input text "HelloWorld"; adb shell input keyevent 66; ``` 这里分别模拟了返回键(`KEYCODE_BACK`)、输入文字"HelloWorld"以及回车确认(`KEYCODE_ENTER`)的操作序列[^4]。 #### 方法三:Python封装自动化流程 对于更复杂的场景,则推荐采用编程语言如Python来进行高级别的控制逻辑编写。以下是一个基于先前提到函数模板扩展出来的版本,它能够接受参数化配置并动态调整行为模式: ```python from typing import List import subprocess import time class ADBWrapper: def execute(self, cmd: str) -> str: result = subprocess.run(['adb'] + cmd.split(), stdout=subprocess.PIPE) return result.stdout.decode('utf-8').strip() def perform_multiple_actions(devices: list, actions_per_device: dict): wrapper = ADBWrapper() for device_serial in devices: print(f"Processing Device:{device_serial}") current_package_name = None try: for action_desc, params in actions_per_device.items(): package_name, activity_path, repeat_times = params if not(current_package_name == package_name): # Only clear cache when switching packages. wrapper.execute(f"-s {device_serial} shell pm clear {package_name}") measurements = measure_start_time(wrapper, package_name, activity_path, repeat_times, serial=device_serial) save_to_file(device_serial, package_name, activity_path, measurements) current_package_name = package_name except Exception as e: log_error(e, device_serial) def measure_start_time(adb_instance, package: str, activity: str, runs: int=5, serial=None) -> List[int]: results = [] base_command = f'-s {serial}' if serial else '' for _ in range(runs): stop_app_result = adb_instance.execute(f"{base_command} shell am force-stop {package}") clean_cache_results = [ adb_instance.execute(f"{base_command} shell sync"), adb_instance.execute(f"{base_command} shell echo 3 > /proc/sys/vm/drop_caches") ] launch_output = adb_instance.execute( f'{base_command} shell am start-activity -W -n {package}/{activity} | grep TotalTime' ) total_time_value = int(launch_output.split()[-1]) results.append(total_time_value) time.sleep(2) # Ensure app fully starts before next iteration return results if __name__ == "__main__": target_devices = ['emulator-5554', '0123456789ABCDEF'] defined_operations = { 'com.android.chrome': ('com.android.chrome/com.google.android.apps.chrome.Main', 3), 'org.wikipedia': ('org.wikipedia/org.wikipedia.main.MainActivity', 2) } perform_multiple_actions(target_devices, defined_operations) ``` 该程序片段不仅实现了基本的应用启动性能测量功能,还加入了跨不同设备的支持能力,同时提供了错误日志记录和数据持久化的基础框架结构[^2]。 #### 方法四:Instrumentation测试套件集成 如果涉及到更加深入级别的应用程序内部状态监控或者是压力测试需求的话,那么借助Android官方提供的instrumentation API将是不错的选择之一。如下所示即为针对音乐播放器应用所设计的一个典型例子[^3][^5]: ```bash erin@midnight:~/$ adb shell am instrument -w -r \ -e class com.android.music.tests.MusicPlayerLaunchPerformance \ com.android.music.tests/android.test.InstrumentationTestRunner ``` 这条命令会触发指定类名下的所有单元测试案例被执行,并最终输出详细的报告信息至标准输出流当中去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值