用adb命令组装PowerShell实用小工具——Android测试小助手

简介: [本文出自天外归云的博客园] 简介 APP性能测试一般对以下几个方面进行测试: 1.启动时间(可以通过本工具测试); 2.CPU的占用(可以通过本工具测试); 3.内存的占用(可以通过本工具测试); 4.流量的耗用(可以通过本工具测试); 5.电量的耗用(用户实际使用中感知即可)。

[本文出自天外归云的博客园]

简介

APP性能测试一般对以下几个方面进行测试:
1.启动时间(可以通过本工具测试);
2.CPU的占用(可以通过本工具测试);
3.内存的占用(可以通过本工具测试);
4.流量的耗用(可以通过本工具测试);
5.电量的耗用(用户实际使用中感知即可)。
 
除了可以做以上这几个专项测试外,本工具还能进行monkey测试等等。
可以结合工作需要灵活自定义脚本,封装成自己工作中常用的工具。
工具的实现是基于adb和PowerShell的,支持adb通过USB和WIFI两种方式连接手机进行操作。

前置工作

1. 需要安装adb

2. 需要本机设置PowerShell脚本运行策略

脚本示例

PowerShell例子如下(不断更新):

#获取当前app包名和活动名
Function GetPkgAndActName () {
    #确保app处于激活状态
    $a = adb shell dumpsys window windows|findstr Focu
    $b = $a -like "*mCurrentFocus*"
    $b = $b.Trim()
    $startIndex = $b.IndexOf("{")
    $endIndex = $b.IndexOf("}")
    $pkgAndActName = (($b.Substring($startIndex+1,$endIndex-$startIndex-1)).split(" "))[2]
    return $pkgAndActName
}


#获取当前流量统计信息
Function GetCurrFlow () {
    #确保app处于激活状态
    $pkgAndActName = GetPkgAndActName
    $pkgName = ($pkgAndActName.split("/"))[0]
    $activityName = ($pkgAndActName.split("/"))[1]
    $userId = (((((adb shell dumpsys package $pkgName | findstr userId).Trim()).split("="))[1]).split(" "))[0]
    $rets = adb shell cat /proc/net/xt_qtaguid/stats | findstr $userId
    foreach ($ret in $rets)
    {
        $spices = ($ret.Split(" "))
        $flow += [int]$spices[5]+[int]$spices[7]
    }
    $flow/1000
}


#转换文件大小单位
function Convert-Size {            
    [cmdletbinding()]            
    param(            
        [validateset("Bytes","KB","MB","GB","TB")]            
        [string]$From,            
        [validateset("Bytes","KB","MB","GB","TB")]            
        [string]$To,            
        [Parameter(Mandatory=$true)]          
        [double]$Value,            
        [int]$Precision = 4            
    )            
    switch($From) {            
        "Bytes" {$value = $Value }            
        "KB" {$value = $Value * 1024 }            
        "MB" {$value = $Value * 1024 * 1024}            
        "GB" {$value = $Value * 1024 * 1024 * 1024}            
        "TB" {$value = $Value * 1024 * 1024 * 1024 * 1024}            
    }              
    switch ($To) {            
        "Bytes" {return $value}            
        "KB" {$Value = $Value/1KB}            
        "MB" {$Value = $Value/1MB}            
        "GB" {$Value = $Value/1GB}            
        "TB" {$Value = $Value/1TB}            
            
    }                 
    return [Math]::Round($value,$Precision,[MidPointRounding]::AwayFromZero)        
}


#获取当前安卓app的启动耗时
function CalcStartUpTime () {
    #确保app处于激活状态
    $packageInfo = adb shell dumpsys activity | findstr mFocusedActivity
    $regex = [regex]"\s??(\S*)/(\S*)??\s"
    $s = $regex.Matches($packageInfo).Value
    $info = $s.SubString(1,$s.Length-1)
    $packageName = $info.split("/")[0]
    $activityName = $info.split("/")[1]
    adb shell am force-stop $packageName
    $result = adb shell am start -W $info | findstr WaitTime
    $result.replace("WaitTime","当前app启动耗时")
}


