『與善仁』Appium基礎 — 5、常用ADB命令(二)


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程序所在的目錄里。

如圖所示:

image

步驟2:

輸入命令 aapt dump badging <path_to_apk>

示例:

進入aapt.exe程序所在的目錄,在地址欄中輸入cmd,按下回車,進入命令行終端。

image

回車后進入命令行終端,如下圖:

image

輸入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 信息。
    這個值就是你的應用真正占據的內存大小,通過這個信息,你可以輕松判別手機中哪些程序占內存比較大了。

總結:也就是看前兩行,前兩列就行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM