您的位置:首页 > 移动开发 > Android开发

Android* 操作系统上的应用程序远程调试

2016-04-25 15:54 344 查看
http://www.2cto.com/kf/201403/285484.htmlAndroid*操作系统应用程序远程调试Android*DebugBridgeAndroidDebugBridge(ADB)是一种命令行工具,可处理主机上的调试程序(通常为GDB*或DDMS*(Dalvik*调试监测程序服务器)以及ADT)和目标上运行的Android*映像之间的调试通信。目标映像可运行在模拟设备上或实体开发设备(通过USB-OTG(On-The-Go)或USB转以太网适配器与其通信)上。简而言之,ADB是一座桥梁,让调试Android*上的应用程序成为可能。您所连接或模拟的设备涉及大量形状因素。通常设备可能是智能手机或平板电脑。也可以是医疗用平板电脑或工业、家庭能源管理、仓储领域或任意数量智能系统应用程序的嵌入式设备。设置AndroidDebugBridge可让基于英特尔®凌动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.在AndroidManifest中将您的应用程序声明为“可调试”。在使用Eclipse时,可跳过该步骤,因为直接从EclipseIDE运行应用程序时会自动启用调试。在
AndroidManifest.xml
文件中将
android:debuggable=true
添加至
元素。注:如果在清单文件中手动启用调试,在进行构建以发布之前务必先禁用它(您发布的应用程序通常应该不可调试)。2.打开设备上的“USB调试”。在设备上,转至“设置>应用程序>开发”并启用“USB调试”(在Android4.0设备上,设置路径为“设置>开发人员选项”)。3.设置系统以检测设备。o如果在Windows上开发,则需要安装adb的USB驱动程序。有关安装指南和原始设备制造商驱动程序的链接,请参阅OEMUSBDrivers文档。o如果在MacOS*X上开发,则无需操作。可直接跳过该步骤。o如果在Ubuntu*Linux*上开发,则需要添加一个
udev
规则文件,该文件包含要用于开发的每种设备的USB配置。在规则文件中,通过唯一的供应商ID表示每个设备制造商,该ID通过
ATTR{idVendor}
属性指定。要查看供应商ID的列表,请参阅USBVendorIDs。要在UbuntuLinux上设置设备检测:以超级用户身份登录并创建该文件:
/etc/udev/rules.d/51-android.rules
。按照下列格式将厂商添加至文件:
SUBSYSTEM==usb,ATTR{idVendor}==,MODE=0666,GROUP=plugdev
注:该规则语法可能根据您的环境而稍有不同。可根据需要参阅您所用系统的
udev
文档。有关规则语法的概述,请参阅指南编写udev规则。现在执行:
chmoda+r/etc/udev/rules.d/51-android.rules
在通过USB插入时,可通过从
SDKplatform-tools/
目录执行
adbdevices
验证设备是否已连接。如果已连接,将看到设备名称作为“设备”列出。对于CDK上引导的Android操作系统,将一根USB-OTG电缆连接至CDK上的(USB微型b)端口,将电缆的另一端(USBA)连接至开发主机。如果一切都正常,就能够运行以下命令看到已连接设备:
$adbdevices
*daemonnotrunning.startingitnow*
*daemonstartedsuccessfully*
Listofdevicesattached
0123456789ABCDEFdevice
注:要了解将哪个设备名分配给了Linux开发主机上的该连接,可查看dmesg查找“usb-storage:devicefoundat”的地址然后进行“ls-l/dev/bus/usb/*”列表来查找该数字。Windows上的ADB*从http://www.eclipse.org/downloads/下载并安装EclipseClassic从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-toolsADB主机-客户端通信至此我们关注的是在开发主机上安装ADB。在现实中,它是客户端-服务器程序,具有三个组件:一个客户端,运行于开发主机上。可通过执行adb命令从shell调用客户端。其他诸如ADT插件和DDMS的Android工具也能创建adb客户端。一个服务器,作为后台进程运行于开发主机上。服务器管理客户端和运行于模拟器或设备上的adb守护程序之间的通信。一个守护程序,作为后台进程运行于每个模拟器或设备实例上。在启动adb客户端时,客户端会先检查是否已经有adb服务器进程正在运行。如果没有,则会启动服务器进程。当服务器启动时,它会绑定至本地TCP端口5037并监听从adb客户端发出的命令,所有adb客户端都使用端口5037与adb服务器通信。然后服务器会建立与所有正在运行的模拟器/设备实例的连接。它会通过在范围5555至5585(模拟器/设备使用的范围)中扫描奇数编号的端口找到模拟器/设备实例。在找到adb守护程序处,建立与该端口之间的连接。请注意,每个模拟器/设备实例获取一对序列端口-一个偶数编号的端口用于控制台连接,一个奇数编号的端口用于adb连接。例如:
Emulator1,console:5554
Emulator1,adb:5555
Emulator2,console:5556
Emulator2,adb:5557...
如示例所示,在端口5555上连接至adb的模拟器实例与控制台监听端口5554的实例相同。一旦服务器建立与所有模拟器实例之间的连接,就可使用adb命令来控制和访问那些实例。由于服务器会管理指向模拟器/设备实例的连接并处理来自多个adb客户端的命令,您可通过任何客户端(或脚本)控制任何模拟器/设备实例。启动ADB键入adbshell。将得到一个#号来指示连接成功。
$adbshell
主要ADB设备命令下面所列的命令可帮助将接受调试的应用程序从命令行转移至目标设备或模拟设备。这点非常有用,尤其是在没有ssh终端连接可用时。
adbpush-copyfile/dirtodevice
adbpull[]-copyfile/dirfromdevice
adbsync[]-copyhost->deviceonlyifchanged
(-lmeanslistbutdon'tcopy)
(see'adbhelpall')
adbshell-runremoteshellinteractively
adbshell
-runremoteshellcommand<
adbemu
-runemulatorconsolecommand<
adblogcat[]-Viewdevicelog
adbforward-forwardsocketconnections
forwardspecsareoneof:<
tcp:>
localabstract:name>
localreserved:name>[code]localfilesystem:
dev:
jdwp:(remoteonly)adbjdwp-listPIDsofprocesseshostingaJDWP
transport
adbinstall[-l][-r][-s]-pushthispackagefiletothe
deviceandinstallit
('-l'meansforward-locktheapp)
('-r'meansreinstalltheapp,keeping
itsdata)
('-s'meansinstallonSDcardinstead
ofinternalstorage)
adbuninstall[-k]-removethisapppackagefromdevice('-k'meanskeepthedataandcache
directories)
有关adb设置和使用的详细信息请参阅'target='_blank'>http://developer.android.com/guide/developing/tools/adb.html[/code]
借助GDB*-TheGNUProjectDebugger调试C/C++原生代码
在使用GDB进行调试时,运行于设备上的gdbserver用于处理调试通信,但您仍可将基本USB转以太网适配器用于ADB以处理通信传输层,在该层上gdbserver借助tcp/ip协议并在GDB运行于开发主机上的情况下进行通信。
有一个gdbclient应用程序,其可设置调试通信环境并在进行程序调试的设备上启动gdbserver。
usage:gdbclientEXECUTABLE:PORT[PROG_PATH]
EXECUTABLEexecutablename(defaultapp_process)
PORTcommectionport(default:1234)
PROG_PATHexecutablefullpathontarget(ex/system/bin/mediaserver)
如果设置了PROG_PATH,gdclient会尝试启动gdbserver并将其附加至运行的PROG_PATH
要明确启动gdbserver,可使用以下命令
#gdbserver:1234--attach269
Attached;pid=269
Listeningonport1234
下面的逐步调试会话启动指令展示了ADB如何在将GDB而非ADT或DDMS用于调试的情况下仍然作为调试通信的基础。让我们假定使用的是端口1234。
启动进程:
gdbserver:1234/system/bin/executable
或附加至现有进程:
gdbserver:1234--attachpid
在您的工作站上,使用adb将端口1234转发至设备:
adbforwardtcp:1234tcp:1234
启动位于源代码树prebuilt区域中的特殊版本gdb:
prebuilt/Linux/toolchain-eabi-4.x.x/bin/i686-android-linux-gdb(forLinux)
prebuilt/darwin-x86/toolchain-eabi-4.x.x/bin/i686-android-linux-gdb(forDarwin)
如果两个特殊版本的gdb都无法找到,运行findprebuilt-namei686-android-linux-gdbinyoursourcetree来查找并运行最新版本。
务必使用符号目录中而非主要android目录中可执行文件的副本,因为主要目录中的副本已去除了符号信息。
在GDB中,告知GDB何处查找将要加载的共享库:
setsolib-absolute-prefix/absolute-source-path/out/target/product/product-name/symbols
setsolib-search-path/absolute-source-path/out/target/product/product-name/symbols/system/lib
absolute-source-path为您的源代码树的路径。
确保指定正确的目录–如果您弄错目录GDB可能不会告知您。
通过发出GDB命令连接至设备:
(gdb)targetremote:1234
:1234告知gdb连接至本地主机端口1234,后者通过adb桥接至设备。
现在可以用和之前相同的方式使用GDB开始调试运行于Android*上的C/C++代码。
有关详细信息,请参阅文档GDB*-TheGNUProjectDebugger。
使用Eclipse*的ADT*插件来调试Android*应用程序
对于基于英特尔®架构的设备,设置流程可参照下列类似链接:http://developer.android.com/sdk/eclipse-adt.html#installing。
对于基于英特尔®架构的模拟器以及目标设备,ADT*插件可提供完整的集成Eclipse*IDE的应用程序调试。它使用不同的功能集提供两种不同的调试视图。
您可根据需要选用其中一个,在调试应用程序时二者都可提供不同的强度。
Eclipse中的调试视图*
Eclipse中调试视图可让您访问以下选项卡:
调试–显示之前和当前调试的Android应用程序及其当前运行的线程
变量–在设置了断点时,显示代码执行期间的变量值
断点–显示您的应用程序代码中设置的断点列表
LogCat–可让您实时查看系统日志信息。LogCat选项卡也可在DDMS视图中使用。
通过单击Window(窗口)>OpenPerspective(打开视图)>Debug(调试)可访问调试视图。有关Eclipse调试程序的详细信息,请参阅相应文档。
DDMS视图
Eclipse中的DDMS视图可让您在EclipseIDE中访问DDMS的所有功能。您可使用DDMS的以下部分:
设备–显示连接至ADB的设备和AVD列表。
模拟器控制–让您执行设备功能。
LogCat–让您实时查看系统日志信息。
线程–显示虚拟机中当前运行的线程。
堆区–显示虚拟机的堆区使用。
分配跟踪器–显示对象的内存分配。
文件管理器–可让您探索设备的文件系统。
用于调试的应用程序运行时环境
调试为基于英特尔®架构的设备设计的Android*应用程序的不同之处在于何时设置调试目标设备。
使用属于Android*SDK一部分的Android*虚拟设备管理器选择目标设备,转到Eclipse*IDE下拉菜单中的Window(窗口)>AVDManager(AVD管理器)。在此您需要确保选择英特尔凌动作为操作系统镜像和设备模拟的EABI目标。


如果遵照本文开始概述的有关设置ADB*和建立指向物理设备的调试桥的步骤,就会看到EclipseIDE中的设备选择器界面,从中可选择用于应用程序开发和调试的目标。


除此之外,为基于英特尔®架构的设备设计的Android*应用程序和为ARM*架构设计的Android*应用程序在调试上确实存在着差别。
http://developer.android.com/guide/developing/debugging/index.html中概述的内容都适合供您参考。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: