原文地址: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. C/S软件方案

    互联网时代客户端软件的一些方案 纯Native开发, C++/C#/duilib+C++(Windows), Objective-c(Mac) Qt(Windows/Mac) NW.js/Electr ...

  2. 史上最全的MySQL高性能优化实战总结!

    1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...

  3. redis的数据结构及操作命令

    一.字符串: redis中最为基础的存储类型,以二进制存储,value的字符串最多512M,Key做多1024字节. 常用命令:赋值(set).取值(get).删除(del),递增(incr/incr ...

  4. Spring中常用的设计模式之:代理模式

    看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以 ...

  5. HBASE学习笔记(五)

    一.HBase的RowKey设计原则 1.我们知道HBase是三维有序存储的,通过RowKey(行键),ColumnKey(Column family和qualifier)和TimeStamp(时间戳 ...

  6. payload免杀之msbuild利用

    0x00 前言 红队必备技巧免杀之一,现在主要是.net4.0下实现.待我过几天有空实现一下.net2.0. 0x01 免杀过程 利用cs生成c#的payload,如图所示: 将paypload内容填 ...

  7. win10编译maskrcnn benchmark

    步骤 1. 按照官网的Option1安装步骤安装 https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/INSTALL. ...

  8. 详解python中的描述符

    描述符介绍 总所周知,python声明变量的时候,不需要指定类型.虽然现在有了注解,但这只是一个规范,在语法层面是无效的.比如: 这里我们定义了一个hello函数,我们要求name参数传入str类型的 ...

  9. Oracle【增删改&数据的备份】

    增删改的SQL语句执行完毕后,不会立马进行数据的写入数据库(这时数据在内存中),需要手动对数据进行提交(commit),如果数据出问题,可以使用回滚.主键:非空唯一的 --在一张表中,某字段值是非空唯 ...

  10. js失效问题

    由于有些公司设计的js文件涉及到收费问题,提供的这些js文件不能部署到线上,只能通过127.0.0.1:8080/home类似方式访问js才能生效,换作10.140.111.11:8080/home这 ...