adb命令对安卓apk的测试

为君一笑 提交于 2020-01-10 08:09:57

adb命令对安卓apk测试
adb的全称为Android Debug Bridge,就是起到调试桥的作用,是客户端测试常用的辅助工具。借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多终端操作,如安装软件、卸载软件、系统升级、运行shell命令等。adb就是Android终端(如手机/机顶盒)与PC端的桥梁,可以让用户在电脑上对手机进行全面的操作、记录终端操作日志。同时还可以使用adb命令在真机上对安卓包进行压测、崩溃日志查看等。
1 环境安装及配置
1.1 安装sdk环境
直接复制压缩包并解压到电脑本地后,包含以下文件
在这里插入图片描述

1.2 path环境配置
选中计算机–>点击右键–>选择【属性】–>【高级系统设置】–>【环境变量】,新建/修改变量
添加以下系统变量信息
ANDROID_HOME:E:\AppAuto\Sdk(sdk的安装目录)
在这里插入图片描述
path:;%ANDROID_HOME%;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;
在这里插入图片描述
1.3 验证android环境
运行cmd 输入“android -h”,出现下图即环境搭建成功
在这里插入图片描述
1.4 验证adb运行环境
步骤1.1中的压缩包是包含adb的运行程序的,先在cmd中运行adb检查是否可用,出现下图即环境搭建成功
在这里插入图片描述
如果运行不成功,单独复制adb的运行程序到C:\Windows\System32目录下后,重新cmd运行检验。adb运行程序是将1.1中的以下五个文件copy一份到C盘指定目录新建一个目录存放即可。
在这里插入图片描述

2 adb常用命令
2.1 基础命令
1、启动adb服务
adb start-server

2、终止adb服务
adb kill-server

3、进入adb运行环境
adb shell

4、获取帮助 里面有adb的各种命令和参数的介绍
adb help

5、查看adb版本
adb version

6、以root权限重启adb
adb root

7、将system分区重新挂在为可读写分区,此命令在操作系统目录时很重要
adb remount

8、重启设备,可选参数进入bootloader(刷机模式)或recovery(恢复模式)
adb reboot [bootloader|recovery]
2.2 保存日志命令
adb logcat //显示全部日志
adb logcat > c:\test.log //将日志保存到文件test.log
从当前开始显示
logcat 有缓存,如果仅需要查看当前开始的 log,需要清空之前的。
adb logcat -c && adb logcat
adb logcat | grep MyApp
adb logcat | grep -i myapp #忽略大小写。
根据tag name过滤
adb logcat -s TAG_NAME
adb logcat -s TAG_NAME_1 TAG_NAME_2
#example
adb logcat -s TEST
adb logcat -s TEST MYAPP
优先级:
V — 细则 (最低优先级)
D — 调试
I — 信息
W — 警告
E — 错误
F — 致命
S — 静默 (最高优先级,不会打印任何信息)
使用grep过滤
这个很像在Linux上使用管道命令一样,需系统支持
adb logcat | grep “SEARCH_TERM”
adb logcat | grep “SEARCH_TERM_1|SEARCH_TERM_2”
#example
adb logcat | grep “Exception”
adb logcat | grep “Exception|Error”
清除日志块
使用来清除旧的日志
adb logcat -c
2.3 apk相关
1、安装apk
adb install test.apk -r 覆盖安装,保留数据和缓存文件 -d 解决低版本version问题 -s 安装apk到sd卡

2、卸载apk
adb uninstall -k <package_name>
可选参数-k的作用为卸载软件但是保留配置和缓存文件

3、查看app相关所有信息,包括action,codepath,version,需要的权限等等信息
adb shell dumpsys package <package_name>

4、查看app的路径
adb shell pm path <package_name>
查看了一个普通app的路径,如下,位于data/app下面的普通app
package:/data/app/com.tencent.test-1/base.apk

5、查看apk的版本信息
adb shell dumpsys package <package_name> | grepversion
如果你得到的是下图的两个version版本,则为系统app,下面是系统app本身的版本,上面是升级之后的系统app的版本信息
versionCode=8 targetSdk=22 versionName=V0.08 versionCode=6targetSdk=22 versionName=V0.0

