9、檢視手機執行日誌
ADB命令:adb logcat
只要對Android手機/模擬器的操作,都會記錄到日誌中。
Android 系統的日誌分為兩部分,底層的 Linux 核心日誌輸出到 /proc/kmsg
,Android 的日誌輸出到 /dev/log
。
(1)Android 日誌
命令格式:
[adb] logcat [<option>] ... [<filter-spec>] ...
常用用法列舉如下:
(2)按級別過濾日誌
Android 的日誌分為如下幾個優先順序(priority
):
V
:Verbose
(最低,輸出得最多)D
:Debug
I
:Info
W
:Warning
E
:Error
F
:Fatal
S
:Silent
(最高,啥也不輸出)
按某級別過濾日誌則會將該級別及以上的日誌輸出。
比如,命令:
adb logcat *:W
會將 Warning
、Error
、Fatal
和 Silent
日誌輸出。
注: 在 macOS 下需要給
*:W
這樣以*
作為tag
的引數加雙引號,如adb logcat "*:W"
,不然會報錯no matches found: *:W
。)
(3)按 tag 和級別過濾日誌
<filter-spec>
可以由多個 <tag>[:priority]
組成。
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
表示輸出 tag
為 ActivityManager
的 Info 以上級別日誌,輸出 tag
為 MyApp
的 Debug
以上級別日誌,及其它 tag
的 Silent
級別日誌(即遮蔽其它 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
程式檔案來獲取appPackage
和appActivity
。
也就是獲取在電腦上的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
也可以換成程式的pid
,pid
可以通過 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 資訊。
這個值就是你的應用真正佔據的記憶體大小,通過這個資訊,你可以輕鬆判別手機中哪些程式佔記憶體比較大了。總結:也就是看前兩行,前兩列就行。