我的GitHub | 我的博客 | 我的微信 | 我的郵箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
adb簡介
ADB,即 Android Debug Bridge,它是 Android 開發/測試人員不可替代的強大工具,也是 Android 設備玩家的好玩具。
adb 的非官方實現:fb-adb
參考鏈接
- Android Debug Bridge
- ADB Shell Commands
- logcat Command-line Tool
- Android ADB命令大全
- adb 命令行的使用記錄
- Android ADB命令大全
- 那些做Android開發必須知道的ADB命令
- adb shell top
- 像高手一樣使用ADB命令行
配置環境
右鍵我的電腦 -> 屬性 -> 高級 -> 環境變量 -> Path
在Path中添加 Android SDK 安裝路徑中 adb.exe 的路徑,例如\sdk\platform-tools
,注意用【;】分號隔開。
另外,最好也將\sdk\platforms
目錄添加進去。
命令語法
adb 命令的基本語法如下:
adb [-d|-e|-s <serialNumber>] <command>
如果只有一個設備/模擬器連接時,可以省略掉 [-d|-e|-s <serialNumber>]
這一部分,直接使用 adb <command>
。
常用命令
- 查看設備
adb devices
- 安裝APP
adb install apk文件路徑
- 卸載軟件
adb uninstall 軟件包名
- 進入shell
adb shell
- 回到根目錄
cd /
- 回到上一級目錄
cd ..
- 導入文件
adb push <本地路徑> <手機路徑>
- 導出文件
adb pull <手機路徑> <本地路徑>
- 獲取權限
adb root
- 關閉adb
adb kill-server
- 開啟adb
adb start-server
- 查看log
adb logcat [-s 標簽名]
- 獲取root權限
su[用戶名,如root]
- 查看文件結構
ls
- 查看占用端口的進程
netstat -ano
- 重啟手機
adb reboot
教程
為命令指定目標設備
如果有多個設備/模擬器連接,則需要為命令指定目標設備。
參數 | 含義 |
---|---|
-d | 指定當前唯一通過 USB 連接的 Android 設備為命令目標 |
-e | 指定當前唯一運行的模擬器為命令目標 |
-s <serialNumber> |
指定相應 serialNumber 號的設備/模擬器為命令目標 |
在多個設備/模擬器連接的情況下較常用的是 -s <serialNumber>
參數,serialNumber 可以通過 adb devices
命令獲取。目標設備名如:cf264b8f
、emulator-5554
、10.129.164.6:5555
10.129.164.6:5555
這種形式的 serialNumber 格式為<IP>:<Port>
,一般為無線連接的設備或 Genymotion 等第三方 Android 模擬器
adb -s cf264b8f shell wm size
adb -s 10.129.164.6:5555 install test.apk
啟動/停止
adb start-server //一般無需手動執行,在運行 adb 命令時若發現沒有啟動會自動調起
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 //讓 adbd 以 root 權限執行
adb unroot //恢復 adbd 為非 root 權限
restarting adbd as root
現在再運行 adb shell
,看看命令行提示符是不是變成 #
了?
有些手機 root 后也無法通過 adb root
命令讓 adbd 以 root 權限執行,比如三星的部分機型會提示 adbd cannot run as root in production builds
,此時可以先安裝 adbd Insecure
,然后 adb root
試試。
指定 adb server 的網絡端口
adb -P <port> start-server //默認端口為 5037
設備連接管理
查詢已連接設備/模擬器
adb devices
輸出格式為 [serialNumber] [state]
,serialNumber 即我們常說的 SN
,state 有如下幾種:
offline
—— 表示設備未連接成功或無響應device
—— 設備已連接。注意這個狀態並不能標識 Android 系統已經完全啟動和可操作,在設備啟動過程中設備實例就可連接到 adb,但啟動完畢后系統才處於可操作狀態no device
—— 沒有設備/模擬器連接
常見異常輸出:
- 沒有設備/模擬器連接成功:
List of devices attached
- 設備/模擬器未連接到 adb 或無響應。
cf264b8f offline
USB 連接
通過 USB 連接來正常使用 adb 需要保證幾點:
- 硬件狀態正常。包括 Android 設備處於正常開機狀態,USB 連接線和各種接口完好
- Android 設備的
開發者選項
和USB 調試模式
已開啟 - 設備驅動狀態正常
- 通過 USB 線連接好電腦和設備后確認狀態
無線連接(需要借助 USB 線)
除了可以通過 USB 連接設備與電腦來使用 adb,也可以通過無線連接——雖然連接過程中也有需要使用 USB 的步驟,但是連接成功之后你的設備就可以在一定范圍內擺脫 USB 連接線的限制啦!
操作步驟:
- 將 Android 設備與要運行 adb 的電腦連接到
同一個局域網
,比如連到同一個 WiFi - 將設備與電腦通過 USB 線連接
- 讓設備在
5555
端口監聽 TCP/IP 連接:adb tcpip 5555
- 斷開 USB 連接
- 找到設備的 IP 地址。一般能在「設置」-「關於手機」-「狀態信息」-「IP地址」找到,也可以使用下文里的方法用 adb 命令來查看
- 通過 IP 地址連接設備:
adb connect <device-ip-address>
- 確認連接狀態
- 斷開無線連接:
adb disconnect <device-ip-address>
如果連接不了,請確認 Android 設備與電腦是連接到了同一個 WiFi,然后再次執行 adb connect <device-ip-address>
那一步;如果還是不行的話,通過 adb kill-server
重新啟動 adb 然后從頭再來一次試試。
無線連接(需要 root 權限)
上一節是官方文檔里介紹的方法,需要借助於 USB 數據線來實現無線連接。既然我們想要實現無線連接,那能不能所有步驟下來都是無線的呢?答案是能的。
- 在 Android 設備上安裝一個
終端模擬器
。我使用的終端模擬器下載地址是:Android-Terminal-Emulator - 將 Android 設備與要運行 adb 的電腦連接到
同一個局域網
,比如連到同一個 WiFi - 打開 Android 設備上的
終端模擬器
,在里面依次運行命令:su
、setprop service.adb.tcp.port 5555
- 有的設備,可能需要重啟 adbd 服務,在設備的終端模擬器上運行:
restart adbd
,如果 restart 無效,嘗試以下命令:stop adbd
、start adbd
- 找到 Android 設備的 IP 地址,在電腦上通過 adb 和 IP 地址連接 Android 設備
應用管理
查看應用列表
查看應用列表的基本命令格式是
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 //所有應用
adb shell pm list packages -s //系統應用
adb shell pm list packages -3 //第三方應用
adb shell pm list packages qq //包名包含某字符串的應用
adb shell pm list packages | grep qq //也使用 grep 過濾
package:com.android.smoketest
安裝 APK
adb install [-lrtsdg] <path_to_apk>
adb install
后面可以跟一些可選參數來控制安裝 APK 的行為,可用參數及含義如下:
參數 | 含義 |
---|---|
-l | 將應用安裝到保護目錄 /mnt/asec |
-r | 允許覆蓋安裝 |
-t | 允許安裝清單文件里 application 指定 android:testOnly="true" 的應用 |
-s | 將應用安裝到 sdcard |
-d | 允許降級覆蓋安裝 |
-g | 授予所有運行時權限 |
運行命令后如果狀態為 Success
代表安裝成功,而如果狀態為 Failure
則表示安裝失敗,比如:
[100%] /data/local/tmp/map-20160831.apk
pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
常見安裝失敗輸出代碼、含義及可能的解決辦法參考:PackageManager.java
adb install
實際是分三步完成:
- push apk 文件到
/data/local/tmp
- 調用
pm install
安裝。 - 刪除
/data/local/tmp
下的對應 apk 文件
所以,必要的時候也可以根據這個步驟,手動分步執行安裝過程。
卸載應用
adb uninstall [-k] <packagename>
<packagename>
表示應用的包名,-k
參數可選,表示卸載應用但保留數據和緩存目錄。
清除應用數據與緩存
adb shell pm clear <packagename>
這條命令的效果相當於在設置里的應用信息界面點擊了「清除緩存」和「清除數據」。
查看前台 Activity
adb shell dumpsys activity activities | grep mResumedActivity
mResumedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher
就是當前處於前台的 Activity。
在 Windows 下以上命令可能不可用,可以嘗試:
adb shell dumpsys activity activities | findstr mResumedActivity
或
adb shell "dumpsys activity activities | grep mResumedActivity"
查看正在運行的 Services
adb shell dumpsys activity services [<packagename>]
指定 <packagename>
表示查看與某個包名相關的 Services,不指定表示查看所有 Services。
<packagename>
不一定要給出完整的包名,效果只是過濾包名。
查看應用詳細信息
adb shell dumpsys package <packagename>
輸出中包含很多信息,包括:Activity Resolver Table
、Registered ContentProviders
、包名、userId、安裝后的文件資源代碼等路徑、版本信息、權限信息和授予狀態、簽名版本信息等。
查看應用安裝路徑
adb shell pm path <PACKAGE>
package:/data/app/ecarx.weather-1.apk
與應用交互
主要是使用 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 |
-c <CATEGORY> |
指定 category |
-n <COMPONENT> |
指定完整組件名,如 com.a.b/.TestActivity |
<INTENT>
里還能帶數據,就像寫代碼時的 Bundle 一樣:
參數 | 含義 |
---|---|
--esn <KEY> |
null 值(只有 key 名) |
--es <KEY> <VALUE> |
string 值 |
--ez <KEY> <VALUE> |
boolean 值 |
--ei <KEY> <VALUE> |
integer 值 |
--el <KEY> <VALUE> |
long 值 |
--ef <KEY> <VALUE> |
float 值 |
--eu <KEY> <VALUE> |
URI |
--ecn <KEY> <VALUE> |
component name |
--eia <KEY> <VALUE>[,<VALUE...] |
integer 數組 |
--ela <KEY> <VALUE>[,<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.a.b/.MainActivity --es "name" "baiqiantao" //調起並傳數據
不指定Activity名稱啟動(啟動主Activity)
adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1
adb shell monkey -p com.tencent.mm -c android.intent.category.LAUNCHER 1 //調起微信
強制停止應用
adb shell am force-stop <packagename>
調起/停止 Service
adb shell am startservice [options] <INTENT>
adb shell am stopservice [options] <INTENT> //停止 Service
adb shell am startservice -n com.a.b/.c.MyService
另外一個典型的用例是,如果設備上原本應該顯示虛擬按鍵
但是沒有顯示,可以試試這個:
adb shell am startservice -n com.android.systemui/.SystemUIService
發送廣播
adb shell am broadcast [options] <INTENT>
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED //向所有組件廣播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.a.b/.MyReceiver
既能發送系統預定義的廣播
,也能發送自定義廣播
。這類用法在測試的時候很實用,比如某個廣播的場景很難制造,可以考慮通過這種方式來發送廣播。
收緊內存
adb shell am send-trim-memory <pid> <level>
adb shell am send-trim-memory 12345 RUNNING_LOW
- pid: 進程 ID
- level:HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE
文件導入導出
adb pull <設備里的文件路徑> [電腦上的目錄(省略時復制到當前目錄)] //復制設備里的文件到電腦
adb push <電腦上的文件路徑> <設備里的目錄> //復制電腦里的文件到設備
adb pull /sdcard/sr.mp4 ~/tmp/
adb push ~/sr.mp4 /sdcard/
設備上的文件路徑可能需要 root 權限才能訪問,可以在使用 adb shell
和 su
命令在 adb shell 里獲取 root 權限后,先將文件復制到 sdcard,然后 pull
;或先 push
到 sdcard,然后再復制。
模擬按鍵/滑動輸入
在 adb shell
里有個很實用的命令叫 input
,通過它可以做一些有趣的事情。
adb shell input [<source>] <command> [<arg>...]
adb shell input keyevent <keycode> //模擬鍵盤點擊事件
adb shell input swipe 300 1000 300 500 //模擬屏幕滑動事件,參數表示`起始點、結束點x/y坐標`
adb shell input text hello //在焦點處於某文本框時輸入文本,
完整的 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 則讓系統休眠 |
日志
Android 系統的日志分為兩部分,底層的 Linux 內核日志輸出到 /proc/kmsg
,Android 的日志輸出到 /dev/log
。
Android 的日志分為如下幾個優先級:V(Verbose)、D、I、W、E、F(Fatal)、S(Silent,啥也不輸出)
查看日志
[adb] logcat [<option>] ... [<filter-spec>] ...
adb logcat -c //清空日志
adb logcat *:W //輸出 W 及以上級別的日志
adb logcat MyTag:I //按 tag 和級別過濾日志
舉例:adb logcat MyTag:I MyApp:D *:S
輸出 tag
MyTag
的 Info 以上級別日志,輸出 tagMyApp
的 Debug 以上級別日志,及其它 tag 的 Silent 級別日志(即屏蔽其它 tag 日志)
日志格式
adb logcat -v <format>
adb logcat -v brief
adb logcat -v threadtime ActivityManager:I *:S //可與過濾同時使用
日志支持按以下幾種 <format>
:
- brief:默認格式,
<priority>/<tag>(<pid>): <message>
- process:
<priority>(<pid>) <message>
- tag:
<priority>/<tag>: <message>
- raw:
<message>
- time:
<datetime> <priority>/<tag>(<pid>): <message>
- threadtime:
<datetime> <pid> <tid> <priority> <tag>: <message>
- long:
[ <datetime> <pid>:<tid> <priority>/<tag> ] 換行 <message>
threadtime 的輸入案例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
內核日志
adb shell dmesg
<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
中括號里的 [14201.684016]
代表內核開始啟動后的時間,單位為秒。
通過內核日志我們可以做一些事情,比如衡量內核啟動時間,在系統啟動完畢后的內核日志里找到 Freeing init memory
那一行前面的時間就是。
查看設備信息
常用命令
//硬件信息
adb shell dumpsys battery //電池狀況
adb shell cat /proc/cpuinfo //CPU 信息,可以看到使用的硬件、幾核的CPU,采用的架構等信息
adb shell cat /proc/meminfo //內存信息,可以看到設備的總內存、當前空閑內存等信息
//屏幕信息
adb shell dumpsys window displays //顯示屏參數
adb shell wm size //屏幕分辨率【Physical size: 1080x1920】【Override size: 480x1024】
adb shell wm density //屏幕密度【Physical density: 420】【Override density: 160】
//設備ID、IMEI
adb shell settings get secure android_id //android_id【51b6be48bac8c569】
adb shell dumpsys iphonesubinfo //即【Device ID】,Android 4.4 及以下版本可用
adb shell service call iphonesubinfo 1 //Android 5.0 及以上版本可用,需要 root 權限
//網絡信息、IP地址
adb shell ifconfig | grep Mask //查看IP 地址,grep是過濾,不過濾的話內容很多
adb shell ifconfig wlan0 //查看局域網 IP
adb shell netcfg //部分系統版本里可用
adb shell cat /sys/class/net/wlan0/address //局域網 Mac 地址【f8:a9:d0:17:42:4d】
系統屬性信息 getprop
如下命令會輸出很多硬件與系統屬性信息,例如型號、Android 系統版本等:
adb shell cat /system/build.prop //詳細信息
輸出里的一些信息也可通過 adb shell getprop <屬性名>
命令單獨查看,列舉一部分屬性如下:
adb shell getprop ro.product.model //型號【Nexus 5】
adb shell getprop ro.build.version.release //系統版本【5.0.2】
屬性名 | 含義 |
---|---|
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 reboot
重啟設備,或手動重啟。
修改設置的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db
里存放的設置值。
常用設置
adb shell wm size 480x1024 //修改分辨率
adb shell wm size reset //恢復
adb shell wm density 160 //修改屏幕密度
adb shell wm density reset //恢復
adb shell wm overscan 0,0,0,200 //顯示區域
adb shell wm overscan reset ///恢復
adb shell settings put global adb_enabled 0 //關閉 USB 調試模式
狀態欄和導航欄的顯示隱藏
adb shell settings put global policy_control <key-values>
<key-values>
可由如下幾種鍵及其對應的值組成,格式為 <key1>=<value1>:<key2>=<value2>
。
key | 含義 |
---|---|
immersive.full | 同時隱藏 |
immersive.preconfirms | 同時顯示 |
immersive.status | 僅隱藏狀態欄 |
immersive.navigation | 僅隱藏導航欄 |
value | 含義 |
---|---|
apps |
所有應用 |
* |
所有界面 |
packagename |
指定應用 |
-packagename |
排除指定應用 |
例如:
adb shell settings put global policy_control immersive.full=* //全部隱藏
adb shell settings put global policy_control immersive.preconfirms=* //全部顯示
adb shell settings put global policy_control immersive.status=com.tencent.mm,com.android.mms:immersive.navigation=apps,-com.android.dialer
表示設置:
- 在包名為
com.tencent.mm
和com.android.mms
的應用里隱藏狀態欄 - 在除了包名為
com.android.dialer
的所有應用里隱藏導航欄(包括上面的那兩個應用)
允許/禁止訪問非 SDK API
//允許訪問非 SDK API
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
//禁止訪問非 SDK API
adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
命令最后的數字的含義:
值 | 含義 |
---|---|
0 | 禁止檢測非 SDK 接口的調用。該情況下,日志記錄功能被禁用,並且令 strict mode API,即 detectNonSdkApiUsage()無效。不推薦。 |
1 | 僅警告——允許訪問所有非 SDK 接口,但保留日志中的警告信息,可繼續使用 strick mode API |
2 | 禁止調用深灰名單和黑名單中的接口 |
3 | 禁止調用黑名單中的接口,但允許調用深灰名單中的接口 |
實用功能
檢測設備是否已 root
命令:
adb shell
su
此時命令行提示符是 $
則表示沒有 root 權限,是 #
則表示已 root。
屏幕截圖
adb shell screencap -h
usage: screencap [-hp] [-d display-id] [FILENAME]
-p: save the file as a png. 如果指定文件名以 .png 結尾時可以省略 -p 參數
-d: specify the display id(顯示屏編號,有多顯示屏的情況下需要指定) to capture, default 0
adb shell screencap -p /sdcard/sc.png //截圖保存到設備里
adb pull /sdcard/sc.png //將文件導出到電腦
adb exec-out screencap -p > sc.png //截圖后直接保存到電腦里
如果不指定文件名,截圖文件的內容將直接輸出到 stdout。由於圖片內容特別龐大,所以可能會卡死終端。
錄制屏幕
adb shell screenrecord /sdcard/filename.mp4
adb pull /sdcard/filename.mp4 //導出到電腦
需要停止時按 Ctrl-C,默認錄制時間和最長錄制時間都是 180 秒。
參數 | 含義 |
---|---|
--size WIDTHxHEIGHT | 視頻的尺寸,默認是屏幕分辨率。 |
--bit-rate RATE | 視頻的比特率,默認是 4Mbps。 |
--time-limit TIME | 錄制時長,單位秒。 |
--verbose | 輸出更多信息。 |
查看連接過的 WiFi 密碼
注:需要 root 權限。
adb shell cat /data/misc/wifi/*.conf
輸出內容中的ssid
即為我們在 WLAN 設置里看到的名稱,psk
為密碼,key_mgmt
為安全加密方式。
開啟/關閉 WiFi
注:需要 root 權限。
adb shell svc wifi enable //開啟 WiFi
adb shell svc wifi disable //關閉 WiFi
若執行成功,輸出為空;若未取得 root 權限執行此命令,將執行失敗,輸出 Killed
。
設置系統日期和時間
注:需要 root 權限。
adb shell date -s 20160823.131500
表示將系統日期和時間更改為 2016 年 08 月 23 日 13 點 15 分 00 秒。
刷機相關命令
adb reboot //重啟手機
adb reboot recovery //重啟到 Recovery 模式
adb reboot bootloader //重啟到 Fastboot 模式
adb sideload <path-to-update.zip> //通過 sideload 更新系統
在 Recovery 模式下更新電腦上的系統更新包操作步驟:
- 重啟到 Recovery 模式。
- 在設備的 Recovery 界面上操作進入
Apply update
-Apply from ADB
(不同的 Recovery 菜單可能與此有差異) - 通過 adb 上傳和更新系統
安全相關命令
adb root
adb shell setenforce 1 //啟用 SELinux
adb shell setenforce 0 //禁用 SELinux
adb enable-verity //啟用 dm_verity
adb disable-verity //禁用 dm_verity
更多 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
列名 | 含義 |
---|---|
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
列名 | 含義 |
---|---|
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= //直接獲取
adb shell cat /proc/<pid>/status | grep Ui //先通過 ps 命令找到對應進程的 pid 在獲取
使用 Monkey 進行壓力測試
Monkey 可以生成偽隨機用戶事件
來模擬單擊、觸摸、手勢
等操作,可以對正在開發中的程序進行隨機壓力測試。
adb shell monkey -p <packagename> -v 500
表示向 <packagename>
指定的應用程序發送 500 個偽隨機事件。
Monkey 的詳細用法參考 官方文檔。
重新掛載 system 分區為可寫
注:需要 root 權限。
/system
分區默認掛載為只讀
,但有些操作比如給 Android 系統添加命令、刪除自帶應用等需要對 /system
進行寫操作,所以需要重新掛載它為可讀寫
。
步驟:
- 進入 shell 並切換到 root 用戶權限:
adb shell
、su
- 查看當前分區掛載情況:
mount
,找到其中我們關注的帶/system
的那一行 - 重新掛載
- 如果輸出沒有提示錯誤的話,操作就成功了,可以對
/system
下的文件進行修改了
adb shell
su
mount
mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
其它
如下是其它常用命令的簡單描述,前文已經專門講過的命令不再額外說明:
命令 | 功能 |
---|---|
cat | 顯示文件內容 |
cd | 切換目錄 |
chmod | 改變文件的存取模式/訪問權限 |
df | 查看磁盤空間使用情況 |
grep | 過濾輸出 |
kill | 殺死指定 PID 的進程 |
ls | 列舉目錄內容 |
mount | 掛載目錄的查看和管理 |
mv | 移動或重命名文件 |
ps | 查看正在運行的進程 |
rm | 刪除文件 |
top | 查看進程的資源占用情況 |
2019-11-28