『与善仁』Appium基础|『与善仁』Appium基础 — 5、常用ADB命令(二)


目录

  • 9、查看手机运行日志
    • (1)Android 日志
    • (2)按级别过滤日志
    • (3)按 tag 和级别过滤日志
    • (4)日志格式
    • (5)清空日志
  • 10、获取APP的包名和启动名
    • 方式一:
    • 方式二:
  • 11、获取APP启动时间
  • 12、查看内存信息

9、查看手机运行日志 ADB命令:adb logcat
只要对Android手机/模拟器的操作,都会记录到日志中。
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log
(1)Android 日志
命令格式:
[adb] logcat [

常用用法列举如下:
(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 和级别过滤日志
可以由多个 [:priority] 组成。
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S

表示输出 tagActivityManager 的 Info 以上级别日志,输出 tagMyAppDebug 以上级别日志,及其它 tagSilent 级别日志(即屏蔽其它 tag 日志)。
(4)日志格式
可以用 adb logcat -v 选项指定日志输出格式。
日志支持按以下几种
  • brief
    默认格式,格式为:
    /():

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

  • process
    格式为:
    ()

    示例:
    D( 1785) Disconnected process message: 10, size: 0(HeadsetStateMachine)

  • tag
    格式为:
    /:

    示例:
    D/HeadsetStateMachine: Disconnected process message: 10, size: 0

  • raw
    格式为:

    示例:
    Disconnected process message: 10, size: 0

  • time
    格式为:
    /():

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

  • threadtime
    格式为:
    :

    示例:
    08-28 22:39:39.97417851832 D HeadsetStateMachine: Disconnected process message: 10, size: 0

  • long
    格式为:
    [ : / ]

    示例:
    [ 08-28 22:39:39.9741785: 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程序所在的目录里。
如图所示:
『与善仁』Appium基础|『与善仁』Appium基础 — 5、常用ADB命令(二)
文章图片

步骤2:
输入命令 aapt dump badging
示例:
进入aapt.exe程序所在的目录,在地址栏中输入cmd,按下回车,进入命令行终端。
『与善仁』Appium基础|『与善仁』Appium基础 — 5、常用ADB命令(二)
文章图片

回车后进入命令行终端,如下图:
『与善仁』Appium基础|『与善仁』Appium基础 — 5、常用ADB命令(二)
文章图片

输入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:21503C:\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 CompleteC:\Users\L>

解释:这里有三个时间
  • TotalTime:APP自身启动时间。
  • WaitTime:系统启动应用时间(也就是系统启动应用耗时)。
  • ThisTime:APP中启动页打开的时间。
三者之间的关系:WaitTime = TotalTime + ThisTime
12、查看内存信息 ADB命令:adb shell dumpsys meminfo
其中,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] ** PssPrivatePrivateSwapHeapHeapHeap TotalDirtyCleanDirtySizeAllocFree ------------------------------------------ Native Heap0000803846533715046 Dalvik Heap565255639200630144663016384 Dalvik Other9119911600 Stack2680268000 Ashmem344400 Other dev260240 .so mmap21428364490280 .apk mmap209007040 .ttf mmap1760240 .dex mmap4694516184440 .oat mmap612308480 .art mmap2685225200 Other mmap48081622880 Unknown771917712000 TOTAL23014015124031360014339811196731430...省略后边内容...

提示:
在命令行窗口运行上述命令,得到程序的内存情况信息如下说明:
主要看:
  • Native/Dalvik 的 Heap 信息。
    具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
  • Total 的 PSS 信息。
    这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
【『与善仁』Appium基础|『与善仁』Appium基础 — 5、常用ADB命令(二)】总结:也就是看前两行,前两列就行。

    推荐阅读