C# 實現的ADB連接 android

爲了公司調試部門的安裝需要,研究了一下C#調用adb各類指令和推送安裝包到安卓設備。同時回顧了下多年不用的Winform,花了1天時間寫了這個小程序,希望這個小軟件能幫助身邊和網絡上需要的朋友。

軟件界面

代碼:http://download.csdn.net/detail/zhongchengxi/9878659





以下內容選自互聯網

ADB,即 Android Debug Bridge,它是 Android開發/測試人員不可替代的強大工具,也是 Android設備玩家的好玩具。

注: 有部分命令的支持情況可能與 Android系統版本及定製 ROM 的實現有關。

基本用法

命令語法

adb 命令的基本語法如下:

adb [-d|-e|-s <serialNumber>] <command>

如果只有一個設備/模擬器連接時,可以省略掉[-d|-e|-s <serialNumber>] 這一部分,直接使用adb <command>

爲命令指定目標設備

如果有多個設備/模擬器連接,則需要爲命令指定目標設備。

參數

含義

-d

指定當前唯一通過 USB 連接的 Android設備爲命令目標

-e

指定當前唯一運行的模擬器爲命令目標

-s <serialNumber>

指定相應 serialNumber 號的設備/模擬器爲命令目標

在多個設備/模擬器連接的情況下較常用的是-s <serialNumber> 參數,serialNumber可以通過 adb devices命令獲取。如:

$ adb devices


List of devices attached

cf264b8f device

emulator-5554 device

10.129.164.6:5555 device

輸出裏的 cf264b8femulator-5554 10.129.164.6:5555即爲 serialNumber

比如這時想指定 cf264b8f這個設備來運行 adb 命令獲取屏幕分辨率:

adb -s cf264b8f shell wm size

又如想給 10.129.164.6:5555這個設備安裝應用(這種形式的 serialNumber 格式爲 <IP>:<Port>,一般爲無線連接的設備或 Genymotion等第三方 Android 模擬器):

adb -s 10.129.164.6:5555 install test.apk

遇到多設備/模擬器的情況均使用這幾個參數爲命令指定目標設備,下文中爲簡化描述,不再重複。

啓動/停止

啓動 adb server 命令:

adb start-server

(一般無需手動執行此命令,在運行 adb 命令時若發現 adb server沒有啓動會自動調起。)

停止 adb server 命令:

adb kill-server

查看 adb 版本

命令:

adb version

示例輸出:

Android Debug Bridge version 1.0.36

Revision 8f855a3d9b35-android

root 權限運行 adbd

adb 的運行原理是 PC端的 adb server 與手機端的守護進程 adbd建立連接,然後 PC 端的 adb client通過 adb server 轉發命令,adbd接收命令後解析運行。

所以如果 adbd 以普通權限執行,有些需要 root權限才能執行的命令無法直接用 adb xxx執行。這時可以 adb shell然後 su後執行命令,也可以讓 adbd root權限執行,這個就能隨意執行高權限命令了。

命令:

adb root

正常輸出:

restarting adbd as root

現在再運行 adb shell,看看命令行提示符是不是變成# 了?

有些手機 root 後也無法通過adb root 命令讓 adbd root 權限執行,比如三星的部分機型,會提示adbd cannot run as root in production builds,此時可以先安裝 adbd Insecure,然後adb root 試試。

相應地,如果要恢復 adbd 爲非 root權限的話,可以使用 adb unroot命令。

指定 adb server的網絡端口

命令:

adb -P <port> start-server

默認端口爲 5037

設備連接管理

查詢已連接設備/模擬器

命令:

adb devices

輸出示例:

List of devices attached

cf264b8f device

emulator-5554 device

10.129.164.6:5555 device

輸出格式爲 [serialNumber] [state]serialNumber即我們常說的 SNstate有如下幾種:

  • offline ——表示設備未連接成功或無響應。
  • device ——設備已連接。注意這個狀態並不能標識 Android 系統已經完全啓動和可操作,在設備啓動過程中設備實例就可連接到 adb,但啓動完畢後系統才處於可操作狀態。
  • no device —— 沒有設備/模擬器連接。

以上輸出顯示當前已經連接了三臺設備/模擬器,cf264b8femulator-5554 10.129.164.6:5555分別是它們的 SN。從emulator-5554 這個名字可以看出它是一個 Android模擬器,而 10.129.164.6:5555這種形爲 <IP>:<Port> serialNumber 一般是無線連接的設備或 Genymotion等第三方 Android 模擬器。

常見異常輸出:

  1. 沒有設備/模擬器連接成功。
    List of devices attached

  2. 設備/模擬器未連接到 adb或無響應。
    List of devices attached
  3. cf264b8f offline

USB 連接

