monkey安裝使用


1、准備文件:模擬器(用的是mumu模擬器,也可以選擇真機連接或其他模擬器,都是差不多的東西)

      去官網下載即可(http://mumu.163.com/baidu/),按提示安裝即可

 

     adb安裝包(已下載,位置:D:\adbgjb),可以去網上搜,也可以用這個鏈接:https://pan.baidu.com/s/1CfdEa8U3CYRABAlxsZZArg,提取碼:4rtu

     完整的ADB工具包,總共有四個文件,兩個exe后綴,兩個dll后綴。
        adb.exe
        AdbWinApi.dll
        AdbWinUsbApi.dll
        fastboot.exe

 

     adb只下載adb壓縮包去解壓、配置環境變量即可,不需要安裝什么的;

1.1、adb環境變量配置,如圖

 

 

1.2、驗證adb安裝成功與否

  打開cmd,輸入命令:adb

  如下圖即代表安裝成功

 

 

1.3、連接模擬器:

  打開cmd,輸入命令:adb connect+端口號,如:adb connect 127.0.0.1:7555

  如圖代表連接成功

 

 

1.4、驗證連接的設備:

  adb devices(連接成功會提示list of devices attached ,第二行顯示的是設備名稱)=

 

 

1.5、 adb shell pm list packages (查看apk安裝包名)————一個設備一般有很多包,找出自己的包名

 

 

 

 

 

 

后面的是轉載的文章:https://blog.csdn.net/zhangmeng1314/article/details/82699316

cmd 打開命令提示符窗口輸入 adb shell pm list packages (查看apk安裝包名)


使用adb shell monkey - p com.tencent.mm -V 10000 即可
查看包名:查看電腦中某一位置的apk文件的包名:PC打開CMD-進入TMG目錄-運行設備--查看包名aapt dump badging *.apk(apk文件的路徑,可以直接拖拽)。


或者直接查看手機中存在的apk包,進入adb shell 命令后---手機的data/data文件夾--ls查看所有包名 找到要測apk的包名

 


monkey -pcom.tencent.mtaexample -s 23  --throttle2000 --ignore-crashes --ignore-timeouts -v -v -v 100000>/data/local/tmp/log.txt 2>&1 &

        1.   -p后面接着的對應的包名,如果是整機測試,就不需要 -ppackage_name

        2.   -s后面是對應的種子數,好像就是操作步驟,根據她們測試的經驗,一般種子數在23,同步她們測試的結果,一般種子的個數固定為23,和她們選擇的操作步驟就是同步的。

        3.   --ignore-crashes --ignore-timeouts 這里是在monkey測試的過程中遇到carash或者timeout的情況時忽略掉,一般不設置時,出現carash或者timeout時,Monkey測試會終止。這里是防止Monkey測試終止。

        4.   -v 指的是Monkey測試時打印log級別。

        5.   100000 這里是指點擊的次數,根據她們測試的經驗,對於單個應用程序這個次數設置在100000次就可以了;如果是整機,一般設置在500000次。
/data/local/tmp/log.txt測試的log記錄在手機上/data/local/tmp/ 下面的log.txt里面,這個名字可以自己寫。

        6.   2>&1 固定的寫法,這個也很重要,代表的意思是中間忽略的東東的日志一並輸入到指定的文件中。

        7.   最后單獨的一個"&" 是一旦Monkey測試開始了,之后可以拔掉數據線,不會影響Monkey測試。

        8.   測試所有模塊  monkey  -s 23 --ignore-crashes --ignore-timeouts -v-v -v 100000> /data/local/tmp/log.txt 2>&1 &

六、monkey常用參數詳解

-v  日志詳細程度

Level 0  :  adb shell monkey  -p fishjoy.control.menu  -v 100   最簡單(默認),除了啟動、測試完成和最終結果外只提供較少的信息。

Level 1  :  adb shell monkey  -p fishjoy.control.menu  -v  -v 100  提供了較為詳細的測試信息,如逐個發送到Activity的事件信息

Level 2  :  adb shell monkey  -p fishjoy.control.menu  -v  -v  -v 100 提供了更多的設置信息,如測試中選中或未選中的Activity信息

比較常用的是-v -v -v,一般會保存到指定文件中供開發人員查找bug原因時使用

-s(隨機數種子)

指定偽隨機數生成器的seed值,如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。

示例: monkey測試1:adb  shell  monkey  -p fishjoy .control.menu  –s 10  100

          monkey測試2:adb  shell  monkey  -p fishjoy .control.menu  –s 10  100

--throttle <毫秒> 

指定用戶操作(即事件)間的時延,單位是毫秒;如果不指定這個參數,monkey會盡可能快的生成和發送消息。

示例:adb  shell monkey -p fishjoy.control.menu  --throttle 3000 100 

-p <允許的包名列表> 

用此參數指定一個或多個包。指定包之后,monkey將只允許系統啟動指定的app。如果不指定包,monkey將允許系統啟動設備中的所有app。

--ignore-security-exception 

作用:通常,當程序發生許可錯誤(例如啟動一些需要許可的Activity)導致的異常時,Monkey將停止運行。設置此項,Monkey將繼續發送事件給系統,直到事件計數完成。

--ignore-timeouts

作用:通常,應用程序發生任何超時錯誤(如“Application Not responding”對話框)Monkey將停止運行,設置此項,Monkey將繼續發送事件給系統,直到事件計數完成。

--ignore-crashes

作用:通常,應用發生崩潰或異常時Monkey會停止運行。如果設置此項,Monkey將繼續發送事件給系統,直到事件計數完成。

--pct-touch <percent>

作用:調整觸摸事件的百分比.(觸摸事件是指在屏幕中的一個down-up事件,即在屏幕某處按下並抬起的操作)比如一個應用80%的操作都是觸摸,那就可以將此參數的百分

比設置成相應較高的百分比。如觸摸返回、觸摸簽到等

--pct-motion<percent>

調整motion事件百分比。(motion事件是由屏幕上某處一個down事件、一系列偽隨機的移動事件和一個up事件組成)也就是直線滑動事件如從左到有滑動解鎖

--pct-trackball <percent>

作用:調整滾動球事件百分比。(滾動球事件由一個或多個隨機的移動事件組成,有時會伴隨着點擊事件)如不規則滑動解鎖

--pct-nav<percent> 導航,現在手機基本沒有導航了

---pct-syskeys<percent> 按鍵消息比例,主頁、后退、音量增減

--pct-anyevent 其他不常用的按鍵比例的設置,不常用

--hprof  monkey測試完成后生成內存快照,data/misc路徑下生成,不常用,比較占空間

--ignore-security-exceptions  忽略權限問題的

--kill-process-after-error 當錯誤發生時殺進程

--monitor-native-crashes 監視崩潰時的本地代碼

七、殺monkey進程

如果想中斷運行中的monkey CTRL+C

adb shell ps | grep monkey  返回進程號

adb shell kill [剛才查到的進程號]

app包名查看:

a.手機安裝包名查看器'

 b.aapt命令  aapt dump badging *.apk

c、源碼下的AndroidManifest.xml文件查看

d.adb logcat抓取當前Android機運行的app的包名(  I/ActivityManager(數字): Displayed 包名/類
名: +ms )

命令行輸入 adb logcat >e:\bag.txt

手機操控app,ctrl+c停止

去e:\bag.txt這個文件下搜索關鍵字如Displayed ,一般都能找到

 

基本用法
命令語法
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

輸出里的 cf264b8f 和 emulator-5554 即為 serialNumber。比如這時想指定cf264b8f 這個設備來運行 adb 命令獲取屏幕分辨率:

adb -s cf264b8f shell wm size

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

啟動/停止
啟動 adb server 命令:

adb start-server

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

停止 adb server 命令:adb kill-server

查看 adb 版本
命令:adb version

示例輸出:Android Debug Bridge version 1.0.32Revision 09a0d98bebce-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

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

offline —— 表示設備未連接成功或無響應。
device —— 設備已連接。注意這個狀態並不能標識 Android 系統已經完全啟動和可操作,在設備啟動過程中設備實例就可連接到 adb,但啟動完畢后系統才處於可操作狀態。
no device —— 沒有設備/模擬器連接。
以上輸出顯示當前已經連接了兩台設備/模擬器,cf264b8f 與 emulator-5554分別是它們的 SN。從 emulator-5554 這個名字可以看出它是一個 Android 模擬器。

常見異常輸出:

沒有設備/模擬器連接成功。
List of devices attached
設備/模擬器未連接到 adb 或無響應。
List of devices attached
cf264b8f offline
USB 連接
通過 USB 連接來正常使用 adb 需要保證幾點:

硬件狀態正常。
包括 Android 設備處於正常開機狀態,USB 連接線和各種接口完好。
Android 設備的開發者選項和 USB 調試模式已開啟。
可以到「設置」-「開發者選項」-「Android 調試」查看。
如果在設置里找不到開發者選項,那需要通過一個彩蛋來讓它顯示出來:在「設置」-「關於手機」連續點擊「版本號」7 次。
設備驅動狀態正常。
這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安裝驅動的情況,確認這一點可以右鍵「計算機」-「屬性」,到「設備管理器」里查看相關設備上是否有黃色感嘆號或問號,如果沒有就說明驅動狀態已經好了。否則可以下載一個手機助手類程序來安裝驅動先。
通過 USB 線連接好電腦和設備后確認狀態
adb devices如果能看到xxxxxx device 說明連接成功。
無線連接
除了可以通過 USB 連接設備與電腦來使用 adb,也可以通過無線連接——雖然連接過程中也有需要使用 USB 的步驟,但是連接成功之后你的設備就可以在一定范圍內擺脫 USB 連接線的限制啦!

操作步驟:

將 Android 設備與將運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi。
將設備與電腦通過 USB 線連接。
應確保連接成功(可運行 adb devices 看是否能列出該設備)。
讓設備在 5555 端口監聽 TCP/IP 連接:adb tcpip 5555
斷開 USB 連接。
一般能在「設置」-「關於手機」-「狀態信息」-「IP地址」找到。

 

通過 IP 地址連接設備。

adb connect <device-ip-address>
確認連接狀態。如果能看到

<device-ip-address>:5555 device
說明連接成功。如果連接不了,請確認 Android 設備與電腦是連接到了同一個 WiFi,然后再次執行 adb connect <device-ip-address> 那一步;如果還是不行的話,通過 adb kill-server 重新啟動 adb 然后從頭再來一次試試。

斷開無線連接

命令:adb disconnect <device-ip-address>

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

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.smoketestpackage:com.example.android.livecubespackage:com.android.providers.telephonypackage:com.google.android.googlequicksearchboxpackage:com.android.providers.calendarpackage:com.android.providers.mediapackage:com.android.protipspackage:com.android.documentsuipackage:com.android.gallerypackage:com.android.externalstorage

...// other packages here

...

系統應用

命令:adb shell pm list packages -s

第三方應用

命令:adb shell pm list packages -3

包名包含某字符串的應用

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

adb shell pm list packages mazhuang

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

adb shell pm list packages | grep mazhuang

安裝 APK
命令:adb install <apk file>

參數:

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

參數

含義

-r

允許覆蓋安裝。

-s

將應用安裝到 sdcard。

-d

允許降級覆蓋安裝。

完整參數列表及含義可以直接運行 adb 命令然后查看 adb install [-lrtsdg] <file> 一節。

如果見到類似如下輸出(狀態為 Success)代表安裝成功:

12040 KB/s (22205609 bytes in 1.801s)

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

而如果狀態為 Failure 則表示安裝失敗。常見安裝失敗輸出代碼、含義及可能的解決辦法如下:

輸出

含義

解決辦法

INSTALL_FAILED_ALREADY_EXISTS

應用已經存在

使用 -r 參數

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

已經安裝過簽名不一樣的同名應用,且數據沒有移除

 

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 訪問失敗

確認 sdcard 可用,或者安裝到內置存儲

INSTALL_FAILED_INVALID_INSTALL_LOCATION

不能安裝到指定位置

切換安裝位置,添加或刪除 -s 參數

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 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。

與應用交互
主要是使用 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>

string 值

--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

--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]

