原文地址:http://blog.csdn.net/jinzhuojun/article/details/8868038
 
 

调试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:\neo\android_4.1.2\4.1.2。

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

2.3.          选择导入的源码

在导入之前我们需要做一个事情,就是减少源码导入的量过大,我们可以把源码中的一个文件拷贝到源码根目录下,该文件的路径是:(U:\neo\android_4.1.2\4.1.2\development\ide\eclipse\.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下面的东东,如果大家有好方法请互相共享,谢谢。

Android源码开发利器——Java源码调试(基于4.1.2)的更多相关文章

  1. 弧形菜单2(动画渐入)Kotlin开发(附带java源码)

    弧形菜单2(动画渐入+Kotlin开发) 前言:基于AndroidStudio的采用Kotlin语言开发的动画渐入的弧形菜单...... 效果: 开发环境:AndroidStudio2.2.1+gra ...

  2. OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...

  3. 从Java源码到Java字节码

    Java最主流的源码编译器,javac,基本上不对代码做优化,只会做少量由Java语言规范要求或推荐的优化:也不做任何混淆,包括名字混淆或控制流混淆这些都不做.这使得javac生成的代码能很好的维持与 ...

  4. OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)

    在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  ...

  5. Java源码系列1——ArrayList

    本文简单介绍了 ArrayList,并对扩容,添加,删除操作的源代码做分析.能力有限,欢迎指正. ArrayList是什么? ArrayList 就是数组列表,主要用来装载数据.底层实现是数组 Obj ...

  6. Java源码系列2——HashMap

    HashMap 的源码很多也很复杂,本文只是摘取简单常用的部分代码进行分析.能力有限,欢迎指正. HASH 值的计算 前置知识--位运算 按位异或操作符^:1^1=0, 0^0=0, 1^0=0, 值 ...

  7. Java字节码分析

    目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码, ...

  8. Java字节码里的invoke操作&&编译时的静态绑定与动态绑定

    一个一直运行正常的应用突然无法运行了.在类库被更新之后,返回下面的错误. Exception in thread "main" java.lang.NoSuchMethodErro ...

  9. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

随机推荐

  1. Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_PRC_CI_AI" in the equal to operation.

    Executed as user: NT AUTHORITY\SYSTEM. Cannot resolve the collation conflict between "Chinese_P ...

  2. luogu P3645 [APIO2015]雅加达的摩天楼

    luogu 暴力? 暴力! 这个题有点像最短路,所以设\(f_{i,j}\)表示在\(i\)号楼,当前\(doge\)跳跃能力为\(j\)的最短步数,转移要么跳一步到\(f_{i+j,j}\)和\(f ...

  3. Java 串口通信 Ubuntu

    说一下我的操作过程吧 在Windows上先用阿猫串口网络调试助手,进行调试: 在网上找Java代码,我选择的是RXTXcomm,网上代码很多,基本都一样. 在Windows电脑上把rxtx压缩包中的r ...

  4. JS ES5

    常用 严格模式 use strict 必须使用var声明变量 禁止自定义函数this指向window 'use strict' funcion Person(name){ this.name = na ...

  5. 如果您的浏览器不支持javascript功能

    如果您的浏览器不支持javascript功能或被禁止使用,那么在访问许多网站(包括此网站)时,某些功能将不可用.我们建议您打开javascript功能以获得最佳的浏览效果.以下是打开它的可能原因和方法 ...

  6. scrapy命令:scrapy genspider详解 转

    当我们使用: scrapy startproject taobao 命令创建好scrapy蜘蛛后,你是否注意到,下面还有这么一行内容: F:\scrapyTest> scrapy startpr ...

  7. Java反射【四、成员变量的反射和构造的反射】

    获取一个类下所有字段信息 Field[] fs = c.getFields(); 获取所有字段(public) Field[] fs = c.getDeclaredFields(); 获取所有声明字段 ...

  8. Win10系统的开机启动项如何去关闭?

    我们在使用电脑时会安装许多的应用程序,而有些应用程序会默认在电脑开机时自行启动,不仅影响开机速度,还会在开机后占用电脑内存资源. 那么在Win10系统中,我们该如何查看有哪些开机启动项呢?我们又该怎么 ...

  9. odoo标识符

    class Book(models.Model): _name = "library.book" _description = "Book" _order = ...

  10. win10 修改文件夹右击默认打开程序

    1.注册表打开 cmd  regedit 2.打开如下位置 3.编辑图中2个Anycode.command的值 为打开 保存即可