调试Android Java源码
草帽的后花园——Neo
写在之前的话:这里主要是以调试Java源码为主,应该说是在system_process之后的源码,这对于调试和修改frameworks层的人来说真是一个利器,但至于为什么在system_process之后,我还在分析,如果有结果我会更新此文章,并正在尝试调试C++的代码,就是native中的代码,如果这个可行那将会大大的减少我们这些以修改源码为主的工作人员就轻松多了,目前还未开始,如果可行我会尽快发布,方法并非原创,仅仅是我成功测试了,所以分享。转载请注明来源,谢谢。(经过测试,如果系统编译成user版本的似乎不能调试)
1. 配置SDK开发环境
这个关于配置开发环境我就不多说了,由于工作时间原因,我会在后面加入关于windows下和linux下的开发环境配置的教程。这里的工作环境是windows xp,Eclipse 4.2,
SDK情况如下图:
2. 导入Android源码
我这里使用的代码是Android 4.1.2(主要是目前我公司暂时在开发4.1.2的平板),我就以4.1.2的源码为主,模拟器演示,真机就不演示了,原理是一样的。在这里,首先要确保一件事情就是你的源码要能编译通过才行,编译源码的教程网上有很多,后面我也会再做一份自己理解的教程。
2.1. 启动Eclipse
这个就不详述了,免得罗嗦,直接点图标。启动后如图所示:
2.2. 新建Java工程
点击左上角的FileàNewàJavaProject,新建一个Java的工程。首先说明下,我的代码之前就可以编译通过,根目录路径为:U: eoandroid_4.1.24.1.2。
然后会进入下面的这个界面
2.3. 选择导入的源码
在导入之前我们需要做一个事情,就是减少源码导入的量过大,我们可以把源码中的一个文件拷贝到源码根目录下,该文件的路径是:(U: eoandroid_4.1.24.1.2developmentideeclipse.classpath),看不到的话就把所有隐藏的文件显示出来,如图所示:
复制过去:
现在我们需要选择要导入的源码,location处为我们所要导入的源码路径(这里注意是根目录哦,源码根目录~~),输入project name:Android4.1.2,去掉Use defaultlocation的勾,结果如图所示:
然后点next,就会导入了,导入大概需要十几分钟吧,等待等待,呵呵。
导入完毕之后的图:
Finish之后就OK了。
工程代码:
3. 设置连接的端口
其实就是通过远程来调试,设置一个socket的端口,操作过程如图:
进入debugConfigurations时双击Remote Java Application新建一个远程调试并将端口号改为8600(这里需要做的是输入你要调试的进程的端口号,这里我附上一张后面的图,以便解释,每个进程启动后都有一个端口号,如图,若要针对调试就需要设置好端口号才会进入,后面的图,例如要调settings,那么就把端口号设置为8604),且common栏中的debug打钩。
点击Apply即可。
4. 启动真机或者模拟器
连接真机或者模拟器,我只连接模拟器了,真机也已经测试,是可行的。
首先要新建一个模拟器(平板效果图的模拟器),步骤如图所示:
在window->AVDManager中,选择新建
填满内容,这里要注意:Resolution设置为1280x800的,下面的AbstractedLCD density要设置成160,这样才显示的是平板。
点Create AVD即可。启动刚才建立的模拟器。
模拟器已经在启动
5. 设置断点
模拟器启动比较慢,我们先设置好断点,根据启动流程(这个需要自己理解下了),我在所有服务启动之前加入了断点,断点设置在frameworks/base/services/java/com/android/server/SystemServer.java的第775行,即在run()启动的第一句话,后面的代码都是为了启动各种服务。
设置好断点后,开始连接模拟器。
6. 开始调试
接下来就是进行调试了,启动过程中我们在DDMS中可以看到,设备刚开始是offline的,等设备处于online状态时,我们启动刚才设置好的debug。
点了debug后,这时会看到有只小虫子粘在了system_process进程上,这说明已经可以调试了。
稍等会就会进入到我们刚才设置的断点处了。
效果就是这样,调试的步骤这个就不多说了,也可以在这里查看变量的值,以及修改内存中的值,以便调试。(其实说实话解释型的语言更好调试,编译型的好不爽,好歹还能修改下内存的值)。
调试过程就是如此了,这里只做了一个小小的演示,相信多的不用再说了,做为IT新手的我不可能写的太详细,如有疏漏请见谅。其实通过这个还看观察到系统的部分启动过程,可以调launcher、Setting等frameworks下面的东东,如果大家有好方法请互相共享,谢谢。