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

繁華似錦Fighting發表於2021-11-03

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 資訊。
    這個值就是你的應用真正佔據的記憶體大小,通過這個資訊,你可以輕鬆判別手機中哪些程式佔記憶體比較大了。

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

相關文章