通過 USB 連接來正常使用 adb需要保證幾點:

  1. 硬件狀態正常。
    包括 Android 設備處於正常開機狀態,USB連接線和各種接口完好。
  2. Android設備的開發者選項和 USB 調試模式已開啓。
    可以到「設置」-「開發者選項」-Android調試」查看。
    如果在設置裏找不到開發者選項,那需要通過一個彩蛋來讓它顯示出來:在「設置」-「關於手機」連續點擊「版本號」7次。
  3. 設備驅動狀態正常。
    這一點貌似在 Linux Mac OS X下不用操心,在 Windows 下有可能遇到需要安裝驅動的情況,確認這一點可以右鍵「計算機」-「屬性」,到「設備管理器」裏查看相關設備上是否有黃色感嘆號或問號,如果沒有就說明驅動狀態已經好了。否則可以下載一個手機助手類程序來安裝驅動先。
  4. 通過 USB線連接好電腦和設備後確認狀態。
    adb devices

    如果能看到
    xxxxxx device

    說明連接成功。

無線連接(需要藉助 USB線)

除了可以通過 USB 連接設備與電腦來使用 adb,也可以通過無線連接——雖然連接過程中也有需要使用 USB的步驟,但是連接成功之後你的設備就可以在一定範圍內擺脫 USB 連接線的限制啦!

操作步驟:

  1. Android設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi
  2. 將設備與電腦通過 USB線連接。
    應確保連接成功(可運行 adb devices看是否能列出該設備)。
  3. 讓設備在 5555 端口監聽 TCP/IP連接:
    adb tcpip 5555

  4. 斷開 USB 連接。
  5. 找到設備的 IP地址。
    一般能在「設置」-「關於手機」-「狀態信息」-IP地址」找到,也可以使用下文裏查看設備信息 - IP 地址一節裏的方法用 adb 命令來查看。
  6. 通過 IP地址連接設備。
    adb connect <device-ip-address>

    這裏的 <device-ip-address>就是上一步中找到的設備 IP 地址。
  7. 確認連接狀態。
    adb devices

    如果能看到
    <device-ip-address>:5555 device

    說明連接成功。

如果連接不了,請確認 Android 設備與電腦是連接到了同一個 WiFi,然後再次執行adb connect <device-ip-address> 那一步;

如果還是不行的話,通過 adb kill-server重新啓動 adb 然後從頭再來一次試試。

斷開無線連接

命令:

adb disconnect <device-ip-address>

無線連接(無需藉助 USB線)

注:需要 root權限。

上一節「無線連接(需要藉助 USB 線)」是官方文檔裏介紹的方法,需要藉助於 USB數據線來實現無線連接。

既然我們想要實現無線連接,那能不能所有步驟下來都是無線的呢?答案是能的。

  1. Android 設備上安裝一個終端模擬器。
    已經安裝過的設備可以跳過此步。我使用的終端模擬器下載地址是:Terminal Emulator for Android Downloads
  2. Android設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi
  3. 打開 Android設備上的終端模擬器,在裏面依次運行命令:
    su
  4. setprop service.adb.tcp.port 5555

  5. 找到 Android設備的 IP 地址。
    一般能在「設置」-「關於手機」-「狀態信息」-IP地址」找到,也可以使用下文裏查看設備信息 - IP 地址一節裏的方法用 adb 命令來查看。
  6. 在電腦上通過 adb IP 地址連接 Android設備。
    adb connect <device-ip-address>

    這裏的 <device-ip-address>就是上一步中找到的設備 IP 地址。
    如果能看到 connected to <device-ip-address>:5555這樣的輸出則表示連接成功。

節注一:

有的設備,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5步之前需要重啓 adbd 服務,在設備的終端模擬器上運行:

restart adbd

如果 restart 無效,嘗試以下命令:

start adbd

stop adbd

應用管理

查看應用列表

查看應用列表的基本命令格式是

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>字符串

所有應用

命令:

adb shell pm list packages

輸出示例:

package:com.android.smoketest

package:com.example.android.livecubes

package:com.android.providers.telephony

package:com.google.android.googlequicksearchbox

package:com.android.providers.calendar

package:com.android.providers.media

package:com.android.protips

package:com.android.documentsui

package:com.android.gallery

package:com.android.externalstorage

...

// other packages here

...

系統應用

AGE

adb shell pm list packages -s第三方應用命令:ad

 shell pm list packages -3

包名包含某字符串的應用

比如要查看包名包含字符串 mazhuang的應用列表,命令:

adb shell pm list packages mazhuang

當然也可以使用 grep 來過濾:

adb shell pm list packages | grep mazhuang

安裝 APK

命令格式:

adb install [-lrtsdg] <path_to_apk>

參數:

adb install 後面可以跟一些可選參數來控制安裝 APK的行爲,可用參數及含義如下:

參數

含義

-l

將應用安裝到保護目錄 /mnt/asec

-r

允許覆蓋安裝

-t

允許安裝 AndroidManifest.xml application 指定android:testOnly="true" 的應用

-s

將應用安裝到 sdcard

-d

允許降級覆蓋安裝

-g

授予所有運行時權限

運行命令後如果見到類似如下輸出(狀態爲 Success)代表安裝成功:

[100%] /data/local/tmp/1.apk

pkg: /data/local/tmp/1.apk

Success

上面是當前最新版 v1.0.36 adb的輸出,會顯示 push apk 文件到手機的進度百分比。