#获取当前安卓app的CPU占用情况(持续20次)
function GetAppCPU () {
    #确保app处于激活状态
    $pkgAndActName = GetPkgAndActName
    $pkgName = ($pkgAndActName.split("/"))[0]
    $count = 0
    while ($count -lt 20) {
        adb shell top -n 1 | findstr $pkgName
        Start-Sleep -Seconds 1
        $count++
    }
}


#获取当前安卓app的内存占用情况(持续20次)
function GetAppMem () {
    #确保app处于激活状态
    $pkgAndActName = GetPkgAndActName
    $pkgName = ($pkgAndActName.split("/"))[0]
    $count = 0
    while ($count -lt 20) {
        $appUsageRAMInfo = adb shell dumpsys meminfo $pkgName | findstr "TOTAL:"
        $infoRegex = [regex]"TOTAL:\s*(\d)*"
        $numRegex = [regex]"(\d)+"
        $appUsageRAM = $numRegex.Matches($infoRegex.Matches($appUsageRAMInfo).Value).Value
        $totalRAMInfo = (adb shell dumpsys meminfo | findstr "RAM" | findstr "Total").replace(",","")
        $totalRAM = $numRegex.Matches($totalRAMInfo).Value
        "当前app占用内存:"+$appUsageRAM+",占用率为:"+([int]$appUsageRAM/[int]$totalRAM)*100+"%"
        Start-Sleep -Seconds 1
        $count++
    }
}


#开启ADB-WIFI模式
function AdbWifiConnect () {
    #确保手机连上usb(成功开启ADB-WIFI模式后方可以拔线)
    $ipText = adb shell ifconfig | findstr "Bcast"
    $ipInfoReg = [regex]"inet addr:\s*(\d)+`.(\d)+`.(\d)+`.(\d)+"
    $ipInfo = $ipInfoReg.Matches($ipText).Value
    $ipReg = [regex]"(\d)+`.(\d)+`.(\d)+`.(\d)+"
    $ip = $ipReg.Matches($ipInfo).Value
    adb disconnect $ip
    adb tcpip 5555
    adb connect $ip
}


#重连ADB-WIFI到指定ip
function ReconnectAdbWifi () {
    $ip= Read-Host "请输入手机ip"
    adb connect $ip
}


