Android Studio在线调试Android Framework Java代码

一、准备工作

1、下载最新的Android Studio版本

https://developer.android.com/studio/index.html

当前最新的大版本是2.2
Android Studio在线调试Android Framework Java代码

2、下载Android系统源码

这里比较灵活,可以下载公司内部机型的代码,也可以下载原生AOSP的代码

环境配置参考

https://source.android.com/source/initializing.html

源码下载参考

https://source.android.com/source/downloading.html

编译运行参考

https://source.android.com/source/building.html

全部编译整个代码工程,中间如果有什么问题可以参考

https://source.android.com/source

二、配置Android Studio

1、配置vm options

一个完成Android源码会非常大,所以为了避免导入和生成index时OOM,最好提前配置一下Android Studio的vm options,可以参考下图是我的配置
Android Studio在线调试Android Framework Java代码

2、配置最大打开文件数

在导入过程中会同时打开非常多的文件,为了避免too many files open错误,提前在profile文件中配置一下打开文件的数量,我这里是配置的2048
Android Studio在线调试Android Framework Java代码

三、创建Android Framework工程

整个Android源码全编成功之后,还需要编译idegen模块,用以生成Android studio的工程配置文件,对于高通有modem源码的项目这里有个坑,就是有一个hlos下的有一个android的软连接会链接到源码根目录,导致递归死循环,最终栈溢出而无法生成工程配置文件,所以需要删除这个软链接
Android Studio在线调试Android Framework Java代码

1、单独编译idegen模块

Vincent$ mmm development/tools/idegen/

编译成功之后就生成了idegen.jar

host Java: idegen (out/host/common/obj/JAVA_LIBRARIES/idegen_intermediates/classes)
Install: out/host/darwin-x86/framework/idegen.jar

2、运行idegen脚本

Vincent$ development/tools/idegen/idegen.sh
运行成功之后就会看到如下信息打出

Read excludes: 5ms
Traversed tree: 85308ms

同时在源码的根目录下生成android.ipr等工程配置文件

3、提升导入代码的速度

对于不关注的代码目录,可以通过修改android.iml来去除无用的源码和相关目录,用来提升加载速度
Android Studio在线调试Android Framework Java代码

四、导入和配置Android Framework工程

1、导入工程

打开Android Studio,然后找到根目录下生成的android.ipr文件并打开
Android Studio在线调试Android Framework Java代码
耐心等待index建立,预计需要10分钟左右,根据硬件配置不同时间略有差异
Android Studio在线调试Android Framework Java代码

2、配置工程

导入完成之后右上角会有一个提示
Android Studio在线调试Android Framework Java代码
然后点击Configure
Android Studio在线调试Android Framework Java代码
点击OK,然后点击左上角的Project并选择Project视图模式
Android Studio在线调试Android Framework Java代码
然后按照下图进入工程配置
Android Studio在线调试Android Framework Java代码

Android Studio在线调试Android Framework Java代码
按照如下设置把JDK的classpath和sourcepath下的内容都删掉,使其能在debug时定位到项目中的源码
Android Studio在线调试Android Framework Java代码
然后把Android SDK的classpath和sourcepath也删除,同时将Java SDK选为刚刚配置JDK1.8
Android Studio在线调试Android Framework Java代码
设置Modules的依赖,将依赖中除了下图所示的之外全部删除
Android Studio在线调试Android Framework Java代码
然后点击左下角的+选择Jars or directories添加framework相关的源码文件夹
Android Studio在线调试Android Framework Java代码
点击OK,等待其建立index完成后工具栏的Attach debugger to Android process就会变成可点击状态
Android Studio在线调试Android Framework Java代码

五、在线调试Android Framework

上面的配置工作完成后就可以开始在线调试了,但是前提是手机中的ro.debuggable要为1,或者是userdebug,eng版本的系统软件

1、attach到system_process进程

Android Studio在线调试Android Framework Java代码

2、设置断点

成功attach后就可以打开想要设置断点的源码文件,然后在行号右边的空白处左键点击设置断点
Android Studio在线调试Android Framework Java代码

3、查看运行时状态

设置完成后就可以操作手机,当代码运行到断点处就可以停下来,这时就可以查看运行时的状态,包括变量的值,backtrace等
Android Studio在线调试Android Framework Java代码
还可以在watches窗口添加想要查看的表达式的值
Android Studio在线调试Android Framework Java代码

4、获取backtrace快照

另外attach后,在不设置断点的情况下也可以实时的获取所有线程的backtrace的快照,作用类似于kill -3,但是只有Java层的trace
Android Studio在线调试Android Framework Java代码

六、在线调试其他APP进程

细心的同学可能会想,通过上面的设置我是不是可以attach到其他APP进程,然后把相关源码添加到依赖里面并设置断点debug,或者在framework的公共代码处设置断点debug?答案是可以的,有心的同学可以自己探索一下。

上一篇:[20121227]v$datafile访问是从数据文件获取信息吗.txt


下一篇:主/辅DNS服务器详细配置