调试Android Java源码

草帽的后花园——Neo

经过测试,如果系统编译成user版本的似乎不能调试)



1.     配置SDK开发环境

这个关于配置开发环境我就不多说了,由于工作时间原因,我会在后面加入关于windows下和linux下的开发环境配置的教程。这里的工作环境是windows xp,Eclipse 4.2,

SDK情况如下图:

Android 11 修改源码root 调试android源码_Android 11 修改源码root

2.     导入Android源码

我这里使用的代码是Android 4.1.2(主要是目前我公司暂时在开发4.1.2的平板),我就以4.1.2的源码为主,模拟器演示,真机就不演示了,原理是一样的。在这里,首先要确保一件事情就是你的源码要能编译通过才行,编译源码的教程网上有很多,后面我也会再做一份自己理解的教程。

2.1.          启动Eclipse

这个就不详述了,免得罗嗦,直接点图标。启动后如图所示:

Android 11 修改源码root 调试android源码_Android 11 修改源码root_02

2.2.          新建Java工程

点击左上角的FileàNewàJavaProject,新建一个Java的工程。首先说明下,我的代码之前就可以编译通过,根目录路径为:U:\neo\android_4.1.2\4.1.2。

Android 11 修改源码root 调试android源码_Java_03

然后会进入下面的这个界面

Android 11 修改源码root 调试android源码_Android 11 修改源码root_04

2.3.          选择导入的源码

在导入之前我们需要做一个事情,就是减少源码导入的量过大,我们可以把源码中的一个文件拷贝到源码根目录下,该文件的路径是:(U:\neo\android_4.1.2\4.1.2\development\ide\eclipse\.classpath),看不到的话就把所有隐藏的文件显示出来,如图所示:

Android 11 修改源码root 调试android源码_端口号_05

复制过去:

Android 11 修改源码root 调试android源码_根目录_06

现在我们需要选择要导入的源码,location处为我们所要导入的源码路径(这里注意是根目录哦,源码根目录~~),输入project name:Android4.1.2,去掉Use defaultlocation的勾,结果如图所示:

Android 11 修改源码root 调试android源码_Java_07

然后点next,就会导入了,导入大概需要十几分钟吧,等待等待,呵呵。

导入完毕之后的图:

Android 11 修改源码root 调试android源码_端口号_08

Finish之后就OK了。

工程代码:

Android 11 修改源码root 调试android源码_Android 11 修改源码root_09

3.     设置连接的端口

其实就是通过远程来调试,设置一个socket的端口,操作过程如图:

Android 11 修改源码root 调试android源码_端口号_10

Android 11 修改源码root 调试android源码_Java_11

进入debugConfigurations时双击Remote Java Application新建一个远程调试并将端口号改为8600(这里需要做的是输入你要调试的进程的端口号,这里我附上一张后面的图,以便解释,每个进程启动后都有一个端口号,如图,若要针对调试就需要设置好端口号才会进入,后面的图,例如要调settings,那么就把端口号设置为8604),且common栏中的debug打钩。

Android 11 修改源码root 调试android源码_Java_12

Android 11 修改源码root 调试android源码_Java_13

Android 11 修改源码root 调试android源码_端口号_14

         点击Apply即可。

4.     启动真机或者模拟器

连接真机或者模拟器,我只连接模拟器了,真机也已经测试,是可行的。

首先要新建一个模拟器(平板效果图的模拟器),步骤如图所示:

Android 11 修改源码root 调试android源码_Android 11 修改源码root_15

Android 11 修改源码root 调试android源码_Android 11 修改源码root_16

在window->AVDManager中,选择新建

Android 11 修改源码root 调试android源码_根目录_17

填满内容,这里要注意:Resolution设置为1280x800的,下面的AbstractedLCD density要设置成160,这样才显示的是平板。

Android 11 修改源码root 调试android源码_Java_18

点Create AVD即可。启动刚才建立的模拟器。

Android 11 修改源码root 调试android源码_Android 11 修改源码root_19

模拟器已经在启动

Android 11 修改源码root 调试android源码_Java_20

5.     设置断点

模拟器启动比较慢,我们先设置好断点,根据启动流程(这个需要自己理解下了),我在所有服务启动之前加入了断点,断点设置在frameworks/base/services/java/com/android/server/SystemServer.java的第775行,即在run()启动的第一句话,后面的代码都是为了启动各种服务。

Android 11 修改源码root 调试android源码_Android 11 修改源码root_21

Android 11 修改源码root 调试android源码_Java_22

设置好断点后,开始连接模拟器。

6.     开始调试

接下来就是进行调试了,启动过程中我们在DDMS中可以看到,设备刚开始是offline的,等设备处于online状态时,我们启动刚才设置好的debug。

Android 11 修改源码root 调试android源码_根目录_23

Android 11 修改源码root 调试android源码_Android 11 修改源码root_24

Android 11 修改源码root 调试android源码_端口号_25

点了debug后,这时会看到有只小虫子粘在了system_process进程上,这说明已经可以调试了。

Android 11 修改源码root 调试android源码_Android 11 修改源码root_26

稍等会就会进入到我们刚才设置的断点处了。

Android 11 修改源码root 调试android源码_Java_27

效果就是这样,调试的步骤这个就不多说了,也可以在这里查看变量的值,以及修改内存中的值,以便调试。(其实说实话解释型的语言更好调试,编译型的好不爽,好歹还能修改下内存的值)。

Android 11 修改源码root 调试android源码_根目录_28

调试过程就是如此了,这里只做了一个小小的演示,相信多的不用再说了,做为IT新手的我不可能写的太详细,如有疏漏请见谅。其实通过这个还看观察到系统的部分启动过程,可以调launcher、Setting等frameworks下面的东东,如果大家有好方法请互相共享,谢谢。