使用舊版本 adb 的輸出則是這樣的:

12040 KB/s (22205609 bytes in 1.801s)

        pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk

Success

而如果狀態爲 Failure則表示安裝失敗,比如:

[100%] /data/local/tmp/map-20160831.apk

        pkg: /data/local/tmp/map-20160831.apk

Failure [INSTALL_FAILED_ALREADY_EXISTS]

常見安裝失敗輸出代碼、含義及可能的解決辦法如下:

輸出

含義

解決辦法

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

1. sdcard 訪問失敗; 2.應用簽名與 ROM 簽名一致,被當作內置應用

1. 確認 sdcard可用,或者安裝到內置存儲; 2. 打包時不與 ROM使用相同簽名

INSTALL_FAILED_INVALID_INSTALL_LOCATION

1. 不能安裝到指定位置; 2.應用簽名與 ROM 簽名一致,被當作內置應用

1. 切換安裝位置,添加或刪除-s 參數; 2.打包時不與 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 devicerm

空間不足

清理空間

Permission denied ... sdcard ...

sdcard 不可用


參考:PackageManager.java

adb install 內部原理簡介

adb install 實際是分三步完成:

  1. push apk 文件到 /data/local/tmp
  2. 調用 pm install 安裝。
  3. 刪除 /data/local/tmp 下的對應 apk文件。

所以,必要的時候也可以根據這個步驟,手動分步執行安裝過程。

卸載應用

命令:

adb uninstall [-k] <packagename>

<packagename> 表示應用的包名,-k參數可選,表示卸載應用但保留數據和緩存目錄。

命令示例:

adb uninstall com.qihoo360.mobilesafe

表示卸載 360 手機衛士。

清除應用數據與緩存

命令:

adb shell pm clear <packagename>

<packagename> 表示應用名包,這條命令的效果相當於在設置裏的應用信息界面點擊了「清除緩存」和「清除數據」。

命令示例:

adb shell pm clear com.qihoo360.mobilesafe

表示清除 360 手機衛士的數據和緩存。

查看前臺 Activity

命令:

adb shell dumpsys activity activities | grep mFocusedActivity

輸出示例:

mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}

其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher就是當前處於前臺的 Activity

查看正在運行的 Services

命令:

adb shell dumpsys activity services [<packagename>]

<packagename> 參數不是必須的,指定<packagename> 表示查看與某個包名相關的 Services,不指定表示查看所有 Services

<packagename> 不一定要給出完整的包名,比如運行adb shell dumpsys activity services org.mazhuang,那麼包名org.mazhuang.demo1org.mazhuang.demo2 org.mazhuang123等相關的 Services 都會列出來。

與應用交互

主要是使用 am <command>命令,常用的 <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

<INTENT> 裏還能帶數據,就像寫代碼時的 Bundle一樣:

參數

含義

--esn <EXTRA_KEY>

null 值(只有 key名)

`-e

--es <EXTRA_KEY> <EXTRA_STRING_VALUE>`

--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>

boolean

--ei <EXTRA_KEY> <EXTRA_INT_VALUE>

integer

--el <EXTRA_KEY> <EXTRA_LONG_VALUE>

long

--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE>

float

--eu <EXTRA_KEY> <EXTRA_URI_VALUE>

URI

--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>

component name

kagename>命令示例:adb shell am force-stop com.qihoo360.mobilesafe

表示停止 360 安全衛士的一切進程與服務。

文件管理

複製設備裏的文件到電腦

命令:

adb pull <設備裏的文件路徑> [電腦上的目錄]


其中認複製到當前目錄。例:adb pull /sdcard/sr.mp4 ~/tmp/

*小技巧:*設備上的文件路可能需要 root 權限才能訪問,如果你的設備已經 root 過,可以先使用 adb shell 和 su 命令在 adbshell 裏獲取 root 權限後,先 cp /path/on/device /sdcard/filename 將文件複製到 sdcard,然後 adb pull /sdcard/filename /path/on/pc。

複製電腦裏的文件到設備

命令:

adb push <電腦的文件路徑> <設備裏的目錄>

adb push ~/sr.mp4 /s:*設備上的文件路徑普通權限可能法直接寫入,如果你的設備已經 root 過,可以先 adb push /path/on/pc /sdcard/filename,然後 adb shell 和 su 在 adb shell 裏獲取 root 權限後,cp /sdcard/filename /path/on/device。

模擬按在 a

b shell 裏有個用的命令 input,通過它可以做一些有趣的事情。

input 命令的完整 help 信息如下:

Usage: input [<source>] <command> [<arg>...]


The s      mouse

      keyboard

      joystick

      touchnavigation

      touchpad

      trackball

      stylus

      dpad

      gesture

      touchscreen

      gamepad


The commands and default sources are:

      text <string> (Default: touchscreen)

      keyevent [--longpress] <key code number or name> ...(Default: keyboard)

      tap <x> <y> (Default: touchscreen)

      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)

      press (Default: trackball)

      roll <dx> <dy> (Default: trackball)