integer 數組

--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]

long 數組

調起 Activity
命令格式:

adb shell am start [options] <INTENT>

例如:adb shell am start -n com.tencent.mm/.ui.LauncherUI

表示調起微信主界面。

adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"

表示調起 org.mazhuang.boottimemeasure/.MainActivity 並傳給它 string 數據鍵值對 toast - hello, world。

調起 Service
命令格式:adb shell am startservice [options] <INTENT>

例如:adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService

表示調起微信的某 Service。

發送廣播
命令格式:adb shell am broadcast [options] <INTENT>

例如:adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver

表示向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 發送一個BOOT_COMPLETED 廣播,這類用法在測試的時候很實用,比如某個廣播的場景很難制造,可以考慮通過這種方式來發送廣播。

強制停止應用
命令:adb shell am force-stop <packagename>

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

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

文件管理
復制設備里的文件到電腦
命令:adb pull <設備里的文件路徑> [電腦上的目錄]

其中 電腦上的目錄 參數可以省略,默認復制到當前目錄。

例:adb pull /sdcard/sr.mp4 ~/tmp/

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

復制電腦里的文件到設備
命令:adb push <電腦上的文件路徑> <設備里的目錄> 

例:adb push ~/sr.mp4 /sdcard/

小技巧:設備上的文件路徑普通權限可能無法直接寫入,如果你的設備已經 root 過,可以先 adb push /path/on/pc /sdcard/filename,然后 adb shell 和su 在 adb shell 里獲取 root 權限后,cp /sdcard/filename /path/on/device。