6、启动activity
查看:
adb shell dumpsys window | findstr mCurrentFocus 命令查看当前运行的包名和Activity
adb shell am start -n <package_name>/.<activity_class_name>
C:\Users\lenovo>adb shell
venus:/ $ ^C
C:\Users\lenovo>adb shell dumpsys window | findstrmCurrentFocus
mCurrentFocus=Window{3bd0b18 u0com.android.settings/com.asu.msettings.AsuSettingsActiv
C:\Users\lenovo>adb shell am start -ncom.android.settings/com.asu.msettings.AsuSettingsA
Starting: Intent { cmp=com.android.settings/com.asu.msettings.AsuSettingsActivityAlias}

6.16.
清楚应用数据adb shell pm path
输出安装包的APK路径
adb shell pm clear
删除与包相关的所有数据:清除数据和缓存

7、获得应用的启动时间,可以很方便地获取应用的启动时间
adb shell am start -W<package_name>/.<activity_class_name>
试验结果如下:
adb shell am start -Wcom.cc.test/com.painter.test.PainterMainActivity Starting: Intent {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]cmp=com.cc.test/com.painter.test.PainterMainActivity } Status: ok Activity:com.cc.test/com.painter.test.PainterMainActivity ThisTime: 355 TotalTime: 355WaitTime: 365 Complete
返回的几个结果,以WaitTime为准,返回的是从startActivity到应用第一帧完全显示的时间。

8、启动service,am的-n参数表示组件,-a参数表示命令,-a后面的参数为manifest中定义的service的action
adb shell am startservice -n <package_name>/.<service_class_name>
也可:
adb shell am startservice -a “android.intent.action.CALL”

9、发送广播
adb shell am broadcast -a “android.intent.action.AdupsFota.WriteCommandReceiver”
广播可以带上不同类型的参数,–es为string参数类型,–ei为int参数类型,–ez为boolean参数类型
adb shell am broadcast -a “android.intent.action.AdupsFota.WriteCommandReceiver”–es test_string “this is test string”

10、查看某个app的进程相关信息
10.1
adb shell ps <package_name|PID>
例如
adb shell ps com.ma.app:push USER PID PPID VSIZE RSS WCHAN PC NAME u0_a116 5483 304 1776564 55112sys_epoll_ 00000000 S com.ma.app:push
小米手机上测试成功,在另外一个设备上,如果ps后面的参数是包名则显示不了进程的详细信息,参见下面的方式获取

10.2
adb shell ps | grep <package_name>

11、杀掉某个进程,一般用于模拟某个bug复现
adb shell kill pid Number

12、查看某一个app的内存占用
adb shell dumpsys meminfo <package_name|PID>
结果如下,其中的Heap size包括了Dalvik Heap和Native Heap,平时我们所说的内存限制指的是Dalvik Heap。
Pss PrivatePrivate Swapped Heap Heap Heap Total Dirty CleanDirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ Native Heap 1895618940 0 4696 44288 21352 22935 Dalvik Heap 60102 60088 0 26192 104486 88285 16201 App Summary Pss(KB) ------ Java Heap: 61640 Native Heap:18940 Code: 3356 Stack: 428 Graphics: 16876 Private Other: 3840 System: 2031 …

13、查看单个应用程序的最大内存限制
adb shell getprop | grep heapgrowthlimit
得到的结果为128M: [dalvik.vm.heapgrowthlimit]: [128m]
这就是说Dalvik Heap size的最大值超过了128M,就很可能发生OOM

14、获取单个应用的电量消耗信息
Battery Historian是Android 5.0开始引入的,下面的命令为获取单个app的电量消耗信息,获取系统耗电信息见下节
adb shell dumpsys batterystats ><package_name> > xxx.txt
上面的电量信息为原始数据,可以通过google编写的historian.py脚本把数据信息转换为可读性很好的html文件,类似TraceView生成的列表数据,之前在做app性能优化的时候起了很大的作用
python historian.py xxx.txt > xxx.html

15、跑monkey,个人很喜欢这个命令,运行过程中,应用程序会不断切换画面,按照选定的不同级别反馈信息,还可以看到执行过程报告和生成的事件。测试应用的稳定性时很实用。现在studio也有了monkeyrunner的tool
adb shell monkey -v -p <package_name> 500 -p 对象包 -v 反馈信息级别
:Monkey: seed=1493061025112 count=500 :AllowPackage:com.tencent.mm.app:push :IncludeCategory: android.intent.category.LAUNCHER:IncludeCategory: android.intent.category.MONKEY ** No activities found to run,monkey aborted.
2.4 文件操作相关
1、拷贝文件/目录到设备
adb push …