#主程序入口
while($true){
    Write-Host "输入数字进行选择" -ForegroundColor Green
    Write-Host "1 唤醒屏幕" -ForegroundColor Yellow
    Write-Host "2 输入文字" -ForegroundColor Yellow
    Write-Host "3 触发事件" -ForegroundColor Yellow
    Write-Host "4 向上滑动" -ForegroundColor Yellow
    Write-Host "5 向下滑动" -ForegroundColor Yellow
    Write-Host "6 向左滑动" -ForegroundColor Yellow
    Write-Host "7 向右滑动" -ForegroundColor Yellow
    Write-Host "8 删除输入" -ForegroundColor Yellow
    Write-Host "9 屏幕截图" -ForegroundColor Yellow
    Write-Host "10 获取手机分辨率" -ForegroundColor Yellow
    Write-Host "11 获取手机系统版本" -ForegroundColor Yellow
    Write-Host "12 获取当前app包名和活动名" -ForegroundColor Yellow
    Write-Host "13 流量统计" -ForegroundColor Yellow
    Write-Host "14 进行简单monkey测试" -ForegroundColor Yellow
    Write-Host "15 计算当前app的启动时间" -ForegroundColor Yellow
    Write-Host "16 获取当前安卓app的CPU占用情况(持续20次)" -ForegroundColor Yellow
    Write-Host "17 获取当前安卓app的内存占用情况(持续20次)" -ForegroundColor Yellow    
    Write-Host "18 开启ADB-WIFI模式" -ForegroundColor Yellow
    Write-Host "19 重连ADB-WIFI" -ForegroundColor Yellow
    $choice = Read-Host "请选择"
    switch($choice)
    {
        1 { adb shell input keyevent 26 }
        2 { $text = Read-Host "输入文字";adb shell input text $text }
        3 { $event = Read-Host "输入事件代号";adb shell input keyevent $event }
        4 { adb shell input swipe 200 800 200 100 }
        5 { adb shell input swipe 200 100 200 800 }
        6 { adb shell input swipe 500 100 100 100 }
        7 { adb shell input swipe 100 100 500 100 }
        8 {
            [int]$amount = Read-Host "输入要删除的字符数量"
            for($i=0;$i -lt $amount;$i++)
            { 
                adb shell input keyevent 67
            }
        }
        9 {
            $result = adb devices
            $device_id = $result[1].Split()[0]
            adb -s $device_id shell /system/bin/screencap -p /sdcard/screenshot.png
            adb -s $device_id pull /sdcard/screenshot.png d:/screenshot.png
            D:\screenshot.png
        }
        10 { adb shell wm size }
        11 { adb shell getprop ro.build.version.release }
        12 {
            $pkgAndActName = GetPkgAndActName
            $pkgName = ($pkgAndActName.split("/"))[0]
            $activityName = ($pkgAndActName.split("/"))[1]
            "包名:"+$pkgName
            "活动名:"+$activityName
        }
        13 {
            Read-Host "按任意键开始统计"
            $startFlow = GetCurrFlow
            Write-Host "流量监控中……`n" -ForegroundColor DarkMagenta
            Read-Host "按任意键结束统计"
            $endFlow = GetCurrFlow
            $consumedFlow = [int]$endFlow-[int]$startFlow
            $consumedFlowKb = Convert-Size -From KB -To KB -Value $consumedFlow
            $consumedFlowMb = Convert-Size -From KB -To MB -Value $consumedFlow
            "共消耗流量:"+$consumedFlowKb+"kb("+$consumedFlowMb+"mb)"
        }
        14 {
            $count = Read-Host "请指定随机事件数"
            $pkgAndActName = GetPkgAndActName
            $pkgName = ($pkgAndActName.split("/"))[0]
            adb shell monkey -p $pkgName -v $count
        }
        15 {
            CalcStartUpTime
        }
        16 {
            GetAppCPU
        }
        17 {
            GetAppMem
        }
        18 {
            AdbWifiConnect
        }
        19 {
            ReconnectAdbWifi
        }
    }
}

可以根据实际测试过程中反复手点的过程进行组装调配。比如在反复测试登录的情况下,就要反复输入密码,如果来回用手点就比较麻烦,用这个小工具的话就非常轻松了,按一下上再敲一下回车就搞定了。

以下是进行统计指定时间内android应用流量的消耗:

计算当前app的内存占用情况:

退出:ctrl+c

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
9月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
3452 1
|
9月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
777 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
9月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
897 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
9月前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
737 6
|
10月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
2041 10
|
10月前
|
存储 人工智能 前端开发
​​LangChain默认工具正在污染你的知识库!PDF解析崩溃真相​
本文深入探讨RAG项目中PDF解析的痛点与解决方案,分析LangChain默认工具的局限性,提出专业级文档处理架构设计与工具选型策略,涵盖表格图像处理、多模态解析与可扩展管道实现,助力提升RAG系统效果。
789 6
|
JSON 数据格式
【Azure Fabric Service】演示使用PowerShell命令部署SF应用程序(.NET)
本文详细介绍了在中国区微软云Azure上使用Service Fabrics服务时,通过PowerShell命令发布.NET应用的全过程。由于Visual Studio 2022无法直接发布应用,需借助PowerShell脚本完成部署。文章分三步讲解:首先在Visual Studio 2022中打包应用部署包,其次连接SF集群并上传部署包,最后注册应用类型、创建实例并启动服务。过程中涉及关键参数如服务器证书指纹和服务端证书指纹的获取,并附带图文说明,便于操作。参考官方文档,帮助用户成功部署并运行服务。
435 73
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1598 23
|
11月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
10月前
|
监控 Java 数据挖掘
利用Jmeter工具进行HTTP接口的性能测试操作
基础上述步骤反复迭代调整直至满足预期目标达成满意水平结束本轮压力评估周期进入常态监控阶段持续关注系统运转状态及时发现处理新出现问题保障服务稳定高效运作
1311 0

热门文章

最新文章