模擬按鍵/輸入
在 adb shell 里有個很實用的命令叫 input,通過它可以做一些有趣的事情。

input 命令的完整 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 能實現不同的功能,完整的 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/kmsg,Android 的日志輸出到 /dev/log。

Android 日志
命令格式:[adb] logcat [<option>] ... [<filter-spec>] ...

常用用法列舉如下:

按級別過濾日志

Android 的日志分為如下幾個級別:

V —— Verbose(最低,輸出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不輸出)
按某級別過濾日志則會將該級別及以上的日志輸出。

比如,命令:adb logcat *:W

會將 Warning、Error、Fatal 和 Silent 日志輸出。

按 tag 和級別過濾日志

比如,命令:adb logcat ActivityManager:I MyApp:D *:S

表示輸出 tag ActivityManager 的 Info 以上級別日志,輸出 tag MyApp 的 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: 0raw

格式為:<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。

屏幕密度
命令:adb shell wm density

輸出示例:Physical density: 420

該設備屏幕密度為 420dpi。

顯示屏參數
命令: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

Mac 地址
命令:adb shell cat /sys/class/net/wlan0/address

輸出示例:f8:a9:d0:17:42:4d

CPU 信息
命令:adb shell cat /proc/cpuinfo

輸出示例:

Processor       : ARMv7 Processor rev 0 (v7l)processor       : 0BogoMIPS        : 38.40

