FROM:

http://blog.csdn.net/thl789/article/details/8033282


本文讲解如何在Eclipse中导入Android源代码(包括Framework和Application的代码),然后通过模拟器或真机跟踪/调试Android的Java代码,区别于一般基于Android SDK的纯应用开发,这里可以跟踪/调试Framework中的代码。


一、准备工作


确保机器上已经安装并配置下列软件环境: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源码路径下的development\ide\eclipse中的.classpath文件复制到下;如果需要在模拟器中进行调试的话,需要复制三个img(具体方法见http://wenku.baidu.com/view/26d9063c87c24028915fc366.html)

2. 修改Eclipse的设置

修改eclipse.ini文件,更改下列内容:

[plain] view plain copy
  1. -Xms40m
  2. -Xmx384m

改为:

[java] view plain copy
  1. -Xms128m
  2. -Xmx512m

这里增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。

三、Eclipse中创建工程

1. File > New > Java Project


2. 输入项目名

3. 取消Use default location,并在Location中输入或选择Android源码路径

4. 选择Next > Finish。会有一个漫长的等待过程

新建的工程可能会有错误,根据错误提示,加入或者删除项目中配置的程序包。

四、调试环境配置

1. 右击刚刚在#3中创建的项目;

2. 选择:Debug As > Debug Configurations…;

3. 右击“Remote Java Application”,选择New。或者直接双击“Remote Java Application”创建一个新的Remote Application。


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.在模拟器或真机上,执行到解锁操作时,代码就会停在断点处;


这样你就可以,

  • 把鼠标放在某个变量上,看它的值。也可以Eclipse中的各种调试手段调试你的代码。
  • 通过Step Into / Step Over / Resume / Suspend / Terminate等在Debug View中控制程序的执行。

总结


通过本文可以:

  • 本文讲解是基于Windows环境的,但是不仅适用于Windows环境,同样适用于Mac OS和Linux系统,只是一些路径和使用方式有差别;
  • 可以跟踪/调试所有Android中Java的源码(无论Framework的代码,还是App中的代码),并不能DebugFramework中的c/c++ code;
  • 为了使整个项目在Eclipse中都能编译过,.classpath中也包含了out/里编译生成的内容,所以必须保证Android源码是已经编译过的。
  • 跟踪/调试的前提是要在所要调试代码处设置断点,并知道该处代码执行在哪个进程中。


===================================================================================================================

如果导入的工程有错误,可以参照下面方法操作。

===================================================================================================================


我们导入一个android自带应用的工程时,往往有很多错误。以自带的 AlarmClock 为例,导入eclipse后,往往出现很多错误,如下图所示:

例如,上图中的Intent.ACTION_ALARM_CHANGED 无法访问,下面我们就找到源代码看看原因何在?

根据java 编程规范,我们知道这个api (静态变量)被隐藏掉了,所以在sdk中无法使用。在知道了原因之后,我们有几种解决方案(建议使用方法二):


1. 自己将源代码中的@hide去掉,然后编译一个sdk来替换默认的sdk。
在linux上使用 make PRODUCT-sdk-sdk 命令,编译一个新的sdk出来,注意编译后其实我们不需要整个sdk,只需要android.jar这个文件替换掉sdk里的android.jar,例如:笔者的sdk里的jar对应的目录为:
F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar
具体编译sdk的方法是,在linux编译环境下用命令 make PRODUCT-sdk-sdk ,成功后,会有如下提示:
Package SDK: out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86.zip
我们进入到 linux编译环境的out/host/linux-x86/sdk/android-sdk_eng.stevewang_linux-x86/platforms/android-2.2/目录下可以看到android.jar文件。使用此文件替换 F:/Program Files/Android/android-sdk-windows/platforms/android-8/android.jar 即可。替换前记得备份
此方法较为麻烦,建议使用方法二


2. 添加framework 编译出来的class.jar文件到 eclipse的build path
其实在编译android的时候,我们将framework 编译到一个临时的jar包中了,这个jar包的路径一般为:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
[font='dejavu]我们只需要在linux上android源代码目录下使用make 命令即可生成此文件。
[font='dejavu]
[font='dejavu]由于这个jar文件中的api 还没有重新打包,里面被@hide掉的api并没有被去掉。所以我们依然能够引用里面
[font='dejavu]被@hide的api 。而sdk 中的android.jar文件时重新打包生成的,其里标记有@hide的api已经被去掉了。
[font='dejavu]所以我们把out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar 拷贝到本地pc上。
然后在工程中添加此jar包。
具体方法:
1 . 拷贝linux编译生成的 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar到本机PC。
2,在eclipse的Android项目中,选择项目属性->Java Build Path->Libraries->Add Library->User Library->Next-> UserLibraries进入到User Libraries管理界面,点击New新建一个User Library,比如android_framework,点击Add Jars把Jar包加入到建立的User Library中,最后点击OK。
3.选择项目属性->Java Build Path->Order and Export,把所建立的User Libraries移到Android SDK的上面。

如下图:

之后我们的工程错误消失了:

到此问题基本解决。

转载自:http://www.bangchui.org/read.php?tid=274


也可参考:

http://wenku.baidu.com/view/26d9063c87c24028915fc366.html

http://www.eefocus.com/book/09-04/713771276059618.html



更多相关文章

  1. Android(安卓)AsyncTask 源码解析
  2. Android开发——Android(安卓)Studio下使用Cmake在NDK环境下移植
  3. 获取Android(安卓)ics源码
  4. android的makefile 特有的 dd
  5. Ubuntu编译ijkplayer支持https和更多视频格式
  6. Android(安卓)ijkplayer编译(支持https协议)
  7. Android(安卓)KitKat 4.4 使用Chrome DevTools 进行WebView远程
  8. 如何将Android(安卓)源码中编译出的apk进行自己的签名
  9. Android(安卓)Studio 编译缓存(Build Cache)

随机推荐

  1. 【Android】进程通信IPC——ContentProvi
  2. Android Studio中图片的格式转换
  3. 基于xmpp openfire smack开发之Android消
  4. Android Studio中src/main/res/values中s
  5. Android开发中的Handler线程初窥,及Handle
  6. android APP 获得system权限
  7. Android的Touch事件处理和手势
  8. android 权限定义的文件,位置
  9. Debian 5 Android 编译
  10. android后台执行定时任务(保活)&&使用Alarm