9、查看手机运行日志

ADB命令:adb logcat

只要对Android手机/模拟器的操作,都会记录到日志中。

Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log

(1)Android 日志

命令格式:

[adb] logcat [<option>] ... [<filter-spec>] ...

常用用法列举如下:

(2)按级别过滤日志

Android 的日志分为如下几个优先级(priority):

  • VVerbose(最低,输出得最多)
  • DDebug
  • IInfo
  • WWarning
  • EError
  • FFatal
  • SSilent(最高,啥也不输出)

按某级别过滤日志则会将该级别及以上的日志输出。

比如,命令:

adb logcat *:W

会将 WarningErrorFatalSilent 日志输出。

注: 在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W。)

(3)按 tag 和级别过滤日志

<filter-spec> 可以由多个 <tag>[:priority] 组成。

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S

表示输出 tagActivityManager 的 Info 以上级别日志,输出 tagMyAppDebug 以上级别日志,及其它 tagSilent 级别日志(即屏蔽其它 tag 日志)。

(4)日志格式

可以用 adb logcat -v <format> 选项指定日志输出格式。

日志支持按以下几种 <format>

  • brief

    默认格式,格式为:
    <priority>/<tag>(<pid>): <message>

    示例:

    D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
  • process

    格式为:
    <priority>(<pid>) <message>

    示例:

    D( 1785) Disconnected process message: 10, size: 0  (HeadsetStateMachine)
  • tag

    格式为:
    <priority>/<tag>: <message>

    示例:

    D/HeadsetStateMachine: Disconnected process message: 10, size: 0
  • raw

    格式为:
    <message>

    示例:

    Disconnected process message: 10, size: 0
  • time

    格式为:
    <datetime> <priority>/<tag>(<pid>): <message>

    示例:

    08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
  • threadtime

    格式为:
    <datetime> <pid> <tid> <priority> <tag>: <message>

    示例:

    08-28 22:39:39.974  1785  1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
  • long

    格式为:
    [ <datetime> <pid>:<tid> <priority>/<tag> ]
    <message>

    示例:

    [ 08-28 22:39:39.974  1785: 1832 D/HeadsetStateMachine ]
    Disconnected process message: 10, size: 0

    指定格式可与上面的过滤同时使用。比如:

    adb logcat -v long ActivityManager:I *:S

(5)清空日志

命令如下:

adb logcat -c

10、获取APP的包名和启动名

执行APP自动化测试之前,必须要获取所测试APP的appPackage(包名)和appActivity(启动名),之后将这两个值填写到脚本指定参数里,来告诉要执行的是哪个APP。

appPackage(包名):决定程序的唯一性(不是应用的名字)。APP的包名是看不到的,需要执行命令才能查看得到的。

appActivity(启动名):目前可以理解为一个启动名对应一个页面。

APP的包名和启动名获取方式有很多(任选其一即可):

方式一:

先在设备里打开要获取的App。

输入命令 adb shell dumpsys window windows | findstr mFocusedApp

例如:淘宝APP,如下所示:

# 链接逍遥模拟器
C:\Users\L>adb connect 127.0.0.1:21503
adb server version (31) doesn't match this client (41); killing...
* daemon started successfully
connected to 127.0.0.1:21503 # 获取淘宝App首页的包名和启动名
C:\Users\L>adb shell dumpsys window windows | findstr mFocusedApp
mFocusedApp=AppWindowToken{1554db9 token=Token{a292380 ActivityRecord{9c92803 u0 com.taobao.taobao/com.taobao.tao.TBMainActivity t16}}} C:\Users\L>

我们从上面可以看出,淘宝APP的:

appPackage为:com.taobao.taobao

appActivity为:com.taobao.tao.TBMainActivity

当我们点击淘宝APP淘宝首页中的天猫国际,再次获取淘宝APP的包名和启动名。

C:\Users\L>adb shell dumpsys window windows | findstr mFocusedApp
mFocusedApp=AppWindowToken{f99dcd9 token=Token{8b7fb20 ActivityRecord{ab41a23 u0 com.taobao.taobao/com.taobao.browser.BrowserActivity t16}}} C:\Users\L>

我们从上面可以看出,淘宝APP的:

appPackage为:com.taobao.taobao

appActivity为:com.taobao.browser.BrowserActivity

提示:斜杠前面的内容是包名,斜杠后面的内容是启动名。

方式二:

通过.apk程序文件来获取appPackageappActivity

也就是获取在电脑上的apk的包名/启动名,此时还没有安装在设备上。

步骤1:

命令行进入Android SDK目录下aapt.exe程序所在的目录里。

