《深入理解Android:卷III A》一一1.4调试Android源代码

1.4调试Android源代码

调试是分析问题与印证对代码的理解的最有效手段,对Android这种复杂而庞大的系统来说尤为如此。Android的源代码主要由Java代码以及C/C++代码构成,因此调试Android源代码需要从Java的调试以及C/C++的调试两个方面说起。
1.4.1使用Eclipse调试Android Java源代码
由于Android源代码是以一个普通的Java工程的方式导入的,于是在Eclipse中不能通过ADT所提供的DDMS直接对其进行远程调试。
1)首先需要通过DDMS获取调试进程的端口号。将设备通过USB连接PC,然后打开Eclipse的DDMS视图。在视图左侧Device进程列表中可以找到对应进程的调试端口号,如图1-7所示。

图 1-7获取调试目标进程的端口号
2)回到Java视图,在Package Explorer中,用右键点击Android源代码所在的项目,在菜单中依次选择“Debug As→Debug Configurations”。在弹出的对话框中通过双击Remote Java Application新建一个远程调试配置。编辑Host为“localhost”,Port为调试进程的端口号之后点击Apply按钮保存配置。最后点击Debug按钮即可将Eclipse调试器绑定到对应的进程上,如图1-8所示。

图1-8启动对目标进程的远程调试
完成上述步骤后就可以通过Eclipse的Debug视图调试进程了。
在点击Debug进行调试时,Eclipse可能会提示代码中存在错误(最常见的原因是注释掉了.classpatch中的代码路径而导致引用解析失败)。不过不用理会,直接点击Proceed按钮继续调试即可。
导入Eclipse中的源代码可能运行在任何一个进程中,这份源代码可以对设备中任何一个Java进程进行调试。本书所介绍的各种系统服务均运行在system_server进程中,而其他的内容如SystemUI、WallpaperService则运行在其他的进程里。因此,读者需要注意正确选择调试目标进程。
1.4.2使用gdb调试Android C/C++源代码
下面介绍使用gdb调试C/C++代码的步骤。
首先通过adb shell ps获取需要进行调试的进程号,比如795。然后通过执行adb shell进入手机端的shell。
输入gdbserver :5039 --attach 795并执行。其中5039是端口号,795是待调试的进程号。于是gdbserver便会绑定在795进程上,并通过5039端口与PC端的调试器进行通信。
保持gdbserver运行,然后回到PC端执行adb forward tcp:5039 tcp:5039。这个命令可以在设备上的5039端口与PC上的5039端口之间建立一个映射。于是PC端的调试器可以通过本机的5039端口与设备上的gdbserver进行通信。
接下来便需要运行Android源代码中附带的复合设备及其架构的gdb工具,并连接到本机的5039端口进行调试。对ARM架构来说,这个工具为prebuilts/gcc/linux-x86/arm/arm-eabi-4.X/bin/ arm-eabi-gdb。
Android源代码中提供了用于ARM、x86以及MIPS等目标机器架构的编译工具链。
倘若读者不清楚需要使用哪种机器架构下的编译工具链,可以先完成代码编译时source build/envsetup.sh以及choosecombo的执行以确定目标设备的类型。这样一来Android编译系统会将目标设备使用的机器架构对应的编译工具链所在的路径加入PATH环境变量中。然后就可以通过echo $PATH得知用于当前设备的编译工具链所在的路径,进而得知机器架构的类型。
进入gdb之后,依次执行如下命令:

连接本机的5039端口,进而连接到运行在设备中的gdbserver

target remote :5039

指定调试进程可执行文件的路径。注意需要选择编译结果中symbols路径下的文件。这些文件中保存了

用于进行调试的符号表

file out/target/product//symbols/system/bin/

设置用于搜索so文件的路径。注意需要选择编译结果中symbols路径下的so文件所在的路径。读者

可以从out/target/product//XXXgdb.cmds文件中的内容中得知这个路径

set solib-search-path ......
之后便可以开始使用gdb的命令调试795进程了。
倘若读者觉得使用上述步骤进行调试比较繁复,可以使用Android源代码中所提供的gdbclient工具。gdbclient是定义在build/envsetup.sh中的一个Shell函数,它会根据choosecombo的结果判断可执行文件的路径以及so文件的路径,并自动完成上文所述的工作。因此,使用它之前必须完成source build/envsetup以及choosecombo的执行。使用gdbclient调试一个进程的方法如下:
gdbclient <可执行文件名> :<端口号> <进程号>
例如,调试795的mediaserver进程可以使用如下命令:
gdbclient mediaserver :5039 795
另外,倘若使用gdb调试Java进程中的C/C++代码,需要使用app_process作为可执行文件进行调试。

时间: 2025-01-01 17:01:31

《深入理解Android:卷III A》一一1.4调试Android源代码的相关文章

《深入理解Android:卷III A》一一1.1获取Android源代码

1.1获取Android源代码 在深入研究Android之前,首先必须获得一套Android的源代码.Google提供官方Android源代码的获取方法如下:https://source.android.com/source/downloading.html 这个页面介绍了使用repo脚本进行Android源码的下载的两个基本步骤. 1)首先通过repo init命令将当前文件夹初始化为repo脚本的工作区.其命令格式如下: repo init -u -b <分支名称> repo init命令

《Android的设计与实现:卷I》——第1章 Android体系结构及源代码阅读环境搭建 1.1 Android发展过程

第1章 Android体系结构及源代码阅读环境搭建 Android是Google于2007年11月5日发布的基于Linux内核的开源移动设备软件平台,该平台由操作系统.虚拟机.运行库.框架.应用软件以及开发工具组成. 1.1 Android发展过程 Android自 Android 1.5开始,以甜点作为平台版本代号,并且各代号首字母以C D E F G H I J顺序排列.Android自发布以来,经过数个版本的更新和完善,已成为最大的智能手机平台之一.Android的发展过程如表 截至201

《OpenGL ES应用开发实践指南:Android卷》—— 1.3 初始化OpenGL

1.3 初始化OpenGL 下一步就是使用一个特殊的类GLSurfaceView初始化OpenGL.GLSurfaceView会处理OpenGL初始化过程中比较基本的操作,如配置显示设备(display)以及在后台线程中渲染:渲染是在显示设备中一个称为"surface"的特定区域完成的,有时也称为视口(viewport).GLSurfaceView类也使得处理标准Android Activity生命周期变得容易了:在Android里,任何Activity都可以创建(create)和销毁

《OpenGL ES应用开发实践指南:Android卷》—— 2.2 不要从头开始

2.2 不要从头开始 我们可以重用第1章的项目作为起点.1.在Eclipse里,选择"FirstOpenGLProject",要确保项目是打开的,然后按"Ctrl+C"快捷键:再按"Ctrl+V"快捷键复制这个项目.2.出现提示框时,输入"AirHockey1"作为项目名,你可以自己选择项目目录.3.打开新项目,展开"src"文件夹,找到我们在第1章中定义的两个类文件:FirstOpenGLProjectA

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动

Android群英传笔记——第六章:Android绘图机制与处理技巧

Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效率也确实有点低了,自己还要加把劲,争取四月底全部看完,第六章讲的是Android的绘图机制,应该算是比较核心的东西了,不管什么功能,最终都是以图形的方式呈现给用户的,因此,掌握Android的绘图技巧,可以在让你设计应用的时候更加的随心所欲,对Android的理解更高 基本的绘图方法,相信读者都已经

Android零基础入门第1节:Android的前世今生

原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来方便后期学习. 这一系列资料从最初的Android认识到Android高级开发,会免费共享出来分享给大家,包括中间会涉及到的一些源码.今天这是开篇,赶紧上车一起来聊一聊Android的前世今生.   一.IT行业发展几个阶段   IT行业是个年轻的行业,共总也才60多年时间,大致分为硬件.软件.互联

Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?

原文:Android菜鸟的成长笔记(5)--Android系统源代码你下载了吗? 在上一篇中我们用Android系统源代码分析了我们前面写的代码,有的朋友可能就会问怎么才能下载到Google官方的源代码呢?下面我们通过Git管理工具来对Android系统源代码进行下载.另外为了方便有的朋友下载,我将下载好的各个版本的源码存放到360云盘,云盘下载链接如下: http://yunpan.cn/QDEkq3uFrbvrI (访问密码:968e) 首先下载Git版本管理工具:下载地址:http://c

Android群英传笔记——第五章:Android Scroll分析

Android群英传笔记--第五章:Android Scroll分析 滑动事件算是Android比较常用的效果了,而且滑动事件他本身也是有许多的知识点,今天,我们就一起来耍耍Scroll吧 一.滑动效果是如何产生的 滑动一个View的本质其实就是移动一个View,改变其当钱所在的位置,他的原理和动画效果十分的相似,就是通过不断的改变View的坐标来实现这一效果,动态且不断的改变View的坐标,从而实现View跟随用户触摸滑动而滑动 但是在讲解滑动效果之前,需要先了解一下Android中窗口坐标体