processor       : 1BogoMIPS        : 38.40

processor       : 2BogoMIPS        : 38.40

processor       : 3BogoMIPS        : 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        : 000bSerial          : 0000000000000000

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

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

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

屏幕密度

實用功能
屏幕截圖
命令: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

輸出更多信息。

重新掛載 system 分區為可寫
注:需要 root 權限。

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

步驟:

1.進入 shell 並切換到 root 用戶權限。

命令:adb shell su

2.查看當前分區掛載情況。

命令:mount

輸出示例:

rootfs / rootfs ro,relatime 0 0

tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0

devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0

proc /proc proc rw,relatime 0 0

sysfs /sys sysfs rw,seclabel,relatime 0 0

selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0

debugfs /sys/kernel/debug debugfs rw,relatime 0 0

none /var tmpfs rw,seclabel,relatime,mode=770,gid=1000 0 0

none /acct cgroup rw,relatime,cpuacct 0 0

none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0

none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0

tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0

tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0

none /dev/memcg cgroup rw,relatime,memory 0 0

none /dev/cpuctl cgroup rw,relatime,cpu 0 0

none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0

none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0

none /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0

/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0

/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0

/dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0

/dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0

/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

/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

/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 ext4ro,seclabel,relatime,data=ordered 0 0

重新掛載。

命令: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 shellsucat /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 的詳細用法參考 官方文檔。

刷機相關命令
重啟到 Recovery 模式
命令:adb reboot recovery

從 Recovery 重啟到 Android
命令:adb reboot

重啟到 Fastboot 模式
命令:adb reboot bootloader

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

以 Recovery 模式下更新為例:重啟到 Recovery 模式。

命令:adb reboot recovery

在設備的 Recovery 界面上操作進入 Apply update-Apply from ADB。

注:不同的 Recovery 菜單可能與此有差異,有的是一級菜單就有 Apply update from ADB。

通過 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

查看進程的資源占用情況


————————————————
版權聲明:本文為CSDN博主「尋魚」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhangmeng1314/article/details/82699316

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM