title: Android Debug Bridge (ADB) 使用總結(jié)
date: 2019-11-12 00:39:37
tags: 'adb'
categories: note
第1節(jié) 最常用案例
注意: 應(yīng)用包名默認(rèn)為
com.example.app
1.1 啟動(dòng)應(yīng)用主界面
adb shell am start -n "com.example.app/com.example.app.ui.basic.activity.LoginActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
注解:
-
com.example.app.ui.basic.activity.LoginActivity
為配有action.MAIN
和category.LAUNCHER
的Activity 即應(yīng)用啟動(dòng)頁(yè)面祷愉;
1.2 獲取當(dāng)前顯示Activity
adb shell dumpsys activity activities | grep 'ActivityRecord' | grep 'com.example.app'
結(jié)果:
Activities=[ActivityRecord{4df0741 u0 com.example.app/.ui.client.MainActivity t17}, ActivityRecord{45c40f u0 com.example.app/.ui.client.activity.InformationUnreadActivity t17}]
* Hist #1: ActivityRecord{45c40f u0 com.example.app/.ui.client.activity.InformationUnreadActivity t17}
* Hist #0: ActivityRecord{4df0741 u0 com.example.app/.ui.client.MainActivity t17}
Run #1: ActivityRecord{45c40f u0 com.example.app/.ui.client.activity.InformationUnreadActivity t17}
Run #0: ActivityRecord{4df0741 u0 com.example.app/.ui.client.MainActivity t17}
mResumedActivity: ActivityRecord{45c40f u0 com.example.app/.ui.client.activity.InformationUnreadActivity t17}
mLastPausedActivity: ActivityRecord{4df0741 u0 com.example.app/.ui.client.MainActivity t17}
ResumedActivity: ActivityRecord{45c40f u0 com.example.app/.ui.client.activity.InformationUnreadActivity t17}
分析關(guān)鍵字:
-
mResumedActivity
: 當(dāng)前顯示activity為InformationUnreadActivity
-
mLastPausedActivity
最近停止顯示的Activity為mLastPausedActivity
1.3 獲取屏幕分辨率
adb shell dumpsys window displays
輸出(省略):
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1794x1731
deferred=false mLayoutNeeded=false mTouchExcludeRegion=SkRegion((0,0,1080,1920))
mLayoutSeq=500
....
注解:
-
cur=1080x1920
機(jī)器為1080 X 1920 分辨率的機(jī)器
1.4 獲取App 冷熱啟動(dòng)時(shí)間
注解: 冷啟動(dòng)指App 從0到完全加載的過(guò)程整慎,熱啟動(dòng)指:app從后臺(tái)進(jìn)入前臺(tái)邓梅,重新顯示的過(guò)程
假設(shè):com.example.app
為測(cè)試應(yīng)用包名拷邢,注意啟動(dòng)的Activity必須在清單文件AndroidManifest.xml
中設(shè)置 Activity 屬性exported=true
冷啟動(dòng)
-
模擬冷啟動(dòng)狈茉,強(qiáng)行停止應(yīng)用
com.example.app
adb shell am force-stop com.example.app
-
獲取啟動(dòng)時(shí)間
adb shell am start -W com.example.app/.ui.client.MainActivity
-
輸出結(jié)果
Status: ok Activity: com.example.app/.ui.client.MainActivity ThisTime: 7198 該activity啟動(dòng)耗時(shí) TotalTime: 7198 應(yīng)用自身啟動(dòng)耗時(shí)=ThisTime+應(yīng)用application等資源啟動(dòng)時(shí)間 WaitTime: 7346 系統(tǒng)啟動(dòng)應(yīng)用耗時(shí)=TotalTime+系統(tǒng)資源啟動(dòng)時(shí)間 Complete
熱啟動(dòng)
-
模擬按Home鍵
adb shell input keyevent 3
同上
1.5 清除App緩存
-
模糊查找包名
adb shell pm list packages | grep com.example
-
清除所有與該包名相關(guān)的數(shù)據(jù)蔑匣,
deletes all data associated with a package.
adb shell pm clear com.example.app
第2節(jié) 應(yīng)用安裝
2.1 基本的安裝與卸載
adb install [options] sample.apk
[-r] replace existing application
[-s] install application on sdcard
adb uninstall [options] sample.apk
[-k] means keep the data and cache directories
2.2 強(qiáng)行停止
adb shell am force-stop [options] <app package name >
第3節(jié) 查看內(nèi)存使用情況
adb shell dumpsys meminfo [pid or 空]
-
adb shell dumpsys meminfo
顯示手機(jī)每個(gè)應(yīng)用內(nèi)存使用情況Applications Memory Usage (in Kilobytes): Uptime: 69236415 Realtime: 69236415 Total PSS by process: 121,950K: com.example.app:pushcore (pid 29262) 88,714K: system (pid 1882) 68,646K: com.exinetian.app (pid 28829 / activities) 63,149K: com.google.android.googlequicksearchbox:search (pid 2527) 48,624K: com.google.android.gms.persistent (pid 2533) 45,421K: com.google.android.gms (pid 2691) 45,059K: com.google.android.apps.nexuslauncher (pid 2545 / activities) 44,975K: com.android.systemui (pid 2000) 29,179K: com.android.vending (pid 26823) 25,800K: com.google.android.inputmethod.latin (pid 1991) 16,701K: com.android.phone (pid 2126) 12,922K: audioserver (pid 1634) 10,259K: com.google.android.googlequicksearchbox:interactor (pid 2416)
adb shell dumpsys meminfo <pid>
#得到pid
adb shell ps -ef | grep com.example.app
# 查看進(jìn)程28829 內(nèi)存使用情況
adb shell dumpsys meminfo 28829
輸出:
** MEMINFO in pid 28829 [com.exinetian.app] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 17072 17004 0 0 27264 23545 3718
Dalvik Heap 5870 5800 0 0 7523 3762 3761
Dalvik Other 2653 2652 0 0
Stack 140 140 0 0
Ashmem 5 0 0 0
Other dev 24 0 24 0
.so mmap 5388 160 2148 0
.apk mmap 3434 1856 356 0
.ttf mmap 256 0 216 0
.dex mmap 18456 13340 1244 0
.oat mmap 228 0 80 0
.art mmap 7737 7052 240 0
Other mmap 5642 4 4360 0
Unknown 1433 1416 0 0
TOTAL 68338 49424 8668 0 34787 27307 7479
解析:
第4節(jié) 啟動(dòng)原生組件(Component)
參見(jiàn) http://developer.android.com/tools/help/adb.html#am
4.1 Activity
adb shell am start [options]
舉例:adb shell am start -a android.intent.action.MAIN
舉例:adb shell am start -n com.example.app.android.emop/.activity.login.LoginActivity
4.2 service
adb shell am startservice [options]
舉例:
舉例:adb shell am startservice -a com.lt.test.action.ONESERVICE
舉例:adb shell am startservice -n com.example.app.android.emop/.MyService
4.2 broadcast
adb shell am broadcast [options]
舉例:
舉例:adb shell am broadcast -a EMOP_OFF_LINE_ASSIGN_TASK //when the permission
<receiver android:permission="com.example.permission.EMOP_SERVICE_RECEIVER" >
<intent-filter>
<action android:name="EMOP_OFF_LINE_ASSIGN_TASK"/>
</intent-filter >
</receiver>
舉例:adb shell am broadcast -a "action_finish"(發(fā)送一個(gè)廣播去關(guān)閉一個(gè)activity)
舉例:adb shell am broadcast -a android.intent.action.MASTER_CLEAR(恢復(fù)出廠設(shè)置的方法,會(huì)清除內(nèi)存所有內(nèi)容)
舉例:adb shell am broadcast -n com.lt.test/.MyBroadcast
4.3 傳入Intent參數(shù)
<INTENT> specifications include these flags:
[-a <ACTION>]
[-d <DATA_URI>]
[-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>]
[-f <FLAGS>]
[<URI>]
案例1:
am start -a android.intent.action.VIEW -d http://www.baidu.com
am start -a android.intent.action.CALL -d tel:12345
am start -a android.intent.action.VIEW -d file:///sdcard/video.3gp -t video/*
案例2:
目的傳入
pid 整數(shù)盛垦,值為10
str 字符串湿弦,值為"hello, world"
am start -a android.intent.action.MAIN -n \
net.yurushao.demo/net.yurushao.demo.ExampleActivity --ei pid 10 --es str "hello, world"
4.4 應(yīng)用場(chǎng)景
- 嵌入一個(gè)DebugActivity用于存放一下Debug代碼,adb 直接啟動(dòng)腾夯,開(kāi)發(fā)測(cè)試過(guò)程中不用每次都啟動(dòng)app找到自己埋下的測(cè)試點(diǎn)颊埃;
- 動(dòng)態(tài)測(cè)試組件,用adb動(dòng)態(tài)傳參蝶俱,測(cè)試不同參數(shù)下組件的處理邏輯班利;
- App中埋入隱藏的控制點(diǎn),可以在不改變代碼的情況下榨呆,控制App內(nèi)部邏輯走向
第5節(jié) Logcat的使用
adb logcat -s System.out ## 只查看System.out 的輸出
-v
adb logcat -v time *** ## 能查看logcat緩存的日志罗标,定位之前發(fā)生的異常信息
adb logcat -v brief
adb logcat -v process ##優(yōu)先級(jí) (進(jìn)程ID) : 日志信息
adb logcat -v tag ##優(yōu)先級(jí) / 標(biāo)簽 : 日志信息
adb logcat -v thread ##優(yōu)先級(jí) ( 進(jìn)程ID : 線程ID) 標(biāo)簽 : 日志內(nèi)容
adb logcat -v raw ##只輸出日志信息
adb logcat -v time ##日期 時(shí)間 優(yōu)先級(jí) / 標(biāo)簽 (進(jìn)程ID) : 進(jìn)程名稱 : 日志信息
adb logcat -v long ##[日期 時(shí)間 進(jìn)程ID : 線程ID 優(yōu)先級(jí) / 標(biāo)簽] 日志信息 **
adb logcat -b main/events/system
adb logcat -g
adb logcat *:E | grep "example" ## 搜索指定的錯(cuò)誤信息
第6節(jié) Android中常用的Linux命令
adb shell ps -t
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 268 180 c009b74c 0000875c S /init
cat /proc/34/status #進(jìn)程狀態(tài)
adb -s 20080411 shell cat /system/build.prop //設(shè)備信息
adb shell top // 查看設(shè)備cpu和內(nèi)存占用情況
adb shell top -m 6 // 查看占用內(nèi)存前6的app
adb shell top -n 1 // 刷新一次內(nèi)存信息,然后返回
adb shell procrank // 查詢各進(jìn)程內(nèi)存使用情況
adb shell kill [pid] // 殺死一個(gè)進(jìn)程
adb shell ps // 查看進(jìn)程列表
adb shell ps -x [PID] // 查看指定進(jìn)程狀態(tài)
adb shell service list // 查看后臺(tái)services信息
adb shell cat /proc/meminfo // 查看當(dāng)前內(nèi)存占用
adb shell cat /proc/iomem // 查看IO內(nèi)存分區(qū)
adb shell cat /sys/class/net/wlan0/address // 獲取mac地址
adb shell cat /proc/cpuinfo // 獲取cpu序列號(hào)
其他
Screencap
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png
input
input keyevent 82 # 菜單事件(MENU)
input keyevent 4 # 回退事件 (BACK)
input text “i_love_beijing” # 輸入文字
ime 輸入法管理
usage: ime list [-a] [-s]
ime enable ID
ime disable ID
ime set ID
ime list
ime set com.baidu.input_huawei/.ImeService
Android具有prop屬性系統(tǒng),使用getprop和setprop