原文地址: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++学习笔记之引用

    引用是 C++ 的新增内容,在实际开发中会经常使用:C++ 用的引用就如同C语言的指针一样重要,但它比指针更加方便和易用,有时候甚至是不可或缺的. 同指针一样,引用能够减少数据的拷贝,提高数据的传递效 ...

  2. iView组件Tabs嵌套使用

    <Tabs name="tab" value="a"> <TabPane label="标签a" name="a ...

  3. go 表单

    package main import ( "fmt" "io" "net/http" ) const form = `<html&g ...

  4. 搞懂ZooKeeper到底是做啥的

    一.ZooKeeper是啥 ZooKeeper概念 ZooKeeper是一个开源的分布式协调服务(a service for coordinating processes of distributed ...

  5. CSP2019螺旋升天爆炸记

    Day -N 半年没碰OI的我终于又回到了这个熟悉又陌生的地方.然后颓废了两天就过了初赛? 初赛rp爆棚考了全校第一,然并卵 然后就是打了遍树状数组模板,写挂了(没错我现在连树状数组都会写挂) 看一眼 ...

  6. Spingboot+Mybatis+Oracle项目配置

    配置过程参考: 项目创建:http://how2j.cn/k/springboot/springboot-eclipse/1640.html 集成Mybatis使用Oracle:https://www ...

  7. 初识python之了解程序设计基本方法

    对于用计算机解决一些问题,这里有一个程序设计的基本方法,主要分为六个步骤,其分析和实现过程如下: (1)分析问题:利用计算机解决问题需要结合计算机技术的发展水平和人类对问题的思考程度,在特定技术和社会 ...

  8. vue-cli3开干

    npm install -g @vue/cli-service-global vue create hello-world

  9. element-ui Cascader 级联选择器 点击label选中

    通过修改label的样式解决: 注意:el-cascader-panel 是直接挂载在body上的,所以需要全局设置 .el-cascader-panel .el-radio{ width: 100% ...

  10. SQL:MYSQL入门

    MYSQL(关系型数据库管理系统) 参考手册:http://www.w3school.com.cn/sql/index.asp 给大家讲一下数据库:常见的有 ACCESS.MSSSQL.MYSQL.O ...