Android* 作業系統應用程式遠端偵錯
Android* Debug Bridge
Android Debug Bridge (ADB) 是一種命令列工具,可處理主機上的偵錯工具(通常為 GDB* 或 DDMS*(Dalvik* 調試監測程式伺服器)以及 ADT)和目標上啟動並執行 Android* 映像之間的調試通訊。 目標映像可運行在類比裝置上或實體開發裝置(通過 USB-OTG (On-The-Go) 或 USB 轉乙太網路適配器與其通訊)上。 簡而言之,ADB 是一座橋樑,讓調試 Android* 上的應用程式成為可能。
您所串連或類比的裝置涉及大量形狀因素。 通常裝置可能是智能手機或平板電腦。 也可以是醫學用平板電腦或工業、家庭能源管理、倉儲領域或任意數量智能系統應用程式的嵌入式裝置。
設定 Android Debug Bridge 可讓基於英特爾® 淩動TM處理器的平台的遠端偵錯與其他架構上的調試不會有太大差別。
首先需要在開發主機上安裝包含 ADB* 的 Android* SDK。 有關這方面的說明請參閱 http://developer.android.com/sdk/installing.html。
設定 ADB*
如果目標映像運行在物理裝置上,則首先需要支援 USB-OTG 或 USB 轉乙太網路。 要支援 USB 轉乙太網路,需要重新構建核心配置。 如果需要,您的原始裝置製造商將為您提供必要資訊。
遠程應用程式調試的標準方法是使用大多數 Android 裝置的現有 USB-OTG 介面。 在 Android* 開發人員網站上對該設定有詳細說明:http://developer.android.com/guide/developing/device.html。
在此概述一下主要步驟
1. 在 Android Manifest 中將您的應用程式聲明為“可調試”。
在使用 Eclipse 時,可跳過該步驟,因為直接從 Eclipse IDE 運行應用程式時會自動啟用調試。
在 AndroidManifest.xml 檔案中將 android:debuggable=true 添加至 元素。
註:如果在資訊清單檔中手動啟用調試,在進行構建以發布之前務必先禁用它(您發布的應用程式通常應該不可調試)。
2. 開啟裝置上的“USB 調試”。
在裝置上,轉至“設定 > 應用程式 > 開發”並啟用“USB 調試”(在 Android 4.0 裝置上,設定路徑為“設定 > 開發人員選項”)。
3. 設定系統以檢測裝置。
o 如果在 Windows 上開發,則需要安裝 adb 的 USB 驅動程式。 有關安裝指南和原始裝置製造商驅動程式的連結,請參閱OEM USB Drivers文檔。
o 如果在 Mac OS* X 上開發,則無需操作。 可直接跳過該步驟。
o 如果在 Ubuntu* Linux* 上開發,則需要添加一個 udev 規則檔案,該檔案包含要用於開發的每種裝置的 USB 配置。 在規則檔案中,通過唯一的供應商 ID 表示每個裝置製造商,該 ID 通過 ATTR{idVendor} 屬性指定。 要查看供應商 ID 的列表,請參閱 USB Vendor IDs。 要在 Ubuntu Linux 上設定裝置檢測:
以超級使用者身份登入並建立該檔案: /etc/udev/rules.d/51-android.rules。
按照下列格式將廠商添加至檔案:
SUBSYSTEM==usb, ATTR{idVendor}==, MODE=0666, GROUP=plugdev
註: 該規則文法可能根據您的環境而稍有不同。 可根據需要參閱您所用系統的 udev 文檔。 有關規則文法的概述,請參閱指南編寫 udev 規則。
現在執行:
chmod a+r /etc/udev/rules.d/51-android.rules
在通過 USB 插入時,可通過從 SDK platform-tools/ 目錄執行 adb devices 驗證裝置是否已串連。 如果已串連,將看到裝置名稱作為“裝置”列出。
對於 CDK 上引導的 Android 作業系統,將一根 USB-OTG 電纜連線至 CDK 上的(USB 微型 b)連接埠,將電纜的另一端 (USB A) 串連至開發主機。
如果一切都正常,就能夠運行以下命令看到已串連裝置:
$ adb devices
* daemon not running. starting it now *
* daemon started successfully *
List of devices attached
0123456789ABCDEF device
註: 要瞭解將哪個裝置名稱分配給了 Linux 開發主機上的該串連,可查看 dmesg 尋找“usb-storage: device found at ”的地址然後進行“ls -l /dev/bus/usb/*”列表來尋找該數字。
Windows 上的 ADB*
從 http://www.eclipse.org/downloads/ 下載並安裝 Eclipse Classic
從 http://developer.android.com/sdk/index.html 下載用於 Windows* 的 Android* SDK 包。 (android-sdk_r18-windows.zip 或 installer_r18-windows.exe)。
在安裝 Android* SDK 後,adb.exe 將位於 android-sdkplatform-tools
ADB 主機-用戶端通訊
至此我們關注的是在開發主機上安裝 ADB。 在現實中,它是用戶端-伺服器程式,具有三個組件:
一個用戶端,運行於開發主機上。 可通過執行 adb 命令從 shell 調用用戶端。 其他諸如 ADT 外掛程式和 DDMS 的 Android 工具也能建立 adb 用戶端。
一個伺服器,作為後台進程運行於開發主機上。 伺服器管理用戶端和運行於模擬器或裝置上的 adb 精靈之間的通訊。
一個精靈,作為後台進程運行於每個模擬器或裝置執行個體上。
在啟動 adb 用戶端時,用戶端會先檢查是否已經有 adb 伺服器處理序正在運行。 如果沒有,則會啟動伺服器處理序。 當伺服器啟動時,它會綁定至本地 TCP 通訊埠 5037 並監聽從 adb 用戶端發出的命令,所有 adb 用戶端都使用連接埠 5037 與 adb 伺服器通訊。
然後伺服器會建立與所有正在啟動並執行模擬器/裝置執行個體的串連。 它會通過在範圍 5555 至 5585(模擬器/裝置使用的範圍)中掃描奇數編號的連接埠找到模擬器/裝置執行個體。 在找到 adb 精靈處,建立與該連接埠之間的串連。 請注意,每個模擬器/裝置執行個體擷取一對序列連接埠 - 一個偶數編號的連接埠用於控制台串連,一個奇數編號的連接埠用於 adb 串連。 例如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557 ...
如樣本所示,在連接埠 5555 上串連至 adb 的模擬器執行個體與控制台監聽連接埠 5554 的執行個體相同。
一旦伺服器建立與所有模擬器執行個體之間的串連,就可使用 adb 命令來控制和訪問那些執行個體。 由於伺服器會管理指向模擬器/裝置執行個體的串連並處理來自多個 adb 用戶端的命令,您可通過任何用戶端(或指令碼)控制任何模擬器/裝置執行個體。
啟動 ADB
鍵入 adb shell。 將得到一個 # 號來指示串連成功。
$ adb shell
主要 ADB 裝置命令
下面所列的命令可協助將接受調試的應用程式從命令列轉移至目標裝置或類比裝置。 這點非常有用,尤其是在沒有 ssh 終端串連可用時。
adb push - copy file/dir to device
adb pull [] - copy file/dir from device
adb sync [ ] - copy host->device only if changed
(-l means list but don't copy)
(see 'adb help all')
adb shell - run remote shell interactively
adb shell
- run remote shell command<
adb emu
- run emulator console command<
adb logcat [ ] - View device log
adb forward - forward socket connections forward specs are one of:<tcp:>
localabstract:name>
localreserved:name>
localfilesystem:
dev:
jdwp: (remote only)
adb jdwp - list PIDs of processes hosting a JDWP transport
adb install [-l] [-r] [-s] - push this package file to the device and install it
('-l' means forward-lock the app)
('-r' means reinstall the app, keeping its data)
('-s' means install on SD card instead of internal storage)
adb uninstall [-k] - remove this app package from device
('-k' means keep the data and cache directories)
有關 adb 設定和使用的詳細資料請參閱 http://developer.android.com/guide/developing/tools/adb.html
藉助 GDB* - The GNU Project Debugger 調試 C/C++ 原生代碼
在使用 GDB 進行調試時,運行於裝置上的 gdbserver 用於處理調試通訊,但您仍可將基本 USB 轉乙太網路適配器用於 ADB 以處理通訊傳輸層,在該層上 gdbserver 藉助 tcp/ip 協議並在 GDB 運行於開發主機上的情況下進行通訊。
有一個 gdbclient 應用程式,其可設定調試通訊環境並在進行程式調試的裝置上啟動 gdbserver。
usage: gdbclient EXECUTABLE :PORT [PROG_PATH]
EXECUTABLE executable name (default app_process)
PORT commection port (default :1234)
PROG_PATH executable full path on target (ex /system/bin/mediaserver)
如果設定了 PROG_PATH,gdclient 會嘗試啟動 gdbserver 並將其附加至啟動並執行 PROG_PATH
要明確啟動 gdbserver,可使用以下命令
# gdbserver :1234 --attach 269
Attached; pid = 269
Listening on port 1234
下面的逐步偵錯工作階段啟動指令展示了 ADB 如何在將 GDB 而非 ADT 或 DDMS 用於調試的情況下仍然作為調試通訊的基礎。 讓我們假定使用的是連接埠 1234。
啟動進程:
gdbserver :1234 /system/bin/executable
或附加至現有進程:
gdbserver :1234 --attach pid
在您的工作站上,使用 adb 將連接埠 1234 轉寄至裝置:
adb forward tcp:1234 tcp:1234
啟動位於原始碼樹 prebuilt 地區中的特殊版本 gdb:
prebuilt/Linux/toolchain-eabi-4.x.x/bin/i686-android-linux-gdb (for Linux)
prebuilt/darwin-x86/toolchain-eabi-4.x.x/bin/i686-android-linux-gdb (for Darwin)
如果兩個特殊版本的 gdb 都無法找到,運行 find prebuilt -name i686-android-linux-gdbin your source tree 來尋找並運行最新版本。
務必使用符號目錄中而非主要 android 目錄中可執行檔的副本,因為主要目錄中的副本已去除了符號資訊。
在 GDB 中,告知 GDB 何處尋找將要載入的共用庫:
set solib-absolute-prefix /absolute-source-path/out/target/product/product-name/symbols
set solib-search-path /absolute-source-path/out/target/product/product-name/symbols/system/lib
absolute-source-path 為您的原始碼樹的路徑。
確保指定正確的目錄 – 如果您弄錯目錄 GDB 可能不會告知您。
通過發出 GDB 命令串連至裝置:
(gdb) target remote :1234
:1234 告知 gdb 串連至本地主機連接埠 1234,後者通過 adb 橋接至裝置。
現在可以用和之前相同的方式使用 GDB 開始調試運行於 Android* 上的 C/C++ 代碼。
有關詳細資料,請參閱文檔 GDB* - The GNU Project Debugger。
使用 Eclipse* 的 ADT* 外掛程式來調試 Android* 應用程式
對於基於英特爾® 架構的裝置,設定流程可參照下列類似連結:http://developer.android.com/sdk/eclipse-adt.html#installing。
對於基於英特爾® 架構的模擬器以及目標裝置,ADT* 外掛程式可提供完整的整合 Eclipse* IDE 的應用程式調試。 它使用不同的功能集提供兩種不同的調試視圖。
您可根據需要選用其中一個,在調試應用程式時二者都可提供不同的強度。
Eclipse 中的調試視圖*
Eclipse 中調試視圖可讓您訪問以下選項卡:
調試 – 顯示之前和當前調試的 Android 應用程式及其當前啟動並執行線程
變數 – 在設定了斷點時,顯示代碼執行期間的變數值
斷點 – 顯示您的應用程式代碼中設定的斷點列表
LogCat – 可讓您即時查看系統日誌資訊。 LogCat 選項卡也可在 DDMS 視圖中使用。
通過單擊 Window(視窗)> Open Perspective(開啟視圖)> Debug(調試)可訪問調試視圖。 有關 Eclipse 偵錯工具的詳細資料,請參閱相應文檔。
DDMS 視圖
Eclipse 中的 DDMS 視圖可讓您在 Eclipse IDE 中訪問 DDMS 的所有功能。 您可使用 DDMS 的以下部分:
裝置 – 顯示串連至 ADB 的裝置和 AVD 列表。
模擬器控制 – 讓您執行裝置功能。
LogCat – 讓您即時查看系統日誌資訊。
線程 – 顯示虛擬機器中當前啟動並執行線程。
堆區 – 顯示虛擬機器的堆區使用。
分配跟蹤器 – 顯示對象的記憶體配置。
檔案管理工具 – 可讓您探索裝置的檔案系統。
用於調試的應用程式運行時環境
調試為基於英特爾® 架構的裝置設計的 Android* 應用程式的不同之處在於何時設定偵錯目標裝置。
使用屬於 Android* SDK 一部分的 Android* 虛擬設備管理器選擇目標裝置,轉到 Eclipse* IDE 下拉式功能表中的 Window(視窗)> AVD Manager(AVD 管理器)。 在此您需要確保選擇英特爾淩動作為作業系統鏡像和裝置類比的 EABI 目標。
如果遵照本文開始概述的有關設定 ADB* 和建立指向物理裝置的調試橋的步驟,就會看到 Eclipse IDE 中的裝置選取器介面,從中可選擇用於應用程式開發和調試的目標。
除此之外,為基於英特爾® 架構的裝置設計的 Android* 應用程式和為 ARM* 架構設計的 Android* 應用程式在調試上確實存在著差別。
http://developer.android.com/guide/developing/debugging/index.html 中概述的內容都適合供您參考。