本篇文章首要共享一些自己平常工作中运用AndroidStudio检查aosp的办法,一起抛砖引玉,期望知道其它便当有用的检查调试办法技巧的大佬们能够不吝赐教,咱们互相共享,共同进步。

假如直接用AndroidStudio翻开aosp根目录,那么翻开任意一个Java类,默认状况或许是这样的:

AndroidStudio查看AOSP的两种方法

Java文件的标签页显现图标为 ,表明“Java class located out of the source root”,并且其内部的成员变量之类的也没有被语法高亮。

经过咱们装备后,被辨认后的Java文件被效果如下图所示:

AndroidStudio查看AOSP的两种方法

Java文件的标签页显现图标为 ,且成员变量也被高亮。

更重要的是,此刻代码内部现已树立起了索引,比方能够进行代码补全(这儿的代码不仅是补全界说在其时类中的域,也能够补全父类的域,以及其它类的域):

AndroidStudio查看AOSP的两种方法

或检查某个域被哪些类调用了:

AndroidStudio查看AOSP的两种方法

以及代码跳转等一系列快捷功用。

1 干流办法

1.1 设置过程

榜首种办法应该许多人都知道,我从触摸Android开端的很长一段时刻用的都是这种办法,该办法需求一套现已编译过的AOSP。

1)、首要确保现已履行过:

soruce build/envsetup.sh

等指令加载编译所需的环境变量。

2)、接着履行:

mmm development/tools/idegen/ -j16

编译成功后,会输出:

AndroidStudio查看AOSP的两种方法

我这儿编译之前设置了生成目录的环境变量为out_sys,所以生成文件在out_sys。

3)、此刻能够履行指令:

./development/tools/idegen/idegen.sh

假如你的生成目录也和我相同在out_sys的话,或许需求新建一个out/host/linux-x86/framework/目录,然后将idegen.sh仿制曩昔:

cp out_sys/host/linux-x86/framework/idegen.jar out/host/linux-x86/framework/

当看到有相似输出:

AndroidStudio查看AOSP的两种方法

的时分便能够了,最终会在aosp根目录生成两个文件,android.ipr,android.iml:

AndroidStudio查看AOSP的两种方法

4)、经过Android翻开这个android.ipr。由于是榜首次翻开源码会为一切模块树立索引,所以耗时十分久,适当长的时刻内AndroidStudio卡的都不能运用,这是我抛弃运用这种办法检查aosp的首要原因。实不相瞒,我个人现已很久没用过这种办法了,这次是为了写这篇文章所以我又试了一次这种办法,怎么说呢,熟悉的感觉又回来了……慢的让人发指,有的时分你甚至分不清是到底是真的在建索引仍是单纯卡死了。

1.2 优缺陷

由于卡的时刻太久不想等了,所以后边的过程就不演示了,其实也没啥内容了,说一下这种检查办法下的或许有用的技巧:

  • 将你用不到的代码目录设置为excluded,这个操作在此种办法下好像用途不大。
  • 在android.iml中将你用不到的代码目录,从sourceFolder改为excludeFolder,这个办法很有用,不论是在树立索引的时分,仍是在你后续检查aosp的时分,都能够帮你过滤掉许多无关代码。
  • 将Project Structure -> Modules -> Dependencies下的jar包啥的都删掉,避免代码跳转的时分跳到其它乱七八糟的地方。

这种检查aosp的办法,优点便是一次性为一切模块树立索引,一起也是缺陷,榜首次加载由于要树立索引所以巨慢,后续再次翻开虽然比榜首次要快许多,但也是相对的,我个人觉得花的时刻仍是比较久。

另外之前说的修改android.iml的办法,的确是一个好办法,可是也不是没有缺陷,比方装备这个或许比较费事,虽然这个装备操作是一劳永逸的,可是假如你换了另一个项目的代码看,那就又需求重新装备这个项目的android.iml,并且又需求经历一次巨TM久的建索引的熬人环节。我其时的做法是将android.ipr和android.iml进行了复用,比方我在项目A上装备过了这两个文件,那么当我重下了一套项目B的代码,我能够直接将项目A的android.ipr和android.iml仿制到项目B中复用这两个文件。好处是的确省下了不少时刻精力,缺陷是假如两个项目中你想检查的文件的名字或地点目录可巧不相同的话(比方Android渠道升级了),或许比较费事,以及或许还有一些我没遇到过的未知问题。

如此种种,让我迫切期望寻找另一种检查aosp的办法。

2 简易办法

2.1 设置过程