比如使用 adb shell input keyevent <keycode> 命令,ycode 能實現不同的功能,完整的 keycode 列表詳見 KeyEvent,摘引部分我覺得有意思的如下

keycode


      roll <dx> <dy> (Default: trackball)
比如使用 adb shell input keyevent <keycode>命令,不同的 keycode 能實現不同的功能,完整的 keycode列表詳見 KeyEvent,摘引部分我覺得有意思的如下:
keycode
含義
3
HOME 鍵
4
返回鍵
5
打開撥號應用
6
掛斷電話
24
增加音量
25
降低音量
26
電源鍵
27
拍照(需要在相機應用裏)
64
打開瀏覽器
82
菜單鍵
85
播放/暫停
86
停止播放
87
播放下一首
88
播放上一首
122
移動光標到行首或列表頂部
123
移動光標到行末或列表底部
126
恢復播放
127
暫停播放
164
靜音
176
打開系統設置
187
切換應用
207
打開聯繫人
208
打開日曆
209
打開音樂
210
打開計算器
220
降低屏幕亮度
221
提高屏幕亮度
223
系統休眠
224
點亮屏幕
231
打開語音助手
276
如果沒有 wakelock 則讓系統休眠
下面是 input命令的一些用法舉例。

電源鍵

命令:

adb shell input keyevent 26

執行效果相當於按電源鍵。

菜單鍵

命令:

adb shell input keyevent 82

HOME

命令:

adb shell input keyevent 3

返回鍵

命令:

adb shell input keyevent 4

音量控制

增加音量:

adb shell input keyevent 24

降低音量:

adb shell input keyevent 25

靜音:

adb shell input keyevent 164

媒體控制

播放/暫停:

adb shell input keyevent 85

停止播放:

adb shell input keyevent 86

播放下一首:

adb shell input keyevent 87

播放上一首:

adb shell input keyevent 88

恢復播放:

adb shell input keyevent 126

暫停播放:

adb shell input keyevent 127

點亮/熄滅屏幕

可以通過上文講述過的模擬電源鍵來切換點亮和熄滅屏幕,但如果明確地想要點亮或者熄滅屏幕,那可以使用如下方法。

點亮屏幕:

adb shell input keyevent 224

熄滅屏幕:

adb shell input keyevent 223

滑動解鎖

如果鎖屏沒有密碼,是通過滑動手勢解鎖,那麼可以通過 input swipe 來解鎖。

命令(參數以機型 Nexus 5,向上滑動手勢解鎖舉例):

adb shell input swipe 300 1000 300 500

參數 300 1000 300 500分別表示起始點x座標起始點y座標結束點x座標結束點y座標。

輸入文本

在焦點處於某文本框時,可以通過 input命令來輸入文本。

命令:

adb shell input text hello

現在 hello出現在文本框了。

查看日誌

Android 系統的日誌分爲兩部分,底層的 Linux內核日誌輸出到 /proc/kmsgAndroid的日誌輸出到 /dev/log

Android 日誌

命令格式:

[adb] logcat [<option>] ... [<filter-spec>] ...

常用用法列舉如下:

按級別過濾日誌

Android 的日誌分爲如下幾個優先級(priority):

  • V —— Verbose(最低,輸出得最多)
  • D —— Debug
  • I —— Info
  • W —— Warning
  • E —— Error
  • F —— Fatal
  • S —— Silent(最高,啥也不輸出)

按某級別過濾日誌則會將該級別及以上的日誌輸出。

比如,命令:

adb logcat *:W

會將 WarningErrorFatal Silent 日誌輸出。

注: macOS下需要給 *:W這樣以 *作爲 tag 的參數加雙引號,如adb logcat "*:W",不然會報錯no matches found: *:W。)

tag 和級別過濾日誌

<filter-spec> 可以由多個<tag>[:priority] 組成。

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S

表示輸出 tag ActivityManager Info 以上級別日誌,輸出 tagMyApp Debug以上級別日誌,及其它 tag Silent級別日誌(即屏蔽其它 tag 日誌)。

日誌格式

可以用 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

清空日誌

adb logcat -c

內核日誌

命令:

adb shell dmesg

輸出示例:

<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs

<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs

<6>[14201.753642] PM: resume of devices complete after 68.106 msecs

<4>[14201.755954] Restarting tasks ... done.

<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC

<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC

<6>[14201.872498] PM: Syncing filesystems ... done.

中括號裏的 [14201.684016]代表內核開始啓動後的時間,單位爲秒。

通過內核日誌我們可以做一些事情,比如衡量內核啓動時間,在系統啓動完畢後的內核日誌裏找到Freeing init memory 那一行前面的時間就是。

查看設備信息

型號

命令:

adb shell getprop ro.product.model

輸出示例:

Nexus 5

電池狀況

命令:

adb shell dumpsys battery

輸入示例:

Current Battery Service state:

  AC powered: false

  USB powered: true

  Wireless powered: false

  status: 2

  health: 2

  present: true

  level: 44

  scale: 100

  voltage: 3872

  temperature: 280

  technology: Li-poly

