Android Debug Bridge:android調(diào)試橋,通常位于sdk的platform-toor文件夾下继榆。
ADB架構(gòu)
adb是一個C/S架構(gòu)的應用程序巾表,由三部分組成:
- 客戶端,運行在開發(fā)者的pc端略吨,使用adb命令調(diào)用攒发。運行后會嘗試定位主機上的adb服務器,如果沒有則啟動一個adb服務器晋南。
- 服務器惠猿,運行在開發(fā)者pc端的一個后臺進程,作用在于監(jiān)測usb端口的感知設備的連接和拔出负间;管理客戶端和守護進程之間的通信偶妖,將客戶端的請求通過usb或者tcp的方式發(fā)送到設備端的守護進程(常駐進程)adbd中。
- adbd(adb demon)政溃,運行在每個設備端后臺的一個守護進程(常駐進程)趾访,作用是用于連接adb服務器,當adbd與服務器連接后董虱,客戶端就可以想adb服務器發(fā)送服務請求了扼鞋。
adb的工作原理
- 在pc端運行adb命令啟動時,客戶端先監(jiān)測服務器進程是否運行愤诱,否則啟動云头,服務器在啟動后與本地 tcp的5037端口綁定,通過該端口監(jiān)聽客戶端發(fā)出的命令淫半,也可以通過
adb -P <port> start-server
指定固定端口溃槐。 - 服務器與設備端連接,服務器通過掃描5555到5585之間的奇數(shù)端口查找模擬器科吭,服務器發(fā)現(xiàn)adbd(守護進程)后便于之連接昏滴。
note:每個模擬器都使用一對按順序排列的端口,偶數(shù)端口連接控制臺对人,奇數(shù)端口連接adb谣殊。
具體用法
指定目標設備
如果有多個設備時使用:
-d
指定當前唯一通過 USB 連接的 Android 設備為命令目標
-e
指定當前唯一運行的模擬器為命令目標
-s <serialNumber>
指定相應 serialNumber 號的設備/模擬器為命令目標
查看應用列表
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在 adb shell pm list packages 的基礎上可以加一些參數(shù)進行過濾查看不同的列表,支持的過濾參數(shù)如下:
無
所有應用
-f
顯示應用關(guān)聯(lián)的 apk 文件
-d
只顯示 disabled 的應用
-e
只顯示 enabled 的應用
-s
只顯示系統(tǒng)應用
-3
只顯示第三方應用
-i
顯示應用的 installer
-u
包含已卸載應用
<FILTER>
包名包含 <FILTER> 字符串
安裝APK
adb install
后面可以跟一些可選參數(shù)來控制安裝 APK 的行為牺弄,可用參數(shù)及含義如下:
-l
將應用安裝到保護目錄 /mnt/asec
-r
允許覆蓋安裝
-t
允許安裝 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的應用
-s
將應用安裝到 sdcard
-d
允許降級覆蓋安裝
-g
授予所有運行時權(quán)限
常見安裝失敗輸出代碼姻几、含義及可能的解決辦法如下:
INSTALL_FAILED_ALREADY_EXISTS
應用已經(jīng)存在,或卸載了但沒卸載干凈;adb install 時使用 -r 參數(shù)辟狈,或者先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_INVALID_APK
無效的 APK 文件
INSTALL_FAILED_INVALID_URI
無效的 APK 文件名;確保 APK 文件名里無中文
INSTALL_FAILED_INSUFFICIENT_STORAGE
空間不足;清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE
已經(jīng)存在同名程序
INSTALL_FAILED_NO_SHARED_USER
請求的共享用戶不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE
以前安裝過同名應用,但卸載時數(shù)據(jù)沒有移除厢拭;或者已安裝該應用尿褪,但簽名不一致;先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
請求的共享用戶存在但簽名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY
安裝包使用了設備上不可用的共享庫
INSTALL_FAILED_REPLACE_COULDNT_DELETE
替換時無法刪除
INSTALL_FAILED_DEXOPT
dex 優(yōu)化驗證失敗或空間不足
INSTALL_FAILED_OLDER_SDK
設備系統(tǒng)版本低于應用要求
INSTALL_FAILED_CONFLICTING_PROVIDER
設備里已經(jīng)存在與應用里同名的 content provider
INSTALL_FAILED_NEWER_SDK
設備系統(tǒng)版本高于應用要求
INSTALL_FAILED_TEST_ONLY
應用是 test-only 的,但安裝時沒有指定 -t 參數(shù)
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
包含不兼容設備 CPU 應用程序二進制接口的 native code
INSTALL_FAILED_MISSING_FEATURE
應用使用了設備不可用的功能
INSTALL_FAILED_CONTAINER_ERROR
sdcard 訪問失敗; 應用簽名與 ROM 簽名一致扭吁,被當作內(nèi)置應用。確認 sdcard 可用,或者安裝到內(nèi)置存儲; 打包時不與 ROM 使用相同簽名盒音。
INSTALL_FAILED_INVALID_INSTALL_LOCATION
不能安裝到指定位置;應用簽名與 ROM 簽名一致,被當作內(nèi)置應用馅而。切換安裝位置祥诽,添加或刪除 -s 參數(shù);打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_MEDIA_UNAVAILABLE
安裝位置不可用,一般為 sdcard瓮恭,確認 sdcard 可用或安裝到內(nèi)置存儲
INSTALL_FAILED_VERIFICATION_TIMEOUT
驗證安裝包超時
INSTALL_FAILED_VERIFICATION_FAILURE
驗證安裝包失敗
INSTALL_FAILED_PACKAGE_CHANGED
應用與調(diào)用程序期望的不一致
INSTALL_FAILED_UID_CHANGED
以前安裝過該應用雄坪,與本次分配的 UID 不一致清除以前安裝過的殘留文件
INSTALL_FAILED_VERSION_DOWNGRADE
已經(jīng)安裝了該應用更高版本
使用 -d 參數(shù)
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE
已安裝 target SDK 支持運行時權(quán)限的同名應用,要安裝的版本不支持運行時權(quán)限
INSTALL_PARSE_FAILED_NOT_APK
指定路徑不是文件屯蹦,或不是以 .apk 結(jié)尾
INSTALL_PARSE_FAILED_BAD_MANIFEST
無法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION
解析器遇到異常
INSTALL_PARSE_FAILED_NO_CERTIFICATES
安裝包沒有簽名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
已安裝該應用维哈,且簽名與 APK 文件不一致
先卸載設備上的該應用,再安裝
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING
解析 APK 文件時遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME
manifest 文件里沒有或者使用了無效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID
manifest 文件里指定了無效的共享用戶 ID
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
解析 manifest 文件時遇到結(jié)構(gòu)性錯誤
INSTALL_PARSE_FAILED_MANIFEST_EMPTY
在 manifest 文件里找不到找可操作標簽(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR
因系統(tǒng)問題安裝失敗
INSTALL_FAILED_USER_RESTRICTED
用戶被限制安裝應用
INSTALL_FAILED_DUPLICATE_PERMISSION
應用嘗試定義一個已經(jīng)存在的權(quán)限名稱
INSTALL_FAILED_NO_MATCHING_ABIS
應用包含設備的應用程序二進制接口不支持的 native code
INSTALL_CANCELED_BY_USER
應用安裝需要在設備上確認登澜,但未操作設備或點了取消;在設備上同意安裝
INSTALL_FAILED_ACWF_INCOMPATIBLE
應用程序與設備不兼容
does not contain AndroidManifest.xml
無效的 APK 文件
is not a valid zip file
無效的 APK 文件
Offline
設備未連接成功;先將設備與 adb 連接成功
unauthorized
設備未授權(quán)允許調(diào)試
error: device not found
沒有連接成功的設備;先將設備與 adb 連接成功
protocol failure
設備已斷開連接;先將設備與 adb 連接成功
Unknown option: -s
Android 2.2 以下不支持安裝到 sdcard;不使用 -s 參數(shù)
No space left on device
空間不足;清理空間
Permission denied ... sdcard ...
sdcard 不可用
signatures do not match the previously installed version; ignoring!
已安裝該應用且簽名不一致;先卸載設備上的該應用阔挠,再安裝
adb install 內(nèi)部原理簡介
adb install 實際是分三步完成:
- push apk 文件到 /data/local/tmp。
- 調(diào)用 pm install 安裝脑蠕。
- 刪除 /data/local/tmp 下的對應 apk 文件购撼。
所以,必要的時候也可以根據(jù)這個步驟谴仙,手動分步執(zhí)行安裝過程迂求。
清除應用數(shù)據(jù)與緩存
adb shell pm clear <packagename>
<packagename> 表示應用名包,這條命令的效果相當于在設置里的應用信息界面點擊了「清除緩存」和「清除數(shù)據(jù)」晃跺。
實例:
adb shell pm clear com.qihoo360.mobilesafe
查看前臺 Activity
adb shell dumpsys activity activities | grep mFocusedActivity
查看正在運行的 Services
adb shell dumpsys activity services [<packagename>]
<packagename>
參數(shù)不是必須的锁摔,指定<packagename>
表示查看與某個包名相關(guān)的 Services,不指定表示查看所有 Services,<packagename>
不一定要給出完整的包名
查看應用詳細信息
adb shell dumpsys package <packagename>
輸出中包含很多信息哼审,包括 Activity Resolver Table谐腰、Registered ContentProviders、包名涩盾、userId十气、安裝后的文件資源代碼等路徑、版本信息春霍、權(quán)限信息和授予狀態(tài)砸西、簽名版本信息等。
與應用交互
主要是使用am <command>
,常用<command>
如下:
start [options] <INTENT>
啟動 <INTENT> 指定的 Activity
startservice [options] <INTENT>
啟動 <INTENT> 指定的 Service
broadcast [options] <INTENT>
發(fā)送 <INTENT> 指定的廣播
force-stop <packagename>
停止 <packagename> 相關(guān)的進程
<INTENT>
參數(shù)很靈活芹枷,和寫 Android 程序時代碼里的 Intent 相對應衅疙。
用于決定 intent 對象的選項如下:
-a <ACTION>
指定 action,比如 android.intent.action.VIEW
-c <CATEGORY>
指定 category鸳慈,比如 android.intent.category.APP_CONTACTS
-n <COMPONENT>
指定完整 component 名饱溢,用于明確指定啟動哪個 Activity,如 com.example.app/.ExampleActivity
強制停止應用
adb shell am force-stop <packagename>
文件管理
adb pull <設備里的目錄> <電腦上的文件路徑>
adb push <電腦上的文件路徑> <設備里的目錄>
按鍵模擬/輸入
input
這是一個非常有意思的命令
命令adb shell input [<source>] <command> [<arg>...]
最常用的<source>
主要是keyevent
和text
keyevent
的常用code如下:
內(nèi)核日志
adb shell dmesg
IP 地址
每次想知道設備的 IP 地址的時候都得「設置」-「關(guān)于手機」-「狀態(tài)信息」-「IP地址」很煩對不對走芋?通過 adb 可以方便地查看绩郎。
adb shell ifconfig | grep Mask
內(nèi)存信息
adb shell cat /proc/meminfo
關(guān)閉 USB 調(diào)試模式
adb shell settings put global adb_enabled 0
實用功能
屏幕截圖
adb exec-out screencap -p > sc.png
保存截圖到電腦
adb shell screencap -p /sdcard/sc.png
保存截圖到設備
adb shell screenrecord /sdcard/filename.mp4
錄屏保存到設備,默認時長180秒
重新掛載 system 分區(qū)為可寫
需要root權(quán)限
先用mount
命令找到system所在行的路徑翁逞,然后使用
mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
這里的 /dev/block/platform/msm_sdcc.1/by-name/system 就是我們從上一步的輸出里得到的文件路徑肋杖。
查看連接過的 WiFi 密碼
cat /data/misc/wifi/*.conf
開啟/關(guān)閉 WiFi
adb shell svc wifi enable
adb shell svc wifi disable
查看實時資源占用情況
adb shell top