2、从设备拷贝文件/目录,-a参数保留了文件的时间戳和模式
adb pull [-a] …

3、查看设备log,和studio和eclipse的logcat相同,可通过参数控制输出的日志
adb logcat -s 过滤指定参数log -v time 保留日志时间 >> 追加写 > 覆盖写
下面的命令含义为:打印出log信息中的时间并且包含关键字“Test” 的所有log以覆盖写的方式保存到test文件
adb logcat -v time -s Test > test.txt

4、列出目录下的文件和文件夹,可选参数-al可查看文件和文件夹的详细信息
adb shell ls [-al]

5、进入文件夹
adb shell cd

6、查看文件
adb shell cat

7、重命名文件
adb shell rename path/oldfilename path/newfilename

8、删除文件/文件夹
adb shell rm path/filename -r 可选参数用于删除文件夹及下面的所有文件 eg:adb shell rm -r

9、移动文件
adb shell mv path/filename newpath/filename

10、拷贝文件
adb shell cp file newpath/file1

11、创建目录
adb shell mkdir path/folder

12、设置文件最高读写权限
adb shell chmod 777 filename

3 adb压力测试示例
①手机先安装测试包并运行
②adb命令查询当前运行的包的信息
adb shell dumpsys window | findstr mCurrentFocus
在这里插入图片描述
前面的为包名,后面的为active名称
③压力测试命令
–adb shell monkey -p com.just.busdriver -v 100 这个可以用monkey随机点我们的牦牛司机app 100是点击次数
–adb shell monkey -p com.just.busdriver --throttle 1 -v 100 每间隔1秒随机点击一次,共100次
–adb shell monkey -p com.just.busdriver -s 1533184620764 -v 10000 重复上一次的操作,-s为seed值,如果要复现上一次的动作,则继续使用上一次的seed值重新执行一次命令即可。
④压力测试时,建议新打开一个cmd运行log日志存储,以便于出现问题时查询日志;
adb logcat > c:\test.log //将日志保存到文件test.log
或可以执行压测时直接输出日志
adb shell monkey -p com.just.busdriver -v 100 > E:\adblog.txt

压测命令中的一些参数说明:
-v ,用于反馈日志的详细程度级别
Level 0 : adb shell monkey -p 包名 -v 10 // 默认级别,仅提供启动、测试完成和最终结果等少量信息
Level 1 : adb shell monkey -p 包名 -v -v 10 // 提供较为详细的日志,包括每个发送到Activity的事件信息
Level 2 : adb shell monkey -p 包名 -v -v -v 10 // 提供最详细的日志,包括了测试中选中/未选中的Activity信息

-s ,用于指定伪随机数生成器的seed值
命令:adb shell monkey -p 包名 –s seed值 执行次数
如果seed值相同,则两次Monkey测试所产生的事件序列也相同的,示例:
测试1:adb shell monkey -p com.kugou.android –s 1540475754297 100
测试2:adb shell monkey -p com.kugou.android –s 1540475754297 100

–throttle ,用于指定用户事件的操作间隔时延,单位是毫秒
如果不指定这个参数,monkey会尽可能快的生成和发送消息
命令:adb shell monkey -p 包名 --throttle 3000 100
4 adb日志分析
1、查找出差步骤:
a、找到monkey里哪个地方出错
查看Monkey执行的是哪一个Activity,在switch后面找,两个swtich之间如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
在这里插入图片描述
b、查看Monkey里面出错前的一些事件动作,手动执行该动作
Sleeping for XX milliseconds这是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件,
Sending XX 就是代表一个操作,如下图的两个操作 应该就是一个点击事件。
在这里插入图片描述
c、若以上步骤还不能找出,则可以使用之前一样的seek再执行monkey命令一遍,便于复现

2、测试结果分析:
a、程序无响应,ANR问题:在日志中搜索“ANR”
b、崩溃问题:在日志中搜索“CRASH”
c、其他问题:在日志中搜索”Exception”

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!