其中 scale代表最大電量,level 代表當前電量。上面的輸出表示還剩下 44% 的電量。

屏幕分辨率

命令:

adb shell wm size

輸出示例:

Physical size: 1080x1920

該設備屏幕分辨率爲 1080px * 1920px

如果使用命令修改過,那輸出可能是:

Physical size: 1080x1920

Override size: 480x1024

表明設備的屏幕分辨率原本是 1080px * 1920px,當前被修改爲 480px * 1024px

屏幕密度

命令:

adb shell wm density

輸出示例:

Physical density: 420

該設備屏幕密度爲 420dpi

如果使用命令修改過,那輸出可能是:

Physical density: 480

Override density: 160

表明設備的屏幕密度原來是 480dpi,當前被修改爲 160dpi

顯示屏參數

命令:

adb shell dumpsys window displays

輸出示例:

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)

  Display: mDisplayId=0

    init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731

    deferred=false layoutNeeded=false

其中 mDisplayId 顯示屏編號,init是初始分辨率和屏幕密度,app的高度比 init裏的要小,表示屏幕底部有虛擬按鍵,高度爲 1920 - 1794 = 126px 42dp

android_id

命令:

adb shell settings get secure android_id

輸出示例:

51b6be48bac8c569

IMEI

Android 4.4 及以下版本可通過如下命令獲取 IMEI

adb shell dumpsys iphonesubinfo

輸出示例:

Phone Subscriber Info:

  Phone Type = GSM

  Device ID = 860955027785041

其中的 Device ID就是 IMEI

而在 Android 5.0 及以上版本里這個命令輸出爲空,得通過其它方式獲取了(需要 root權限):

adb shell

su

service call iphonesubinfo 1

輸出示例:

Result: Parcel(

  0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'

  0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'

  0x00000020: 00340030 00000031                   '0.4.1...        ')

把裏面的有效內容提取出來就是 IMEI 了,比如這裏的是860955027785041

參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop

Android 系統版本

命令:

adb shell getprop ro.build.version.release

輸出示例:

5.0.2

IP 地址

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

命令:

adb shell ifconfig | grep Mask

輸出示例:

inet addr:10.130.245.230  Mask:255.255.255.252

inet addr:127.0.0.1  Mask:255.0.0.0

那麼 10.130.245.230就是設備 IP 地址。

在有的設備上這個命令沒有輸出,如果設備連着 WiFi,可以使用如下命令來查看局域網 IP

adb shell ifconfig wlan0

輸出示例:

wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]

wlan0     Link encap:UNSPEC

          inet addr:10.129.168.57  Bcast:10.129.175.255  Mask:255.255.240.0

          inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:496520 errors:0 dropped:0 overruns:0 frame:0

          TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:3000

          RX bytes:116266821 TX bytes:8311736

如果以上命令仍然不能得到期望的信息,那可以試試以下命令(部分系統版本里可用):

adb shell netcfg

輸出示例:

wlan0    UP                               10.129.160.99/20  0x00001043 f8:a9:d0:17:42:4d

lo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00

p2p0     UP                                     0.0.0.0/0   0x00001003 fa:a9:d0:17:42:4d

sit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00

rmnet0   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet1   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet3   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet2   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet4   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet6   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet5   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rmnet7   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

rev_rmnet3 DOWN                                   0.0.0.0/0   0x00001002 4e:b7:e4:2e:17:58

rev_rmnet2 DOWN                                   0.0.0.0/0   0x00001002 4e:f0:c8:bf:7a:cf

rev_rmnet4 DOWN                                   0.0.0.0/0   0x00001002 a6:c0:3b:6b:c4:1f

rev_rmnet6 DOWN                                   0.0.0.0/0   0x00001002 66:bb:5d:64:2e:e9

rev_rmnet5 DOWN                                   0.0.0.0/0   0x00001002 0e:1b:eb:b9:23:a0

rev_rmnet7 DOWN                                   0.0.0.0/0   0x00001002 7a:d9:f6:81:40:5a

rev_rmnet8 DOWN                                   0.0.0.0/0   0x00001002 4e:e2:a9:bb:d0:1b

rev_rmnet0 DOWN                                   0.0.0.0/0   0x00001002 fe:65:d0:ca:82:a9

rev_rmnet1 DOWN                                   0.0.0.0/0   0x00001002 da:d8:e8:4f:2e:fe

可以看到網絡連接名稱、啓用狀態、IP 地址和 Mac地址等信息。

Mac 地址

命令:

adb shell cat /sys/class/net/wlan0/address

輸出示例:

f8:a9:d0:17:42:4d

這查看的是局域網 Mac 地址,移動網絡或其它連接的信息可以通過前面的小節「IP地址」裏提到的 adb shell netcfg命令來查看。

CPU 信息

命令:

adb shell cat /proc/cpuinfo

輸出示例:

Processor       : ARMv7 Processor rev 0 (v7l)

processor       : 0

BogoMIPS        : 38.40


processor       : 1

BogoMIPS        : 38.40


processor       : 2

BogoMIPS        : 38.40


processor       : 3

BogoMIPS        : 38.40


Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt

CPU implementer : 0x51

CPU architecture: 7

CPU variant     : 0x2

CPU part        : 0x06f

CPU revision    : 0


Hardware        : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)

Revision        : 000b

Serial          : 0000000000000000

這是 Nexus 5 CPU信息,我們從輸出裏可以看到使用的硬件是 Qualcomm MSM 8974processor的編號是 0 3,所以它是四核的,採用的架構是ARMv7 Processor rev 0 (v71)

內存信息

命令:

adb shell cat /proc/meminfo

輸出示例:

MemTotal:        1027424 kB

MemFree:          486564 kB

Buffers:           15224 kB

Cached:            72464 kB

SwapCached:        24152 kB

Active:           110572 kB

Inactive:         259060 kB

Active(anon):      79176 kB

Inactive(anon):   207736 kB

Active(file):      31396 kB

Inactive(file):    51324 kB

Unevictable:        3948 kB

Mlocked:               0 kB

HighTotal:        409600 kB

HighFree:         132612 kB

LowTotal:         617824 kB

LowFree:          353952 kB

SwapTotal:        262140 kB

SwapFree:         207572 kB

Dirty:                 0 kB

Writeback:             0 kB

AnonPages:        265324 kB

Mapped:            47072 kB

Shmem:              1020 kB

Slab:              57372 kB

SReclaimable:       7692 kB

SUnreclaim:        49680 kB

KernelStack:        4512 kB

PageTables:         5912 kB

NFS_Unstable:          0 kB

Bounce:                0 kB

WritebackTmp:          0 kB

CommitLimit:      775852 kB

Committed_AS:   13520632 kB

VmallocTotal:     385024 kB

VmallocUsed:       61004 kB

VmallocChunk:     209668 kB

其中,MemTotal就是設備的總內存,MemFree是當前空閒內存。

更多硬件與系統屬性

設備的更多硬件與系統屬性可以通過如下命令查看:

adb shell cat /system/build.prop

這會輸出很多信息,包括前面幾個小節提到的「型號」和「Android系統版本」等。

輸出裏還包括一些其它有用的信息,它們也可通過 adb shell getprop <屬性名>命令單獨查看,列舉一部分屬性如下:

屬性名

含義

ro.build.version.sdk

SDK 版本

ro.build.version.release

Android 系統版本

ro.build.version.security_patch

Android 安全補丁程序級別

ro.product.model

型號

ro.product.brand

品牌

ro.product.name

設備名

ro.product.board

處理器型號

ro.product.cpu.abilist

CPU 支持的 abi列表[節注一]

persist.sys.isUsbOtgEnabled

是否支持 OTG

dalvik.vm.heapsize

每個應用程序的內存上限

ro.sf.lcd_density

屏幕密度

節注一:

一些小廠定製的 ROM 可能修改過 CPU支持的 abi 列表的屬性名,如果用ro.product.cpu.abilist 屬性名查找不到,可以這樣試試:

adb shell cat /system/build.prop | grep ro.product.cpu.abi

示例輸出:

ro.product.cpu.abi=armeabi-v7a

ro.product.cpu.abi2=armeabi

修改設置

注: 修改設置之後,運行恢復命令有可能顯示仍然不太正常,可以運行adb reboot 重啓設備,或手動重啓。

修改設置的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db裏存放的設置值。

分辨率

命令:

adb shell wm size 480x1024

表示將分辨率修改爲 480px * 1024px

恢復原分辨率命令:

adb shell wm size reset

屏幕密度

命令:

adb shell wm density 160

表示將屏幕密度修改爲 160dpi

恢復原屏幕密度命令:

adb shell wm density reset

顯示區域

命令:

adb shell wm overscan 0,0,0,200

四個數字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 200px留白。

恢復原顯示區域命令:

adb shell wm overscan reset

關閉 USB 調試模式

命令:

adb shell settings put global adb_enabled 0

恢復:

用命令恢復不了了,畢竟關閉了 USB 調試 adb就連接不上 Android 設備了。

去設備上手動恢復吧:「設置」-「開發者選項」-Android調試」。

狀態欄和導航欄的顯示隱藏

本節所說的相關設置對應 Cyanogenmod 裏的「擴展桌面」。

命令:

adb shell settings put global policy_control <key-values>

<key-values> 可由如下幾種鍵及其對應的值組成,格式爲<key1>=<value1>:<key2>=<value2>

key

含義

immersive.full

同時隱藏

immersive.status

隱藏狀態欄

immersive.navigation

隱藏導航欄

immersive.preconfirms

?

這些鍵對應的值可則如下值用逗號組合:

value

含義

apps

所有應用

*

所有界面

packagename

指定應用

-packagename

排除指定應用

例如:

adb shell settings put global policy_control immersive.full=*

表示設置在所有界面下都同時隱藏狀態欄和導航欄。

adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3

表示設置在包名爲 com.package1 com.package2的應用裏隱藏狀態欄,在除了包名爲 com.package3的所有應用裏隱藏導航欄。

實用功能

屏幕截圖

截圖保存到電腦:

adb exec-out screencap -p > sc.png

如果 adb 版本較老,無法使用exec-out 命令,這時候建議更新 adb版本。無法更新的話可以使用以下麻煩點的辦法:

先截圖保存到設備裏:

adb shell screencap -p /sdcard/sc.png

然後將 png 文件導出到電腦:

adb pull /sdcard/sc.png

可以使用 adb shell screencap -h查看 screencap命令的幫助信息,下面是兩個有意義的參數及含義:

參數

含義

-p

指定保存文件爲 png 格式

-d display-id

指定截圖的顯示屏編號(有多顯示屏的情況下)

實測如果指定文件名以 .png結尾時可以省略 -p 參數;否則需要使用 -p參數。如果不指定文件名,截圖文件的內容將直接輸出到 stdout

另外一種一行命令截圖並保存到電腦的方法:

Linux Windows

adb shell screencap -p | sed "s/\r$//" > sc.png

Mac OS X

adb shell screencap -p | gsed "s/\r$//" > sc.png

這個方法需要用到 gnu sed 命令,在 Linux下直接就有,在 Windows Git安裝目錄的 bin 文件夾下也有。如果確實找不到該命令,可以下載sed for Windows並將 sed.exe 所在文件夾添加到 PATH環境變量裏。

而在 Mac 下使用系統自帶的 sed命令會報錯:

sed: RE error: illegal byte sequence

需要安裝 gnu-sed,然後使用 gsed命令:

brew install gnu-sed

錄製屏幕

錄製屏幕以 mp4 格式保存到 /sdcard

adb shell screenrecord /sdcard/filename.mp4

需要停止時按 Ctrl-C,默認錄製時間和最長錄製時間都是 180秒。

如果需要導出到電腦:

adb pull /sdcard/filename.mp4

可以使用 adb shell screenrecord --help查看 screenrecord命令的幫助信息,下面是常見參數及含義:

參數

含義

--size WIDTHxHEIGHT

視頻的尺寸,比如 1280x720,默認是屏幕分辨率。

--bit-rate RATE

視頻的比特率,默認是 4Mbps

--time-limit TIME

錄製時長,單位秒。

--verbose

輸出更多信息。

重新掛載 system分區爲可寫

注:需要 root權限。

/system 分區默認掛載爲只讀,但有些操作比如給 Android系統添加命令、刪除自帶應用等需要對 /system 進行寫操作,所以需要重新掛載它爲可讀寫。

步驟:

  1. 進入 shell 並切換到 root用戶權限。
    命令:
    adb shell
  2. su

  3. 查看當前分區掛載情況。
    命令:
    mount

    輸出示例:
    rootfs / rootfs ro,relatime 0 0
  4. tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
  5. devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
  6. proc /proc proc rw,relatime 0 0
  7. sysfs /sys sysfs rw,seclabel,relatime 0 0
  8. selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
  9. debugfs /sys/kernel/debug debugfs rw,relatime 0 0
  10. none /var tmpfs rw,seclabel,relatime,mode=770,gid=1000 0 0
  11. none /acct cgroup rw,relatime,cpuacct 0 0
  12. none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
  13. none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
  14. tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
  15. tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
  16. none /dev/memcg cgroup rw,relatime,memory 0 0
  17. none /dev/cpuctl cgroup rw,relatime,cpu 0 0
  18. none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
  19. none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
  20. none /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0
  21. /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
  22. /dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0
  23. /dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
  24. /dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
  25. /dev/block/platform/msm_sdcc.1/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0
  26. /dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
  27. /dev/fuse /mnt/shell/emulated/0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

    找到其中我們關注的帶 /system 的那一行:
    /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0

  28. 重新掛載。
    命令:
    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就是我們從上一步的輸出裏得到的文件路徑。

如果輸出沒有提示錯誤的話,操作就成功了,可以對 /system 下的文件爲所欲爲了。

查看連接過的 WiFi密碼

注:需要 root權限。

命令:

adb shell

su

