Eclipse中跟踪调试Android源代码
2014-05-07 14:09
148 查看
本文讲解如何在Eclipse中导入Android源代码(包括Framework和Application的代码),然后通过模拟器或真机跟踪/调试Android的Java代码,区别于一般基于Android SDK的纯应用开发,这里可以跟踪/调试Framework中的代码。
即,机器上已经安装了Eclipse下Android应用开发所需的环境。如果还未配置,移步《搭建Windows下Android应用开发环境——Eclipse/Android/ADT》。
另外,为了跟踪调试Android源码,你还需要有Android源码,并有源码的编译环境,可以是:
虚拟机环境 虚拟机中安装Linux,Linux下编译Android源码。此环境下,如果要在宿主机的Eclipse中调试,还需要把Android的源码路径共享出来,宿主机可访问到;
有单独的可编译Android的网络环境 在你的客户端的机器上访问服务器共享出来的Android的源码路径;
Linux环境下直接通过Eclipse跟踪调试本机上的Android源码。
注意:不管哪种工作方式,Android源码要都是已经编译过的,且编译时采用的是Eng模式(vs User mode)。编译Android Platform和Kernel的过程,可参考《Ubuntu10.10下编译Android2.2平台》及《Ubuntu10.10下编译Android2.2内核》。
1. 把Android源码路径<Android_ROOT>下的development\ide\eclipse中的.classpath(隐藏的)文件复制到<Android_ROOT>下;
2. 修改Eclipse的设置
修改eclipse.ini文件,更改下列内容:
[plain] view
plaincopy
-Xms40m
-Xmx384m
改为:
[java] view
plaincopy
-Xms128m
-Xmx512m
这里增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。
![](http://img.my.csdn.net/uploads/201209/29/1348922679_4279.png)
2. 输入项目名
3. 取消Use default location,并在Location中输入或选择Android源码路径<Android_ROOT>
4. 选择Next > Finish。会有一个漫长的等待过程
新建的工程可能会有错误,根据错误提示,加入或者删除项目中配置的程序包。
2. 选择:Debug As > Debug Configurations…;
3. 右击“Remote Java Application”,选择New。或者直接双击“Remote Java Application”创建一个新的Remote Application。
![](http://img.my.csdn.net/uploads/201209/29/1348922821_2804.png)
4. 填入Name;Project选择刚刚创建的项目Android2.3.7;端口填写8700(不一定是8700,到DDMS Perspective下的Device View中看所需的端口号)。
5. Apply保存,然后退出。
无论模拟器还是真机,都要:
先启动机器(模拟器启动,或真机打开,并通过USB与PC正常连接),也就是要在DDMS Perspective的Devices视图中看到有机器连接;
确保运行中的代码与你要调试的代码是一样的。
假如,我们想要跟踪锁屏解锁的调用情况。
我们知道解锁的实现是在LockScreen.java的onGrabbedStateChange()函数,运行在system_process进程中。
那么,
1. 在onGrabbedStateChange()中要调试的地方设置断点;
2. 在Device View中,选中system_process,并点击小爬虫图标;
3. 用Section#4创建的Debug配置,Debug;
4. 在模拟器或真机上,执行到解锁操作时,代码就会停在断点处;
![](http://img.my.csdn.net/uploads/201209/29/1348923080_6553.png)
这样你就可以,
把鼠标放在某个变量上,看它的值。也可以Eclipse中的各种调试手段调试你的代码。
通过Step Into / Step Over / Resume / Suspend / Terminate等在Debug View中控制程序的执行。
本文讲解是基于Windows环境的,但是不仅适用于Windows环境,同样适用于Mac OS和Linux系统,只是一些路径和使用方式有差别;
可以跟踪/调试所有Android中Java的源码(无论Framework的代码,还是App中的代码),并不能Debug Framework中的c/c++ code;
为了使整个项目在Eclipse中都能编译过,.classpath中也包含了out/里编译生成的内容,所以必须保证Android源码是已经编译过的。
跟踪/调试的前提是要在所要调试代码处设置断点,并知道该处代码执行在哪个进程中。
查看Eclipse左侧的Package Explorer窗口,可以看到AndroidFramework源码被导入进来了,如图x-x所示。
![](http://img.blog.csdn.net/20140311114416593?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx输入Android源码
源码级调试Android应用程序:
在开始调试之前,要保证上一步中Android源码工程编译完没有错误。
新建一个HelloWorld应用程序工程,在该工程上右键选择菜单Debug As->Debug Configurations ->Remote Java Application,右键点击New,在右侧窗口中Project选择刚才添加到工程中的Android源码工程:android_source,点击Apply应用设置。
打开HelloWorld源码文件,将断点设置在super.onCreate()方法上,点击调试按钮,开始调试。
![](http://img.blog.csdn.net/20140311114459156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx配置调试信息
![](http://img.blog.csdn.net/20140311114513953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx配置调试信息
![](http://img.blog.csdn.net/20140311114526171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx配置调试信息
当点击F5(Step Into)进入框架层代码时,会显示“Sourcenot found。”,选择“EditSource LookupPath…”,在新窗口中单击Add按钮,选择Java Project,选择android_source工程,这样就可以看到框架层代码了,如图xx-xx所示。
![](http://img.blog.csdn.net/20140311114640687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx设置源码目录
![](http://img.blog.csdn.net/20140311114537875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx调试HelloWorld源码
调试系统级应用程序
首先在模拟器里打开要调试的应用程序,比如计算器Calculator,打开Window ->Open Perspective -> DDMS ,弹出DDMS调试窗口。在Devices窗口中选择Calculator的进程com.android.calculator2。
![](http://img.blog.csdn.net/20140311114901234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx 选择要调试的进程
打开Run ->Debug Configurations -> RemoteJava Application,右键点击New,配置Name为:Calculator,在右侧窗口中Project选择刚才添加到工程中的Android源码工程:android_source,调试Port端口设置为:8700(默认AVD调试端口)点击Apply应用设置。
![](http://img.blog.csdn.net/20140311114941093?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx 调试源码
再点击Debug,可以看到DDMS窗口中,com.android.calculator2进程前面出现了Debug标志,如图xx-xx所示。
![](http://img.blog.csdn.net/20140311115012812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx 调试Calculator源码
切换到Java视图,打开android_source工程中Calculator.java,在onCreate方法上设置断点,在模拟器里关闭刚才打开的Calculator,再次启动它,在Eclipse中就可以对Calculator进程进行调试了。
![](http://img.blog.csdn.net/20140311115040000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXJfcmFwdG9y/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
图 xx-xx 调试Calculator源码
一、准备工作
确保机器上已经安装并配置下列软件环境:JDK/ Eclipse / Android SDK / ADT即,机器上已经安装了Eclipse下Android应用开发所需的环境。如果还未配置,移步《搭建Windows下Android应用开发环境——Eclipse/Android/ADT》。
另外,为了跟踪调试Android源码,你还需要有Android源码,并有源码的编译环境,可以是:
虚拟机环境 虚拟机中安装Linux,Linux下编译Android源码。此环境下,如果要在宿主机的Eclipse中调试,还需要把Android的源码路径共享出来,宿主机可访问到;
有单独的可编译Android的网络环境 在你的客户端的机器上访问服务器共享出来的Android的源码路径;
Linux环境下直接通过Eclipse跟踪调试本机上的Android源码。
注意:不管哪种工作方式,Android源码要都是已经编译过的,且编译时采用的是Eng模式(vs User mode)。编译Android Platform和Kernel的过程,可参考《Ubuntu10.10下编译Android2.2平台》及《Ubuntu10.10下编译Android2.2内核》。
二、基本设置
准备工作完毕之后,现在做一些基本的设置。1. 把Android源码路径<Android_ROOT>下的development\ide\eclipse中的.classpath(隐藏的)文件复制到<Android_ROOT>下;
2. 修改Eclipse的设置
修改eclipse.ini文件,更改下列内容:
[plain] view
plaincopy
-Xms40m
-Xmx384m
改为:
[java] view
plaincopy
-Xms128m
-Xmx512m
这里增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。
三、Eclipse中创建工程
1. File > New > Java Project![](http://img.my.csdn.net/uploads/201209/29/1348922679_4279.png)
2. 输入项目名
3. 取消Use default location,并在Location中输入或选择Android源码路径<Android_ROOT>
4. 选择Next > Finish。会有一个漫长的等待过程
新建的工程可能会有错误,根据错误提示,加入或者删除项目中配置的程序包。
四、调试环境配置
1. 右击刚刚在#3中创建的项目;2. 选择:Debug As > Debug Configurations…;
3. 右击“Remote Java Application”,选择New。或者直接双击“Remote Java Application”创建一个新的Remote Application。
![](http://img.my.csdn.net/uploads/201209/29/1348922821_2804.png)
4. 填入Name;Project选择刚刚创建的项目Android2.3.7;端口填写8700(不一定是8700,到DDMS Perspective下的Device View中看所需的端口号)。
5. Apply保存,然后退出。
五、调试
可以通过模拟器或者真机调试。无论模拟器还是真机,都要:
先启动机器(模拟器启动,或真机打开,并通过USB与PC正常连接),也就是要在DDMS Perspective的Devices视图中看到有机器连接;
确保运行中的代码与你要调试的代码是一样的。
假如,我们想要跟踪锁屏解锁的调用情况。
我们知道解锁的实现是在LockScreen.java的onGrabbedStateChange()函数,运行在system_process进程中。
那么,
1. 在onGrabbedStateChange()中要调试的地方设置断点;
2. 在Device View中,选中system_process,并点击小爬虫图标;
3. 用Section#4创建的Debug配置,Debug;
4. 在模拟器或真机上,执行到解锁操作时,代码就会停在断点处;
![](http://img.my.csdn.net/uploads/201209/29/1348923080_6553.png)
这样你就可以,
把鼠标放在某个变量上,看它的值。也可以Eclipse中的各种调试手段调试你的代码。
通过Step Into / Step Over / Resume / Suspend / Terminate等在Debug View中控制程序的执行。
总结
通过本文可以:本文讲解是基于Windows环境的,但是不仅适用于Windows环境,同样适用于Mac OS和Linux系统,只是一些路径和使用方式有差别;
可以跟踪/调试所有Android中Java的源码(无论Framework的代码,还是App中的代码),并不能Debug Framework中的c/c++ code;
为了使整个项目在Eclipse中都能编译过,.classpath中也包含了out/里编译生成的内容,所以必须保证Android源码是已经编译过的。
跟踪/调试的前提是要在所要调试代码处设置断点,并知道该处代码执行在哪个进程中。
六、后续
重启eclipse,如果出现源码错误,说明项目配置文件.classpath里面的目录与源码中的目录不一致,将.classpath里的目录与源码目录匹配即可。查看Eclipse左侧的Package Explorer窗口,可以看到AndroidFramework源码被导入进来了,如图x-x所示。
图 xx-xx输入Android源码
源码级调试Android应用程序:
在开始调试之前,要保证上一步中Android源码工程编译完没有错误。
新建一个HelloWorld应用程序工程,在该工程上右键选择菜单Debug As->Debug Configurations ->Remote Java Application,右键点击New,在右侧窗口中Project选择刚才添加到工程中的Android源码工程:android_source,点击Apply应用设置。
打开HelloWorld源码文件,将断点设置在super.onCreate()方法上,点击调试按钮,开始调试。
图 xx-xx配置调试信息
图 xx-xx配置调试信息
图 xx-xx配置调试信息
当点击F5(Step Into)进入框架层代码时,会显示“Sourcenot found。”,选择“EditSource LookupPath…”,在新窗口中单击Add按钮,选择Java Project,选择android_source工程,这样就可以看到框架层代码了,如图xx-xx所示。
图 xx-xx设置源码目录
图 xx-xx调试HelloWorld源码
调试系统级应用程序
首先在模拟器里打开要调试的应用程序,比如计算器Calculator,打开Window ->Open Perspective -> DDMS ,弹出DDMS调试窗口。在Devices窗口中选择Calculator的进程com.android.calculator2。
图 xx-xx 选择要调试的进程
打开Run ->Debug Configurations -> RemoteJava Application,右键点击New,配置Name为:Calculator,在右侧窗口中Project选择刚才添加到工程中的Android源码工程:android_source,调试Port端口设置为:8700(默认AVD调试端口)点击Apply应用设置。
图 xx-xx 调试源码
再点击Debug,可以看到DDMS窗口中,com.android.calculator2进程前面出现了Debug标志,如图xx-xx所示。
图 xx-xx 调试Calculator源码
切换到Java视图,打开android_source工程中Calculator.java,在onCreate方法上设置断点,在模拟器里关闭刚才打开的Calculator,再次启动它,在Eclipse中就可以对Calculator进程进行调试了。
图 xx-xx 调试Calculator源码
相关文章推荐
- Android编译过程详解(三)
- 《Android应用性能优化》之读书笔记
- Android 上百个项目的源代码
- 在eclipse中查看Android源代码
- Android编译过程详解(二)
- Android使用主题属性引发的问题
- Android编译过程详解(一)
- android json解析及简单例子
- .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
- Android学习笔记(十)——使用意图链接活动
- (转)获取android手机内部存储空间和外部存储空间的参数 && 如何决定一个apk的安装位置
- 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法
- Android系统配置数据库注释(settings.db)
- Android4.0 Design之设计规范的十大革新
- android adb 源码框架分析(4 服务)
- android adb 源码框架分析(3 传输)
- android adb 源码框架分析(2 角色)
- android动态加载.so,实现动态库升级
- (转)Android 升级 ADT 之后报错之一 case语句 .
- android adb 源码框架分析(1 系统)