如图所示:

步骤2:

输入命令 aapt dump badging <path_to_apk>

示例:

进入aapt.exe程序所在的目录,在地址栏中输入cmd,按下回车,进入命令行终端。

回车后进入命令行终端,如下图:

输入aapt dump badging + apk路径命令

F:\DevInstall\envs\android-sdk-windows\build-tools\25.0.3>aapt dump badging C:\Users\L\Desktop\com.taobao.taobao_V9.15.0.apk

执行该命令会有很多内容,其中

  • package: name='com.taobao.taobao'为该app的包名信息。
  • launchable-activity: name='com.taobao.tao.welcome.Welcome'为该APP的启动页的信息。(和上边一种方式是有区别的)

提示:

APP的启动名和启动页的区别

启动名指的是当前启动页面的名字,启动页是一个APP的欢迎页面被启动,

所以说启动名包含启动页。

11、获取APP启动时间

ADB命令:adb shell am start -W 包名/启动名

示例:

# 链接逍遥模拟器
C:\Users\L>adb connect 127.0.0.1:21503
adb server version (31) doesn't match this client (41); killing...
* daemon started successfully
connected to 127.0.0.1:21503 C:\Users\L> # 获取淘宝App首页的包名和启动名
C:\Users\L>adb shell dumpsys window windows | findstr mFocusedApp
mFocusedApp=AppWindowToken{48d0f7f token=Token{a1f589e ActivityRecord{f5ca6d9 u0 com.taobao.taobao/com.taobao.tao.TBMainActivity t17}}} C:\Users\L> # 获取淘宝app启动时间
# 包名:com.taobao.taobao
# 启动名:com.taobao.tao.TBMainActivity
C:\Users\L>adb shell am start -W com.taobao.taobao/com.taobao.tao.TBMainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.taobao.taobao/com.taobao.tao.TBMainActivity }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: com.taobao.taobao/com.taobao.tao.TBMainActivity
ThisTime: 0
TotalTime: 0
WaitTime: 3
Complete C:\Users\L>

解释:这里有三个时间

  • TotalTime:APP自身启动时间。
  • WaitTime:系统启动应用时间(也就是系统启动应用耗时)。
  • ThisTime:APP中启动页打开的时间。

三者之间的关系:WaitTime = TotalTime + ThisTime

12、查看内存信息

ADB命令:adb shell dumpsys meminfo <package_name>

其中,package_name 也可以换成程序的pidpid可以通过 adb shell top | grep app_name命令来查找。

演示命令:

C:\Users\L>adb shell dumpsys meminfo com.taobao.taobao
Applications Memory Usage (in Kilobytes):
Uptime: 904975 Realtime: 904975 ** MEMINFO in pid 1413 [com.taobao.taobao] **
Pss Private Private Swap Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 0 0 0 0 80384 65337 15046
Dalvik Heap 56525 56392 0 0 63014 46630 16384
Dalvik Other 9119 9116 0 0
Stack 2680 2680 0 0
Ashmem 344 4 0 0
Other dev 26 0 24 0
.so mmap 21428 3644 9028 0
.apk mmap 2090 0 704 0
.ttf mmap 176 0 24 0
.dex mmap 46945 16 18444 0
.oat mmap 6123 0 848 0
.art mmap 2685 2252 0 0
Other mmap 4808 16 2288 0
Unknown 77191 77120 0 0
TOTAL 230140 151240 31360 0 143398 111967 31430 ...省略后边内容...

提示:

在命令行窗口运行上述命令,得到程序的内存情况信息如下说明:

主要看:

  • Native/Dalvik 的 Heap 信息。

    具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
  • Total 的 PSS 信息。

    这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

总结:也就是看前两行,前两列就行。

『与善仁』Appium基础 — 5、常用ADB命令(二)的更多相关文章

  1. 『与善仁』Appium基础 — 3、ADB命令介绍

    目录 1.ADB命令简介 2.ADB命令运行原理 3.通过ADB命令连接安卓模拟器 (1)安装安卓模拟器 (2)ADB命令连接安卓模拟器 (3)常用Android模拟器端口号 1.ADB命令简介 AD ...

  2. 『与善仁』Appium基础 — 7、ADB Shell命令的使用

    目录 1.查看进程 2.查看实时资源占用情况 3.查看进程 UID 4.其它ADB Shell命令说明 Android系统是基于 Linux 内核的,也就是说Android系统的底层是Linux系统. ...

  3. 『与善仁』Appium基础 — 8、Appium自动化测试框架介绍

    目录 1.主流的移动端自动化测试框架 (1)Robotium (2)Macaca (3)Appium 2.自动化测试工具的选择 3.Appium简介 提示:我们前面说的Android环境搭建和adb命 ...

  4. 『与善仁』Appium基础 — 12、Appium的安装详解

    目录 (一)Appium server安装 方式一:(桌面方式:推荐) 1.Appium Desktop下载 2.Appium Desktop安装 3.Appium Desktop使用 方式二:(No ...

  5. 『与善仁』Appium基础 — 15、使用Appium的第一个Demo

    我们使用Python语言作为测试脚本的编写语言. 执行脚本前提: Android模拟器或者手机是开机状态. 使用确保电脑和Android设备进行了链接. 也就是使用ADB命令adb connect链接 ...

  6. 『与善仁』Appium基础 — 16、APPium基础操作API

    目录 1.前置代码 2.安装和卸载APP 3.判断APP是否已安装 4.关闭APP软件和关闭驱动对象 5.发送文件到手机和获取手机中的文件 6.获取当前屏幕内元素结构(重点) 7.脚本内启动其他APP ...

  7. 『与善仁』Appium基础 — 9、补充:C/S架构和B/S架构说明

    目录 1.C/S架构和B/S架构概念 2.C/S结构与B/S架构的区别 3.C/S架构和B/S架构优点和缺点 (1)B/S模式的优点和缺点: (2)C/S模式的优点和缺点: 1.C/S架构和B/S架构 ...

  8. 『与善仁』Appium基础 — 10、Appium基本原理

    目录 1.Appium自动化测试架构 2.Appium架构图 3.Session说明 4.Desired Capabilities说明 5.Appium Server说明 6.Appium Clien ...

  9. 『与善仁』Appium基础 — 14、Appium测试环境搭建

    目录 1.Appium测试环境搭建整体思路 (1)Android测试环境搭建 (2)Appium测试环境搭建 (3)测试脚本语言的环境搭建 2.Appium在Android端和IOS端的工作流程 (1 ...

  10. 『与善仁』Appium基础 — 17、元素定位工具(一)

    目录 1.uiautomatorviewer介绍 2.uiautomatorviewer工具打开方式 3.uiautomatorviewer布局介绍 4.uiautomatorviewer工具的使用 ...

随机推荐

  1. 【PHP数据结构】完全二叉树、线索二叉树及树的顺序存储结构

    在上篇文章中,我们学习了二叉树的基本链式结构以及建树和遍历相关的操作.今天我们学习的则是一些二叉树相关的概念以及二叉树的一种变形形式. 完全二叉树 什么叫完全二叉树呢?在说到完全二叉树之前,我们先说另 ...

  2. jmeter之命令行执行jmx脚本

    使用界面执行不稳定,且保存报告非常麻烦 https://www.jb51.net/article/191367.htm 作者:Anthony_tester 来源:CSDN 原文:https://blo ...

  3. PHP统计当前网站的访问人数,访问信息,被多少次访问。

    <?php  header('Content-type:text/html;charset=utf-8'); //统计流量(人数,访问次数,用户IP) //假设用户访问,得到IP地址 $remo ...

  4. HTML 网页开发、CSS 基础语法—— 一. HTML概述(了解网页)

    1. 网页的本质 ① HTML就是用来制作网页文件的. ② 浏览器查看的网页都是.html或.htm文件. ③ HTML叫做超文本标记语言(Hypertext Markup Language),用于搭 ...

  5. P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】

    正题 题目链接:https://www.luogu.com.cn/problem/P6085 题目大意 \(n\)个点的一张无向图,有\(k\)条必走边,\(m\)条其他边,求从\(1\)出发经过必走 ...

  6. 深入浅出WPF-10.Resource(资源)

    资源 对象级资源:每个WPF的界面元素都有一个名为Resources的属性,这个属性继承自FrameworkElement类,其类型为ResourceDictionary,采用键值对的形式存储资源,当 ...

  7. B站1024程序员节部分答案

    1.页面的背后是什么? 直接撸页面源码就行啦 2.真正的秘密只有特殊的设备才能看到 修改UA为页面上提示的"bilibili Security Browser" 3.密码是啥? 弱 ...

  8. 密码学系列之:加密货币中的scrypt算法

    目录 简介 scrypt算法 scrypt算法详解 scrypt的使用 简介 为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合.但是这些算法逐渐被一些特 ...

  9. L1-023 输出GPLT (20 分) java题解 GPLT天梯赛防坑技巧

    上题目先 给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的 ...

  10. FastAPI 学习之路(九)请求体有多个参数如何处理?

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...