cat /data/misc/wifi/*.conf

輸出示例:

network={

ssid="TP-LINK_9DFC"

scan_ssid=1

psk="123456789"

key_mgmt=WPA-PSK

group=CCMP TKIP

auth_alg=OPEN

sim_num=1

priority=13893

}


network={

ssid="TP-LINK_F11E"

psk="987654321"

key_mgmt=WPA-PSK

sim_num=1

priority=17293

}

ssid 即爲我們在 WLAN設置裏看到的名稱,psk 爲密碼,key_mgmt 爲安全加密方式。

設置系統日期和時間

注:需要 root權限。

命令:

adb shell

su

date -s 20160823.131500

表示將系統日期和時間更改爲 2016 08 23 13 15 00秒。

重啓手機

命令:

adb reboot

檢測設備是否已 root

命令:

adb shell

su

此時命令行提示符是 $則表示沒有 root 權限,是# 則表示已 root

使用 Monkey進行壓力測試

Monkey 可以生成僞隨機用戶事件來模擬單擊、觸摸、手勢等操作,可以對正在開發中的程序進行隨機壓力測試。

簡單用法:

adb shell monkey -p <packagename> -v 500

表示向 <packagename>指定的應用程序發送 500 個僞隨機事件。

Monkey 的詳細用法參考官方文檔

開啓/關閉 WiFi

注:需要 root權限。

有時需要控制設備的 WiFi 狀態,可以用以下指令完成。

開啓 WiFi

adb root

adb shell svc wifi enable

關閉 WiFi

adb root

adb shell svc wifi disable

若執行成功,輸出爲空;若未取得 root 權限執行此命令,將執行失敗,輸出Killed

刷機相關命令

重啓到 Recovery模式

命令:

adb reboot recovery

Recovery重啓到 Android

命令:

adb reboot

重啓到 Fastboot模式

命令:

adb reboot bootloader

通過 sideload更新系統

如果我們下載了 Android 設備對應的系統更新包到電腦上,那麼也可以通過 adb來完成更新。

Recovery 模式下更新爲例:

  1. 重啓到 Recovery模式。
    命令:
    adb reboot recovery

  2. 在設備的 Recovery界面上操作進入 Apply update-Apply from ADB
    注:不同的 Recovery 菜單可能與此有差異,有的是一級菜單就有Apply update from ADB
  3. 通過 adb上傳和更新系統。
    命令:
    adb sideload <path-to-update.zip>

更多 adb shell命令

Android 系統是基於 Linux內核的,所以 Linux 裏的很多命令在 Android裏也有相同或類似的實現,在 adb shell裏可以調用。本文檔前面的部分內容已經用到了 adb shell命令。

查看進程

命令:

adb shell ps

輸出示例:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME

root      1     0     8904   788   ffffffff 00000000 S /init

root      2     0     0      0     ffffffff 00000000 S kthreadd

...

u0_a71    7779  5926  1538748 48896 ffffffff 00000000 S com.sohu.inputmethod.sogou:classic

u0_a58    7963  5926  1561916 59568 ffffffff 00000000 S org.mazhuang.boottimemeasure

...

shell     8750  217   10640  740   00000000 b6f28340 R ps

各列含義:

列名

含義

USER

所屬用戶

PID

進程 ID

PPID

父進程 ID

NAME

進程名

查看實時資源佔用情況

命令:

adb shell top

輸出示例:

User 0%, System 6%, IOW 0%, IRQ 0%

User 3 + Nice 0 + Sys 21 + Idle 280 + IOW 0 + IRQ 0 + SIRQ 3 = 307


  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name

 8763  0   3% R     1  10640K   1064K  fg shell    top

  131  0   3% S     1      0K      0K  fg root     dhd_dpc

 6144  0   0% S   115 1682004K 115916K  fg system   system_server

  132  0   0% S     1      0K      0K  fg root     dhd_rxf

 1731  0   0% S     6  20288K    788K  fg root     /system/bin/mpdecision

  217  0   0% S     6  18008K    356K  fg shell    /sbin/adbd

 ...

 7779  2   0% S    19 1538748K  48896K  bg u0_a71   com.sohu.inputmethod.sogou:classic

 7963  0   0% S    18 1561916K  59568K  fg u0_a58   org.mazhuang.boottimemeasure

 ...

各列含義:

列名

含義

PID

進程 ID

PR

優先級

CPU%

當前瞬間佔用 CPU 百分比

S

進程狀態(R=運行,S=睡眠,T=跟蹤/停止,Z=殭屍進程)

#THR

線程數

VSS

Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)

RSS

Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)

PCY

調度策略優先級,SP_BACKGROUND/SPFOREGROUND

UID

進程所有者的用戶 ID

NAME

進程名

top 命令還支持一些命令行參數,詳細用法如下:

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]

    -m num  最多顯示多少個進程

    -n num  刷新多少次後退出

    -d num  刷新時間間隔(單位秒,默認值 5

    -s col  按某列排序(可用 col值:cpu, vss, rss, thr

    -t      顯示線程信息

    -h      顯示幫助文檔

其它

如下是其它常用命令的簡單描述,前文已經專門講過的命令不再額外說明:

命令

功能

cat

顯示文件內容

cd

切換目錄

chmod

改變文件的存取模式/訪問權限

df

查看磁盤空間使用情況

grep

過濾輸出

kill

殺死指定 PID 的進程

ls

列舉目錄內容

mount

掛載目錄的查看和管理

mv

移動或重命名文件

ps

查看正在運行的進程

rm

刪除文件

top

查看進程的資源佔用情況

常見問題

啓動 adb server失敗

出錯提示

error: protocol fault (couldn't read status): No error

可能原因

adb server 進程想使用的 5037端口被佔用。

解決方案

找到佔用 5037 端口的進程,然後終止它。以 Windows下爲例:

netstat -ano | findstr LISTENING


...

TCP    0.0.0.0:5037           0.0.0.0:0              LISTENING       1548

...

這裏 1548 即爲進程 ID,用命令結束該進程:

taskkill /PID 1548

然後再啓動 adb 就沒問題了。


代碼:http://download.csdn.net/detail/zhongchengxi/9878659

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章