adb命令用法整理

Android Debug Bridge:android調試橋,通常位于sdk的platform-toor文件夾下。

ADB架構

adb是一個C/S架構的應用程序,由三部分組成:

  1. 客戶端,運行在開發者的pc端,使用adb命令調用。運行后會嘗試定位主機上的adb服務器,如果沒有則啟動一個adb服務器。
  2. 服務器,運行在開發者pc端的一個后臺進程,作用在于監測usb端口的感知設備的連接和拔出;管理客戶端和守護進程之間的通信,將客戶端的請求通過usb或者tcp的方式發送到設備端的守護進程(常駐進程)adbd中。
  3. adbd(adb demon),運行在每個設備端后臺的一個守護進程(常駐進程),作用是用于連接adb服務器,當adbd與服務器連接后,客戶端就可以想adb服務器發送服務請求了。

adb的工作原理

  1. 在pc端運行adb命令啟動時,客戶端先監測服務器進程是否運行,否則啟動,服務器在啟動后與本地 tcp的5037端口綁定,通過該端口監聽客戶端發出的命令,也可以通過adb -P <port> start-server指定固定端口。
  2. 服務器與設備端連接,服務器通過掃描5555到5585之間的奇數端口查找模擬器,服務器發現adbd(守護進程)后便于之連接。
    note:每個模擬器都使用一對按順序排列的端口,偶數端口連接控制臺,奇數端口連接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 的基礎上可以加一些參數進行過濾查看不同的列表,支持的過濾參數如下:
所有應用
-f顯示應用關聯的 apk 文件
-d只顯示 disabled 的應用
-e只顯示 enabled 的應用
-s只顯示系統應用
-3只顯示第三方應用
-i顯示應用的 installer
-u包含已卸載應用
<FILTER>包名包含 <FILTER> 字符串

安裝APK

adb install 后面可以跟一些可選參數來控制安裝 APK 的行為,可用參數及含義如下:
-l將應用安裝到保護目錄 /mnt/asec
-r允許覆蓋安裝
-t允許安裝 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的應用
-s將應用安裝到 sdcard
-d允許降級覆蓋安裝
-g授予所有運行時權限

