[整理]ADB命令行学习笔记
global driver
# 元素定位
driver.find_element_by_id("id") # id定位
driver.find_element_by_name("name") # name定位
driver.find_element_by_link_text("text") # 鏈接名定位
driver.find_element_by_partial_link_text("text") # 通過元素部分可見鏈接文本定位
driver.find_element_by_tag_name("name") # 通過查找html的標簽名稱定位元素
driver.find_element_by_xpath("xpath") # 路徑定位
driver.find_element_by_class_name("android.widget.LinearLayout") # 類名定位
driver.find_element_by_css_selector("css") # css選擇器定位
# 元素集合復數定位
driver.find_elements_by_id("id") # id元素集合
driver.find_elements_by_name("name") # name元素集合
driver.find_elements_by_link_text("text") # 鏈接名元素集合
driver.find_elements_by_partial_link_text("text") # 部分元素可見鏈接集合
driver.find_elements_by_tag_name("name") # html標簽名集合
driver.find_elements_by_xpath("xpath") # 路徑定位集合
driver.find_elements_by_class_name("android.widget.LinearLayout") # 類名定位集合
driver.find_elements_by_css_selector("css") # css選擇器定位集合
# 輸入框輸入
driver.element.send_keys("中英")
# 鎖定屏幕
driver.lock(5)
# 把當前應用置于后臺
driver.background_app(5)
# 收起鍵盤
driver.hide_keyboard()
# 打開一個應用或者activity,僅安卓端
driver.start_activity('com.example.android.apis', '.Foo')
# 打開下拉通知欄 僅Android
driver.open_notifications()
# 拖動元素,將元素origin_el拖到目標元素destination_el
driver.drag_and_drop(self, origin_el, destination_el):
# 檢查app是否已安裝
driver.is_app_installed('com.example.android.apis')
# 安裝應用到設備
driver.install_app('path/to/my.apk')
# 刪除應用
driver.remove_app('com.example.android.apis')
# 模擬設備搖晃
driver.shake()
# 關閉應用
driver.close_app()
# 啟動 (Launch)
# 根據服務關鍵字 (desired capabilities) 啟動會話 (session) 。請注意這必須在設定 autoLaunch=false 關鍵字時才能生效。
# 這不是用于啟動指定的 app/activities ————你可以使用 start_activity 做到這個效果————
# 這是用來繼續進行使用了 autoLaunch=false 關鍵字時的初始化 (Launch) 流程的。
driver.launch_app()
# 應用重置,相當于重新卸載安裝
driver.reset()
# 可用上下文 (context) 列出所有的可用上下文
# 翻譯備注:context可以理解為 可進入的窗口 。例如,對于原生應用,可用的context和默認context均為NATIVE_APP。
# 詳情可查看對混合應用進行自動化測試
driver.contexts
# 列出當前上下文
driver.current_context
# 切換到默認的上下文 (context)
# 將上下文切換到默認上下文
driver.switch_to.context(None)
# 獲取應用的字符串
driver.app_strings
# 按鍵事件 (Key Event)給設備發送一個按鍵事件
driver.keyevent(176)
# 獲取當前的activity
driver.current_activity
# 觸摸動作(TouchAction) / 多點觸摸動作(MultiTouchAction)
action = TouchAction(driver)
action.press(element=el, x=10, y=10).release().perform()
# 滑動(Swipe)模擬用戶滑動
# 注意:appium滑動規則是x從左到右變大,y從上到下變大
driver.swipe(start=75, starty=500, endx=75, endy=0, duration=800)
# 捏 (Pinch)捏屏幕 (雙指往內移動來縮小屏幕)
driver.pinch(element=el)
# 放大 (Zoom)放大屏幕 (雙指往外移動來放大屏幕)
driver.zoom(element=el)
# 滑動到某個元素 (Scroll To)
todo: python
# 從設備中拉出文件 (Pull File)
driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')
# 推送文件到設備中去
data = "some data for the file"
path = "/data/local/tmp/file.txt"
driver.push_file(path, data.encode('base64'))
# 斷言
Assert.assertEquals("I am a div", div.getText()); //跳轉到指定頁面并在該頁面所以用元素id進行交互
# 檢查文本是否符合預期
assertEqual('I am a div', div.text)
# 輸入法是否有活動 返回真假
is_ime_active(self):
# 返回當前安卓設備可用的輸入法
driver.available_ime_engines(self):
# 激活安卓設備中的制定輸入法
driver.activate_ime_engine(self, engine):
# 關閉當前的輸入法(android)
driver.deactivate_ime_engine(self):
# 打開安卓設備上的位置定位設置
driver.toggle_location_services()
# 設置設備的經緯度
:Args:
- latitude緯度 - String or numeric value between -90.0 and 90.00
- longitude經度 - String or numeric value between -180.0 and 180.0
- altitude海拔高度- String or numeric value
用法 driver.set_location(緯度,經度,高度)
# 點擊
element.click()
# 清除元素內容
element.clear()
# 返回元素的文本內容
element.text()
# 提交表單
element.submit(self):
# 元素是否可用
element.is_enabled()
# 元素是否可選
element.is_slected()
# 元素是否可見
element.is_displayed()
# 獲取元素的大小(高和寬)
new_size["height"] = size["height"]
new_size["width"] = size["width"]
driver.element.size
# 獲取元素左上角的坐標
# 用法 driver.element.location
'''返回element的x坐標, int類型'''
driver.element.location.get('x')
'''返回element的y坐標, int類型'''
driver.element.location.get('y')
# 獲取當前元素的截圖為Base64編碼的字符串
img_b64 = element.screenshot_as_base64
# 執行JS
# 在當前窗口/框架(特指 Html 的 iframe )同步執行 javascript 代碼
driver.execute_script('document.title')
# 異步執行代碼,其他代碼在執行
driver.execute_async_script('document.title')
# 獲取當前url
driver.current_url
# 獲取頁面源
driver.page_source
# 關閉當前窗口
driver.close()
# 關閉應用
driver.quit()
# chrome上進行測試
{
'platformName': 'Android',
'platformVersion': '4.4',
'deviceName': 'Android Emulator',
'browserName': 'Chrome'
}
# 真機測試
{
'automationName': 'Selendroid',
'platformName': 'Android',
'platformVersion': '2.3',
'deviceName': 'Android Emulator',
'app': myApp,
'appPackage': 'com.mycompany.package',
'appActivity': '.MainActivity'
}
# 多點觸控
"""
規范中的可用事件有:
* 短按 (press)
* 釋放 (release)
* 移動到 (moveTo)
* 點擊 (tap)
* 等待 (wait)
* 長按 (longPress)
* 取消 (cancel)
* 執行 (perform)
"""
?
5.8 服務器參數
Appium 服務器參數
使用方法: node . [標志]
服務器標志
所有的標志都是可選的,但是有一些標志需要組合在一起才能生效。
<expand_table>
標志 默認值 描述 例子
--shell null 進入 REPL 模式
--localizable-strings-dir en.lproj IOS only: 定位 .strings所在目錄的相對路徑 --localizable-strings-dir en.lproj
--app null iOS: 基于模擬器編譯的 app 的絕對路徑或者設備目標的 bundle_id; Android: apk 文件的絕對路徑--app /abs/path/to/my.app
--ipa null (IOS-only) .ipa 文件的絕對路徑 --ipa /abs/path/to/my.ipa
-U, --udid null 連接物理設備的唯一設備標識符 --udid 1adsf-sdfas-asdf-123sdf
-a, --address 0.0.0.0 監聽的 ip 地址 --address 0.0.0.0
-p, --port 4723 監聽的端口 --port 4723
-ca, --callback-address null 回調IP地址 (默認: 相同的IP地址) --callback-address 127.0.0.1
-cp, --callback-port null 回調端口號 (默認: 相同的端口號) --callback-port 4723
-bp, --bootstrap-port 4724 (Android-only) 連接設備的端口號 --bootstrap-port 4724
-k, --keep-artifacts false 棄用,無效。trace信息現在保留tmp目錄下,每次運行前會清除該目錄中的信息。 也可以參考 --trace-dir 。
-r, --backend-retries 3 (iOS-only) 遇到 crash 或者 超時,Instrument 重新啟動的次數。 --backend-retries 3
--session-override false 允許 session 被覆蓋 (沖突的話)
--full-reset false (iOS) 刪除整個模擬器目錄。 (Android) 通過卸載應用(而不是清除數據)重置應用狀態。在 Android 上,session 完成后也會刪除應用。
--no-reset false session 之間不重置應用狀態 (iOS: 不刪除應用的 plist 文件; Android: 在創建一個新的 session 前不刪除應用。)
-l, --pre-launch false 在第一個 session 前,預啟動應用 (iOS 需要 --app 參數,Android 需要 --app-pkg 和 --app-activity)
-lt, --launch-timeout 90000 (iOS-only) 等待 Instruments 啟動的時間
-g, --log null 將日志輸出到指定文件 --log /path/to/appium.log
--log-level debug 日志級別; 默認 (console[:file]): debug[:debug] --log-level debug
--log-timestamp false 在終端輸出里顯示時間戳
--local-timezone false 使用本地時間戳
--log-no-colors false 不在終端輸出中顯示顏色
-G, --webhook null 同時發送日志到 HTTP 監聽器 --webhook localhost:9876
--native-instruments-lib false (IOS-only) iOS 內建了一個怪異的不可能避免的延遲。我們在 Appium 里修復了它。如果你想用原來的,你可以使用這個參數。
--app-pkg null (Android-only) 你要運行的apk的java包。 (例如, com.example.android.myApp) --app-pkg com.example.android.myApp
--app-activity null (Android-only) 打開應用時,啟動的 Activity 的名字(比如, MainActivity) --app-activity MainActivity
--app-wait-package false (Android-only) 你想等待的 Activity 的包名。(比如, com.example.android.myApp) --app-wait-package com.example.android.myApp
--app-wait-activity false (Android-only) 你想等待的 Activity 名字(比如, SplashActivity) --app-wait-activity SplashActivity
--android-coverage false (Android-only) 完全符合條件的 instrumentation 類。 作為命令 adb shell am instrument -e coverage true -w 的 -w 的參數 --android-coverage com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation
--avd null (Android-only) 要啟動的 avd 的名字
--avd-args null (Android-only) 添加額外的參數給要啟動avd --avd-args -no-snapshot-load
--device-ready-timeout 5 (Android-only) 等待設備準備好的時間,以秒為單位 --device-ready-timeout 5
--safari false (IOS-Only) 使用 Safari 應用
--device-name null 待使用的移動設備名字 --device-name iPhone Retina (4-inch), Android Emulator
--platform-name null 移動平臺的名稱: iOS, Android, or FirefoxOS --platform-name iOS
--platform-version null 移動平臺的版本 --platform-version 7.1
--automation-name null 自動化工具的名稱: Appium or Selendroid --automation-name Appium
--browser-name null 移動瀏覽器的名稱: Safari or Chrome --browser-name Safari
--default-device, -dd false (IOS-Simulator-only) 使用instruments自己啟動的默認模擬器
--force-iphone false (IOS-only) 無論應用要用什么模擬器,強制使用 iPhone 模擬器
--force-ipad false (IOS-only) 無論應用要用什么模擬器,強制使用 iPad 模擬器
--language null iOS / Android 模擬器的語言 --language en
--locale null Locale for the iOS simulator / Android Emulator --locale en_US
--calendar-format null (IOS-only) iOS 模擬器的日基本用法
基本命令
adb基本命令,基本語法如下:
adb [-d|-e|-s <serialNumber>] <command>
復制代碼
如果當前連接只有一個設備,可以直接省略掉[-d|-e|-s <serialNumber>] 這一部分,直接使用 adb <comman。
為命令行指定目標設備
如果有多臺設備或模擬器連接,需要指定目標設備
參數 含義
-d 指定當前唯一通過 USB 連接的 Android 設備為命令目標
-e 指定當前唯一運行的模擬器為命令目標
-s <serialNumber> 指定相應 serialNumber 號的設備/模擬器為命令目標
在多個設備/模擬器連接的情況下較常用的是 -s 參數,serialNumber 可以通過 adb devices 命令獲取。如:
$ adb devices
List of devices attached
cf668fa device
emulator-555 device
196.168.1.150:5555 device
復制代碼
這里的cf668fa以及emulator-555和196.168.1.150:5555都稱為serialNumber。
停止/啟動
adb start-server
復制代碼
啟動adb,但是由于系統會自動啟動,無需主動調用
adb kill-server
復制代碼
停止adb,多用于PC存在多個adb時,全部關閉
查看adb的版本
adb version
復制代碼
運行后結果如下:
可見版本為1.0.40. 安裝地址在D:\SDK\platform-tools\adb.exe.但是需要在環境變量中配置adb的path路徑。
root權限
adb雖然可以用來做一些Root操作,但是前提是設備必須具備root權限,學習可以考慮用虛擬機。 命令:
adb root
復制代碼
恢復root:
adb unroot
復制代碼
設置adb的網絡端口
命令:
adb -P <port> start-server
復制代碼
這個幾乎很少使用,不知到具體用處,之后補充記錄
設備連接
查詢設備
查詢當前adb連接的設備信息
adb devices
復制代碼
List of devices attached
0000119030001002 device
復制代碼
輸出的組成格式為[serialNumber] [state],其中0000119030001002為設備編號SN,device為設備的狀態。設備的狀態可以分為以下幾種:
offline —— 表示設備未連接成功或無響應。
device —— 設備已連接。注意這個狀態并不能標識 Android 系統已經完全啟動和可操作,在設備啟動過程中設備實例就可連接到 adb,但啟動完畢后系統才處于可操作狀態。
no device —— 沒有設備/模擬器連接。
該命令為常用命令,多會使用。
USB連接
USB連接就是通過USB線,以及adb來連接Android設備,也是開發工作中使用得最多的連接方式。一般手機需要打開[ 設置」-「開發者選項」-「Android 調試」。如果沒有該選項,可以到「設置」-「關于手機」連續點擊「版本號」可以打開開發者選項。
USB無線
其實除了USB連接設備外,還可以通過無線網的方式連接,雖然開始需要USB線連接,但是想想可以離開USB線的限制,是不是也有一點小激動呢。操作步驟如下
首先,確認PC和設備是處于同一局域網下,比如同一個路由下的wiffi。這是非常重要的。
其次,將PC和設備通過USB連接在一起,通過adb devices確認是否連接成功.
然后,讓設備在555端口監聽TCP/IP 連接,當然部分特殊設備端口不是555,酌情調整:
adb tcpip 555
復制代碼
之后,斷開USB線連接
通過手機自身的設置」-「關于手機」-「狀態信息」-「IP地址」或者(推薦后者)通過adb命令去獲取設備的ip地址adb shell ifconfig | grep Mask.
使用命令行和得到的IP地址連接設備
adb connect <device-ip-address>
復制代碼
<device-ip-address>也就是之前找到的ip地址.
最后,使用adb devices檢測是否成功連接設備
無線連接(root)
無線連接的首要條件就是需要root權限.所以一開始就是adb root開啟root權限。然后操作步驟與USB一樣,但是無需連接USB線。 將 Android 設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi。
首先,打開 Android 設備上的終端模擬器,在里面依次運行命令:
su
setprop service.adb.tcp.port 5555
復制代碼
再者,通過手機自身的設置」-「關于手機」-「狀態信息」-「IP地址」或者(推薦后者)通過adb命令去獲取設備的ip地址adb shell ifconfig | grep Mask.
最后,在電腦上通過 adb 和 IP 地址連接 Android 設備。
adb connect <device-ip-address>
復制代碼
這里的<device-ip-address> 就是上一步中找到的設備 IP 地址。
如果能看到 connected to <device-ip-address>:端口 這樣的輸出則表示連接成功。
Package管理
查閱應用列表
查閱應用列表的adb命令行模式如下:
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
復制代碼
前部分adb shell pm list packages為獲取當前設備中所有應用的package信息,后面為過濾符。其中支持的過濾參數列表整理如下:
參數 顯示列表
無 所有應用
-f 顯示應用關聯的 apk 文件
-d 只顯示 disabled 的應用
-e 只顯示 enabled 的應用
-s 只顯示系統應用
-3 只顯示第三方應用
-i 顯示應用的 installer
-u 包含已卸載應用
<FILTER> 包名包含 <FILTER> 字符串
ps:<FILTER>除了直接可以過濾外,還可以使用grep做篩選 比如:
adb shell pm list packages clouwalk
復制代碼
與
adb shell pm list packages |grep cloudwalk
復制代碼
(部分設備不支持)
安裝應用
安裝應用為常用的adb命令行,其格式如下:
adb install [-xxx] <apk_path>
復制代碼
其中xxx為修飾參數,用來指定應用apk的安裝方式,具體可以有以下幾種修飾方式:
參數 含義
-l 將應用安裝到保護目錄 /mnt/asec
-r 允許覆蓋安裝
-t 允許安裝 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的應用
-s 將應用安裝到 sdcard
-d 允許降級覆蓋安裝
-g 授予所有運行時權限
出現如Success標識,代表安裝成功。出現Failure [xxx],代表失敗.常見的失敗選項如下:
輸出 含義 解決方法
INSTALL_FAILED_ALREADY_EXISTS 應用已經存在,或卸載了但沒卸載干凈 adb install 時使用 -r 參數,或者先 adb uninstall <packagename> 再安裝
INSTALL_FAILED_INVALID_APK 無效的 APK 文件 檢查apk文件的完整性和有效性
INSTALL_FAILED_INVALID_URI 無效的 APK 文件名 確保 APK 命名文件名里無中文或特殊字符
INSTALL_FAILED_INSUFFICIENT_STORAGE 空間不足 清理空間
INSTALL_FAILED_DUPLICATE_PACKAGE 已經存在同名程序 更改應用名或adb uninstall <packagename> 再安裝
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 用戶被限制安裝應用 在開發者選項里將「USB安裝」打開,如果已經打開了,那先關閉再打開。
INSTALL_FAILED_DUPLICATE_PERMISSION 應用嘗試定義一個已經存在的權限名稱
INSTALL_FAILED_NO_MATCHING_ABIS 應用包含設備的應用程序二進制接口不支持的 native code
INSTALL_CANCELED_BY_USER 應用安裝需要在設備上確認,但未操作設備或點了取消 在設備上同意安裝
INSTALL_FAILED_ACWF_INCOMPATIBLE 應用程序與設備不兼容
INSTALL_FAILED_TEST_ONLY APK 文件是使用 Android Studio 直接 RUN 編譯出來的文件 通過 Gradle 的 assembleDebug 或 assembleRelease 重新編譯,或者 Generate Signed APK
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! 已安裝該應用且簽名不一致 先卸載設備上的該應用,再安裝
參考:PackageManager.java adb install 實際是分三步完成:
push apk 文件到 /data/local/tmp。
調用 pm install 安裝。
刪除 /data/local/tmp 下的對應 apk 文件。
所以,必要的時候也可以根據這個步驟,手動分步執行安裝過程。
卸載應用
命令:
adb uninstall [-k] <packagename>
復制代碼
<packagename> 表示應用的包名,-k參數可選,表示卸載應用但保留數據和緩存目錄。
命令示例:
adb uninstall com.qihoo360.mobilesafe
復制代碼
表示卸載設備上的360 手機衛士。
清除應用數據和緩存數據
adb shell pm clear <packagename>
復制代碼
例如:
adb shell pm clear com.tecent.mobleqq
復制代碼
這個命令就可以清除掉手機QQ上所有的本地緩存數據和應用數據。這個命令為常用命令
查看正在運行的service
adb shell dumpsys activity services [<packagename>]
復制代碼
<packagename> 參數不是必須的,指定<packagename>表示查看與某個包名相關的 Services,不指定表示查看所有 Services。
<packagename> 不一定要給出完整的包名
查看應用詳細信息
adb shell dumpsys package <packagename>
復制代碼
輸出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安裝后的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。
<packagename> 表示應用包名。
查看應用安裝途徑
adb shell pm path <PACKAGE>
復制代碼
輸出應用安裝路徑.效果如下:
應用交互
與應用交互的關鍵字為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
啟動應用/ 調起 Activity
adb shell am start [options] <INTENT>
復制代碼
例如:
adb shell am start -n com.tencent.mm/.ui.LauncherUI
復制代碼
該命令可以啟動微信
啟動service
adb shell am startservice [options] <INTENT>
復制代碼
例如:
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
復制代碼
表示調起微信的某 Service。
另外一個典型的用例是如果設備上原本應該顯示虛擬按鍵但是沒有顯示,可以試試這個:
adb shell am startservice -n com.android.systemui/.SystemUIService
復制代碼
停止service
adb shell am stopservice [options] <INTENT>
復制代碼
發送廣播
adb shell am broadcast [options] <INTENT>
復制代碼
可以向所有組件廣播,也可以只向指定組件廣播。
例如,向所有組件廣播 BOOT_COMPLETED:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
復制代碼
又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 廣播 BOOT_COMPLETED:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceive
復制代碼
這類用法在測試的時候很實用,比如某個廣播的場景很難制造,可以考慮通過這種方式來發送廣播。 既能發送系統預定義的廣播,也能發送自定義廣播。如下是部分系統預定義廣播及正常觸發時機:
action 觸發時機
android.net.conn.CONNECTIVITY_CHANGE 網絡連接發生變化
android.intent.action.SCREEN_ON 屏幕點亮
android.intent.action.SCREEN_OFF 屏幕熄滅
android.intent.action.BATTERY_LOW 電量低,會彈出電量低提示框
android.intent.action.BATTERY_OKAY 電量恢復了
android.intent.action.BOOT_COMPLETED 設備啟動完畢
android.intent.action.DEVICE_STORAGE_LOW 存儲空間過低
android.intent.action.DEVICE_STORAGE_OK 存儲空間恢復
android.intent.action.PACKAGE_ADDED 安裝了新的應用
android.net.wifi.STATE_CHANGE WiFi 連接狀態發生變化
android.net.wifi.WIFI_STATE_CHANGED WiFi 狀態變為啟用/關閉/正在啟動/正在關閉/未知
android.intent.action.BATTERY_CHANGED 電池電量發生變化
android.intent.action.INPUT_METHOD_CHANGED 系統輸入法發生變化
android.intent.action.ACTION_POWER_CONNECTED 外部電源連接
android.intent.action.ACTION_POWER_DISCONNECTED 外部電源斷開連接
android.intent.action.DREAMING_STARTED 系統開始休眠
android.intent.action.DREAMING_STOPPED 系統停止休眠
android.intent.action.WALLPAPER_CHANGED 壁紙發生變化
android.intent.action.HEADSET_PLUG 插入耳機
android.intent.action.MEDIA_UNMOUNTED 卸載外部介質
android.intent.action.MEDIA_MOUNTED 掛載外部介質
android.os.action.POWER_SAVE_MODE_CHANGED 省電模式開啟
(以上廣播均可使用 adb 觸發)
強制停止應用
命令:
adb shell am force-stop 命令示例:
adb shell am force-stop com.qihoo360.mobilesafe 表示停止 360 安全衛士的一切進程與服務
文件管理
復制設備里的文件到本地
該命令為常用命令,多用于導出log日志和一些關鍵文件。
adb pull <設備里的文件路徑> [電腦上的目錄]
復制代碼
其中 電腦上的目錄 參數可以省略,默認復制到當前目錄。
復制電腦上的文件到設備
adb push <電腦上的文件路徑> <設備里的目錄>
復制代碼
其中電腦上的文件路徑既可以是絕對路徑也可以是相對路徑。
模擬按鍵輸入
在某些測試情況下,可以通過編寫bat命令行來做相應的測試,這就需要模擬按鍵輸入。并且在一些特殊的設備,沒有物理按鍵的情況下,也需要模擬按鍵輸入。該命令在adb shell命令下的input下,在adb下使用help可以得到如下的信息:
Usage: input [<source>] <command> [<arg>...]
The sources are:
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 能實現不同的功能,完整的 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日志查看
從Android日志方面分為底層的 Linux 內核和Android 的日志。底層的 Linux 內核日志輸出到 /proc/kmsg,Android 的日志輸出到 /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
復制代碼
會將 Warning、Error、Fatal 和 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 以上級別日志,輸出 tag MyApp的 Debug 以上級別日志,及其它 tag 的 Silent 級別日志(即屏蔽其它 tag 日志)。
日志格式
清空日志
adb logcat -c
復制代碼
內核日志
adb shell dmesg
復制代碼
我這里運行結果如下:
[ 826.802773] init: Service 'mediacodec' (pid 241) killed by signal 6
[ 826.802849] init: Service 'mediacodec' (pid 241) killing any children in process group
[ 826.805858] init: Starting service 'mediacodec'...
[ 826.806083] rk-vcodec ff650000.vpu_service: closed
[ 826.808325] binder: send failed reply for transaction 291855 to 232:745
[ 826.866578] binder: 219:219 transaction failed 29189/0, size 96-0 line 2880
[ 2962.286136] hrtimer: interrupt took 228959 ns
復制代碼
[]中為運行的內核開始啟動后的時間,單位為秒。
查看設備信息
設備型號
adb shell getprop ro.product.model
復制代碼
我的為:
XiaoMi Note 3
復制代碼
設備電池狀態
adb shell dumpsys battery
復制代碼
該命令可以獲取設備的電池信息,結果如下:
Current Battery Service state:
AC powered: true
USB powered: false
Wireless powered: false
Max charging current: 0
Max charging voltage: 0
Charge counter: 0
status: 2
health: 2
present: true
level: 100
scale: 100
voltage: 0
temperature: 424
technology:
復制代碼
其中 scale 代表最大電量,level 代表當前電量,這里代表電量為滿電。
屏幕分辨率
adb shell wm size
復制代碼
設備結果:
Physical size: 1920x1080
復制代碼
該設備的物理分辨率為1920x1080.
屏幕密度
adb shell wm density
復制代碼
這個在定制開發的時候常用的參數,用來決定dp和px之間的參數比.結果格式:
Physical density: 320
復制代碼
該屏幕的密度為320dpi(Android設備基礎dpi為160dpi)
顯示屏參數
adb shell dumpsys window displays
復制代碼
結果:
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1920x1080 320dpi cur=1920x1080 app=1824x1080 rng=1080x1032-1824x1776
deferred=false layoutNeeded=false
復制代碼
mDisplayId為屏幕顯示id,init為屏幕分辨率,init 是初始分辨率和屏幕密度,app為可用界面,相當于排除非物理按鍵后的屏幕分辨率。
android_id
adb shell settings get secure android_id
復制代碼
結果:7b666149274fbd13 什么是android_id?google 原文 A hardware serial number, if available.(一個硬件的序列碼,如果有效的話)
IMEI(Device ID)
android 4.4及以下版本可以通過以下命令獲取IMEI值:
adb shell dumpsys iphonesubinfo
復制代碼
其中的 Device ID 就是IMEI。
而在 Android 5.0 及以上版本里這個命令輸出為空,得通過其它方式獲取了(需要 root 權限):
adb shell
su
service call iphonesubinfo 1
復制代碼
運行結果: Result: Parcel( 0x00000000: 00000000 0000000f 00360038 00370039 '........8.6.9.7.' 0x00000010: 00360035 00340030 00300033 00380030 '5.6.0.4.3.0.0.8.' 0x00000020: 00380037 00000035 '7.8.5... ') 其中有效數字就是IMEI值:869756043008785
Android系統版本
adb shell getprop ro.build.version.release
復制代碼
結果:7.1.2,這就是系統版本號
IP地址
每次想知道設備的 IP 地址的時候都得「設置」-「關于手機」-「狀態信息」-「IP地址」很煩對不對?通過 adb 可以方便地查看。
adb shell ifconfig
復制代碼
結果:
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:709503 errors:0 dropped:0 overruns:0 frame:0
TX packets:709503 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:75473583 TX bytes:75473583
復制代碼
這里的設備地址為:127.0.0.1(loacal地址)
Mac 地址
adb shell
cat /sys/class/net/wlan0/address
復制代碼
當然部分設備無法成功獲取
CPU 信息
adb shell
cat /proc/cpuinfo
復制代碼
結果:
processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 1
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 2
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 3
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 4
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 2
processor : 5
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd08
CPU revision : 2
Serial : d59a3c2fc7c848c4
復制代碼
可以分析出設備為6核。
內存信息
adb shell
cat /proc/meminfo
復制代碼
結果:
MemTotal: 2021484 kB
MemFree: 65888 kB
MemAvailable: 784708 kB
Buffers: 284 kB
Cached: 923468 kB
SwapCached: 196 kB
Active: 1154216 kB
Inactive: 526232 kB
Active(anon): 690720 kB
Inactive(anon): 229288 kB
Active(file): 463496 kB
Inactive(file): 296944 kB
Unevictable: 256 kB
Mlocked: 256 kB
SwapTotal: 520908 kB
SwapFree: 475536 kB
Dirty: 1764 kB
Writeback: 0 kB
AnonPages: 756924 kB
Mapped: 246860 kB
Shmem: 163312 kB
Slab: 92916 kB
SReclaimable: 41080 kB
SUnreclaim: 51836 kB
KernelStack: 13760 kB
PageTables: 16476 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1531648 kB
Committed_AS: 63485416 kB
VmallocTotal: 258867136 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
CmaTotal: 16384 kB
CmaFree: 13800 kB
復制代碼
其中,MemTotl 就是設備的總內存,MemFree 是當前空閑內存。
修改設置
注: 修改設置之后,運行恢復命令有可能顯示仍然不太正常,可以運行 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
復制代碼
但是關閉后就無法恢復了,需要到【開發者模式】去開啟
實用功能
屏幕截圖
截圖保存到電腦:
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。
錄制屏幕
錄制屏幕以 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 輸出更多信息。
查看連接過的 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 的詳細用法參考官方文檔,當然需要FQ。
開啟/關閉 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 10628 2192 0 0000000000 S /init
root 2 0 0 0 0 0000000000 S kthreadd
root 3 2 0 0 0 0000000000 S ksoftirqd/0
root 4 2 0 0 0 0000000000 S kworker/0:0
root 5 2 0 0 0 0000000000 S kworker/0:0H
root 6 2 0 0 0 0000000000 S kworker/u12:0
root 7 2 0 0 0 0000000000 S rcu_preempt
...
復制代碼
其中各個列表的含義如下:
列名 含義
USER 應用所屬用戶
PID 進程ID
PPID 父進程ID
NAME 進程名
查看實時資源占用情況
adb shell top
復制代碼
結果:
User 15%, System 6%, IOW 0%, IRQ 2%
User 70 + Nice 198 + Sys 119 + Idle 1328 + IOW 0 + IRQ 0 + SIRQ 53 = 1768
PID USER PR NI CPU% S #THR VSS RSS PCY Name
1675 system 10 -10 15% S 67 3692336K 586336K ta cn.cloudwalk.app
231 camerase 20 0 4% S 15 111520K 40072K fg /system/bin/cameraserver
214 system -2 -8 2% S 30 296260K 22412K unk /system/bin/surfaceflinger
442 system 18 -2 0% S 88 3773608K 199724K fg system_server
2034 shell 20 0 0% R 1 9112K 3180K fg top
3 root 20 0 0% S 1 0K 0K fg ksoftirqd/0
649 radio 20 0 0% S 31 2825084K 110728K fg com.android.phone
720 media_rw 20 0 0% S 4 13868K 3344K fg /system/bin/sdcard
50 root RT 0 0% S 1 0K 0K fg cfinteractive
164 root -2 0 0% S 1 0K 0K fg mmcqd/1
7 root 20 0 0% S 1 0K 0K fg rcu_preempt
160 root 0 -20 0% S 1 0K 0K fg kworker/u13:1
8 root 20 0 0% S 1 0K 0K fg rcu_sched
159 root 0 -20 0% S 1 0K 0K fg kworker/u13:0
18 root RT 0 0% S 1 0K 0K fg migration/2
19 root 20 0 0% S 1 0K 0K fg ksoftirqd/2
20 root 20 0 0% S 1 0K 0K fg kworker/2:0
21 root 0 -20 0% S 1 0K 0K fg kworker/2:0H
22 root RT 0 0% S 1 0K 0K fg watchdog/3
...
復制代碼
其中各個列的含義如下:
列名 含義
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 顯示幫助文檔
復制代碼
查看進程的UID
該任務有兩種實現方式:
adb shell dumpsys package <packagename> | grep userId=(http://www.my516.com)
在高版本可能會提醒grep不可用,可以將grep換成findstr,
adb shell dumpsys package <packagename> | findstr userId
結果:
userId=1000
userId=1000
userId=1000
復制代碼
2.通過 ps 命令找到對應進程的 pid 之后adb shell cat /proc/<pid>/status | grep Uid
結果:
D:\work\206cwmenjyuny-master>adb shell
rk3399_mid:/ $ ps|grep cn.cloudwalk.app
system 1409 229 3689804 580168 0 0000000000 S cn.cloudwalk.app
rk3399_mid:/ $ cat /proc/1409/status | grep Uid
Uid: 1000 1000 1000 1000
rk3399_mid:/ $
復制代碼
其它
如下是其它常用命令的簡單描述,前文已經專門講過的命令不再額外說明:
命令 功能
cat 顯示文件內容
cd 切換目錄
chmod 改變文件的存取模式/訪問權限
df 查看磁盤空間使用情況
grep 過濾輸出
kill 殺死指定 PID 的進程
ls 列舉目錄內容
mount 掛載目錄的查看和管理
mv 移動或重命名文件
ps 查看正在運行的進程
rm 刪除文件
top 查看進程的資源占用情況
轉載于:https://www.cnblogs.com/hyhy904/p/11069788.html
總結
以上是生活随笔為你收集整理的[整理]ADB命令行学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国农业银行(火村支行)的行号是多少号
- 下一篇: 你长期从事农业技术推广工作,你是如何农业