用IntelliJ idea阅读AOSP代码

1,607 阅读2分钟

1.编译出android.iml和android.ipr

先用make编译一遍源码,然后:

source build/envsetup.sh
cd development/tools/idegen
mm
croot
development/tools/idegen/idegen.sh

正常情况下上面命令执行成功会在aosp根目录下生成两个文件android.iml和android.ipr


如果遇到"找不到主类Main"的错误,打开development/tools/idegen/Android.mk文件,修改 LOCAL_MODULE:= idegen 一行为: LOCAL_MODULE:= idegen1 重新进入development/tools/idegen目录mm编译 然后手动在out目录下查找idegen1.jar。
然后java -cp idegen1.jar Main即可,具体什么原因没去详细分析,只是跟踪的过程中发现原先的idegen.jar并没有主类。


2.exclude不必要的目录:

打开IntelliJ idea之前可以先exclude掉一些不必要的目录,不然搜索代码的时候会出现一堆无关的类。

development/tools/idegen/excluded-paths文件是用来exclude不需要导入的文件,也可以在项目的根目录下添加excluded-paths文件,项目的根目录即aosp根目录。

也可以使用idea的界面来exclude: www.jetbrains.com/help/idea/i…
在一个目录上面右键Mark Directory As --> Excluded,简单又快捷。
可以看到,这种操作方式其实修改的是android.imi文件,比如exclude out目录,就会在android.imi增加一行: <excludeFolder url="file://$MODULE_DIR$/out" />
所以可以在打开idea之前手动的在android.imi添加如下exclude:

<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/packages" />
<excludeFolder url="file://$MODULE_DIR$/external" />

3.导入项目:

打开IntelliJ,open android.ipr文件即可,等待scanning files to index操作完成。

去除所有的dependencies:
这一步是必要的,不然项目引入了很多很多的jar包,导致代码跳转的时候会优先跳转到这些jar包中:
File -> Project Structure -> Modules -> Dependencies 删除除了Module Source和java version的所有依赖,可以shift+左键快速选中大范围依赖然后点击减号来删除。

有些aidl文件编译出来的java文件在out目录下,为了可以定位到这些文件,需要解除对out/target/common目录的exclude即可。

在看源码期间,即使将整个out目录都exclude,还是可能会有out目录的子目录生效,代码有可能跳转错误,此时跳到哪个错误的目录就将此目录exclude掉即可。