常見安裝失敗輸出代碼、含義及可能的解決辦法如下:
INSTALL_FAILED_ALREADY_EXISTS
應用已經存在,或卸載了但沒卸載干凈;adb install 時使用 -r 參數,或者先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_INVALID_APK
無效的 APK 文件
INSTALL_FAILED_INVALID_URI
無效的 APK 文件名;確保 APK 文件名里無中文
INSTALL_FAILED_INSUFFICIENT_STORAGE
空間不足;清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE
已經存在同名程序
INSTALL_FAILED_NO_SHARED_USER
請求的共享用戶不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE
以前安裝過同名應用,但卸載時數據沒有移除;或者已安裝該應用,但簽名不一致;先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
請求的共享用戶存在但簽名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY
安裝包使用了設備上不可用的共享庫
INSTALL_FAILED_REPLACE_COULDNT_DELETE
替換時無法刪除
INSTALL_FAILED_DEXOPT
dex 優化驗證失敗或空間不足
INSTALL_FAILED_OLDER_SDK
設備系統版本低于應用要求
INSTALL_FAILED_CONFLICTING_PROVIDER
設備里已經存在與應用里同名的 content provider
INSTALL_FAILED_NEWER_SDK
設備系統版本高于應用要求
INSTALL_FAILED_TEST_ONLY
應用是 test-only 的,但安裝時沒有指定 -t 參數
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
包含不兼容設備 CPU 應用程序二進制接口的 native code
INSTALL_FAILED_MISSING_FEATURE
應用使用了設備不可用的功能
INSTALL_FAILED_CONTAINER_ERROR
sdcard 訪問失敗; 應用簽名與 ROM 簽名一致,被當作內置應用。確認 sdcard 可用,或者安裝到內置存儲; 打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION
不能安裝到指定位置;應用簽名與 ROM 簽名一致,被當作內置應用。切換安裝位置,添加或刪除 -s 參數;打包時不與 ROM 使用相同簽名。
INSTALL_FAILED_MEDIA_UNAVAILABLE
安裝位置不可用,一般為 sdcard,確認 sdcard 可用或安裝到內置存儲
INSTALL_FAILED_VERIFICATION_TIMEOUT
驗證安裝包超時
INSTALL_FAILED_VERIFICATION_FAILURE
驗證安裝包失敗
INSTALL_FAILED_PACKAGE_CHANGED
應用與調用程序期望的不一致
INSTALL_FAILED_UID_CHANGED
以前安裝過該應用,與本次分配的 UID 不一致清除以前安裝過的殘留文件
INSTALL_FAILED_VERSION_DOWNGRADE
已經安裝了該應用更高版本
使用 -d 參數
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE
已安裝 target SDK 支持運行時權限的同名應用,要安裝的版本不支持運行時權限
INSTALL_PARSE_FAILED_NOT_APK
指定路徑不是文件,或不是以 .apk 結尾
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 文件時遇到結構性錯誤
INSTALL_PARSE_FAILED_MANIFEST_EMPTY
在 manifest 文件里找不到找可操作標簽(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR
因系統問題安裝失敗
INSTALL_FAILED_USER_RESTRICTED
用戶被限制安裝應用
INSTALL_FAILED_DUPLICATE_PERMISSION
應用嘗試定義一個已經存在的權限名稱
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
設備未授權允許調試
error: device not found
沒有連接成功的設備;先將設備與 adb 連接成功
protocol failure
設備已斷開連接;先將設備與 adb 連接成功
Unknown option: -s
Android 2.2 以下不支持安裝到 sdcard;不使用 -s 參數
No space left on device
空間不足;清理空間
Permission denied ... sdcard ...
sdcard 不可用
signatures do not match the previously installed version; ignoring!
已安裝該應用且簽名不一致;先卸載設備上的該應用,再安裝

adb install 內部原理簡介

adb install 實際是分三步完成:

  1. push apk 文件到 /data/local/tmp。
  2. 調用 pm install 安裝。
  3. 刪除 /data/local/tmp 下的對應 apk 文件。
    所以,必要的時候也可以根據這個步驟,手動分步執行安裝過程。
清除應用數據與緩存

adb shell pm clear <packagename>
<packagename> 表示應用名包,這條命令的效果相當于在設置里的應用信息界面點擊了「清除緩存」和「清除數據」。
實例:
adb shell pm clear com.qihoo360.mobilesafe

查看前臺 Activity

adb shell dumpsys activity activities | grep mFocusedActivity

查看正在運行的 Services

adb shell dumpsys activity services [<packagename>]
<packagename>參數不是必須的,指定<packagename>表示查看與某個包名相關的 Services,不指定表示查看所有 Services,<packagename> 不一定要給出完整的包名

查看應用詳細信息

adb shell dumpsys package <packagename>
輸出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝后的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。

與應用交互

主要是使用am <command>,常用<command>如下:
start [options] <INTENT>啟動 <INTENT> 指定的 Activity
startservice [options] <INTENT>啟動 <INTENT> 指定的 Service
broadcast [options] <INTENT>發送 <INTENT> 指定的廣播
force-stop <packagename>停止 <packagename> 相關的進程
<INTENT> 參數很靈活,和寫 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>主要是keyeventtext
keyevent的常用code如下:


內核日志

adb shell dmesg

IP 地址

每次想知道設備的 IP 地址的時候都得「設置」-「關于手機」-「狀態信息」-「IP地址」很煩對不對?通過 adb 可以方便地查看。
adb shell ifconfig | grep Mask

內存信息

adb shell cat /proc/meminfo

關閉 USB 調試模式

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 分區為可寫

需要root權限
先用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

開啟/關閉 WiFi

adb shell svc wifi enable
adb shell svc wifi disable

查看實時資源占用情況

adb shell top

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。