Ubuntu上使用ADB(Android Debug Bridge)



安裝 adb 工具 (適用於Ubuntu 12.04 LTS及之後的版本)
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install android-tools-adb 
Ubuntu 14.04之後可以不用加入repository就能安裝android-tools-adb,不過該套件的缺點就是他版本太舊,adb push不支援-p顯示進度。

adb connect有時候會無法正常連線,需要adb kill-server再adb connect

停止/啟動與裝置的連線
adb kill-server
adb start-server 

連線到某個android裝置的ip
adb connect 10.129.193.30
沒有執行過start-server這個指令也會自動start-server

中斷連線
adb disconnect 10.129.193.30

如果希望adb會持續等待到裝置上線
adb wait-for-device

顯示目前連線上的裝置
adb devices
List of devices attached
emulator-5554 device
0123456789ABCDEF device
emulator-5556 device
192.168.202.79:7878 device

開啟遠端adb shell
adb shell
一般離開shell只要打exit即可;不過若裝置先離線,則adb shell會卡住而無法打指令,這時候要用其他的command line輸入adb kill-server來解除連線狀態

當有多台裝置連線時可以用-s來指定裝置
adb -s 123456789123 shell

如果是用adb connect到某個IP的裝置,會需要用adb devices確認裝置名稱,這時候-s用的名稱應該是IP:5555。如果只想執行某個指令就結束adb shell,可以用adb -d來完成
例如: adb -d shell cat /proc/cpuinfo

一般adb shell指令
printenv
ps, e.g. ps 
top, e.g. top -m 5    
renice
rm
rmdir
rmmod
route
sleep, e.g. sleep 
sync
cp
du
grep
md5
touch
vmstat
uptime
mount
umount
alias
bg
fg
cd
eval
export
getopts
hash
jobid
pwd
read, read a variable from the command line.
readonly, set an environment variable as read-only.
set
setvar
unset
type
shift
umask
unalias
wait

啟用/停用app
pm enable your.package.name
pm disable your.package.name

列出有哪些app已裝
pm list package
會顯示安裝路徑跟package name

執行某個已啟用的app
am start -n your.package.name/your.main.activity

開啟Android設定頁
am start -a android.settings.SETTINGS

用android內建的播放器開啟指定影音檔案
am start -n com.android.gallery3d/com.android.gallery3d.app.MovieActivity -d "/sdcard/Movies/test.ts"
有些裝置會限制mediaplayer

廣播訊息
am broadcast -a com.acme.coyotebirdmonitor.FAST_BIRD
am broadcast com.android.server.NetworkTimeUpdateService.action.POLL # ntp time update

遠端安裝app,安裝目錄由系統決定,-f強制
adb install local_path_of_your_app.apk
adb install -r local_path_of_your_app.apk是覆蓋安裝,如果你沒有改APP版本號,最好是使用這個指令安裝。

如果安裝遭遇signature錯誤會需要先移除已經安裝的APP
adb uninstall {pacakage name}
如果想保留app資料,要加上-k選項

通常裝置預設都會是read-only,可以直接用這個重掛載成可以寫入的狀態
adb remount

有些版子需要先adb root才能remount,不過Android機器上要有su指令才能用adb root
adb root
adb remount
如果adb root無效表示可能要用console,並依照mount的狀態使用mount指令重掛root和/system
例如:


推入app
adb push loca_yourapp.apk /system/app/remote_yourapp.apk


拉出app
adb pull /system/app/remote_yourapp.apk loca_yourapp.apk 

在裝置上執行指令dmseg並將輸出存到檔案
adb shell dmesg > dmesg.txt

清空log
adb logcat -c

把裝置上目前所有的log抓下來存到檔案
adb logcat -d -v time > logcat.txt
-d是log輸出完畢就結束

如果想要自動命名log檔可以用下面這個指令
adb logcat -d -v time > logcat$(date +%Y-%m-%d_%T).txt

錄製一段裝置上的log並輸出至檔案,可以用 -v 指定輸出格式(常用的格式有time、threadtime)
adb logcat -v threadtime > logcat.txt
由於沒有用-d選項,所以上述指令需要使用Ctrl+c 中斷

other option format:
"adb logcat -v brief" - Display priority/tag and the PID of process issuing the message (the default format).
"adb logcat -v process" - Display PID only.
"adb logcat -v tag" - Display the priority/tag only.
"adb logcat -v raw" - Display the raw log message, with no other metadata fields.
"adb logcat -v time" - Display the date, invocation time, priority/tag, and PID of the process issuing the message.
"adb logcat -v thread" - Display the priority, tag, and the PID and TID of the thread issuing the message.
"adb logcat -v threadtime" - Display the date, invocation time, priority, tag, and the PID and TID of the thread issuing the message.
"adb logcat -v long" - Display all metadata fields and separate messages with a blank lines.

參考資料:


重新開機/重開到recovery/bootloader
adb reboot
adb reboot recovery
adb reboot bootloader

取得系統屬性/設定屬性/觀察屬性變化
getprop
setprop
watchprops

列出目前服務/啟動服務/停止服務
service list
start {service name}, e.g. start media
stop {service name}, e.g. stop media

開關某個網路裝置
netcfg [ {dhcp|up|down}]

觀察Android事件
getevent

送出Android事件
sendevent /dev/input/event0 1 330 1

輸入某個建盤/輸入事件
adb shell input keyevent 1
adb shell input keyevent KEYCODE_8
adb shell input text "http://www.google.com.tw"
名稱與數值得對應可以參考google

重複發出info key
while [ 1==1 ]
do
input keyevent KEYCODE_INFO
sleep 3
done

清除資料
wipe

切換使用者/確認目前使用者
su {user name} # 不輸入user name表示root
id  #確認目前的使用者,不建議看shell的$和#來分辨
exit #離開使用者

模擬mediaservice的使用者與權限
su {user mame},{group name 1},{group name 2},...,{group name N}
如果猜測有權限不足的問題,可以用這個方式做測試

列出可dump的系統服務/記憶體資訊/硬碟資訊/APP intent資訊與權限
dumpsys
dumpsys meminfo
dumpsys diskstats
dumpsys package

程式Crash的core dump資料

cat /data/tombstones/tombstone_**

留言