榜首种办法的缺陷我现已吐槽了许多了,可是还有一点也是不能忽视的,便是你需求一套现已编译过的aosp,许多时分我或许只拉了aosp中某一个库的代码,比方frameworks/base这个库,那么我就不能树立内部索引进行检查了吗。

现在的答案是能够,其实也很简单。不过这儿仍是拿整套aosp举例,操作是相同的:

1)、比方我现在下载了一套项目代码,接着直接将该项目的根目录在AndroidStudio中翻开,初始一切的目录都是这样的:

AndroidStudio查看AOSP的两种方法

2)、此刻关闭掉右下角正在树立索引的操作:

AndroidStudio查看AOSP的两种方法

3)、然后先将一切目录全部设置为Excluded:

AndroidStudio查看AOSP的两种方法

目录被设置为Excluded后就像这样:

AndroidStudio查看AOSP的两种方法

这一步也能够不做,我这么做仅仅期望一开端的时分就把无关模块排除去,便利后续建索引和检查代码。

4)、然后重新再翻开AndroidStudio,这个时分你会发现建索引的过程没了,由于一切目录都被排除去了。

5)、然后你想要检查哪些代码,就把这些代码地点的java目录或者src目录标记为Sources Root(这一步应该是基于IntelliJ IDEA的装备原理,可是我还没找到具体的理论支持内容),比方我经常看WMS相关的内容,在

frameworks\base\services\core\java\com\android\server\wm\

包中,那么我就能够把

frameworks\base\services\core\java

这个目录设置为Sources Root,就像这样:

AndroidStudio查看AOSP的两种方法

目录被设置为Sources Root后,结果为:

AndroidStudio查看AOSP的两种方法

此刻便能够为这个目录重新树立索引了,比方我在WindowContainer.java这个类中,新建一个test办法,看看this都有哪些办法能够调用:

AndroidStudio查看AOSP的两种方法

能看到代码补全的功用。

检查isDescendantOf这个成员办法都在哪些类里被调用了,也能够:

AndroidStudio查看AOSP的两种方法

其它的就不过多介绍了,我个人现在运用的便是这种检查aosp的办法。

2.2 跳转到SDK的特殊状况

这儿说一点或许会遇到的状况,即代码跳转或许会调转到SDK,而不是aosp,比方我经过Ctrl + 鼠标左键想要跳转到Rect这个类里去,发现跳转到了SDK里,而不是aosp中的Rect.java:

AndroidStudio查看AOSP的两种方法

这个时分需求将Project Structure -> Modules -> Dependencies中的SDK依靠:

AndroidStudio查看AOSP的两种方法
更换为本地的JDK包:

AndroidStudio查看AOSP的两种方法

选择完就像这样:

AndroidStudio查看AOSP的两种方法

此刻再重新测验跳转到Rect,就能够了:

AndroidStudio查看AOSP的两种方法

假如不能够,或许是由于Rect.java方位为:

frameworks\base\graphics\java\android\graphics\Rect.java

你需求将Rect.java地点目录的的java目录:

frameworks\base\graphics\java

设置为Sources Root:

AndroidStudio查看AOSP的两种方法

3 IntelliJ IDEA补充

Content roots | IntelliJ IDEA Documentation (jetbrains.com)

Configure folder structure

Folder categories

Folders within a content root can be assigned to several categories.

  • Sources

    This folder contains production code that should be compiled.

AndroidStudio查看AOSP的两种方法

  • Generated Sources

    The IDE considers that files in the Generated Sources folder are generated automatically rather than written manually, and can be regenerated.

  • Test Sources

    These folders keep code related to testing separately from production code. Compilation results for sources and test sources are normally placed into different folders.

  • Generated Test Sources

    The IDE considers that files in this folder are generated automatically rather than written manually, and can be regenerated.

  • Resources

    (Java only) Resource files used in your application: images, configuration XML and properties files, and so on. During the build process, resource files are copied to the output folder as is by default. You can Change the output path for resource files in your project.

    Similarly to sources, you can specify that your resources are generated. You can also specify which folder within the output folder your resources should be copied to.

  • Test Resources

    These folders are for resource files associated with your test sources.

  • Excluded

    Files in excluded folders are ignored by code completion, navigation and inspection. That is why, when you exclude a folder that you don’t need at the moment, you can increase the IDE performance. Normally, compilation output folders are marked as excluded.

    Apart from excluding the entire folders, you can also exclude specific files.

AndroidStudio查看AOSP的两种方法

Configure folder categories

AndroidStudio查看AOSP的两种方法