转载请注明出处:https://blog.csdn.net/turtlejj/article/details/83857897,谢谢~
在之前的工作中,由于不仅要分析和调试Android系统源码中Framework以及Telephony部分的Java代码,而且还要兼顾RIL和Modem相关的C/C++代码。然而Android Studio对于C/C++代码的支持并不是很好,所以我一直使用的是Source Insight来阅读代码。
后来由于工作的调整,对于C/C++代码的关注少了很多,因此转而使用Android Studio来阅读代码。不得不说,Android Sutdio对于Android的开发跟调试要优于Source Insight太多太多。不仅可以快速的查找到想要查找的类和方法,更可以对系统进程打断点进行单步调试,从而在遇到问题时,不再需要进行“对出问题的模块加入debug log -> 重新编译模块 -> adb push -> 复现问题 -> 抓log -> 重新分析log”的操作,极大地提升了分析问题的效率。
本篇文章会讲解如何使用Android Studio导入系统源码。关于如何使用Android Studio对系统源代码进行单步调试,请看文章《使用Android Studio对Android系统源码进行单步调试》。
使用Android Studio导入系统源码
在这里我们默认大家已经下载好了Android系统的源代码,关于如何下载,网上有很多详尽的教程,我这里就不再过多的赘述,不会的同学可以自行百度。
PS: 使用Android Studio导入系统源代码需要对代码进行一定的编译操作,如果有些同学使用的是Windows系统,可以尝试在Cygwin下进行编译,或者将在Linux下编译生成的三个产物拷贝到Windows的源代码根目录下,也可以起到一样的效果。
进入正题,在下载好代码之后,我们需要对代码进行编译操作,对于目前比较新的Android 8.0以及9.0版本,我这里推荐使用Ubuntu 16.04的版本进行编译,编译过程中一般不会遇到什么问题 (使用Ubuntu 18.04的话,可能会遇到一些坑,我在《Ubuntu 18.04 编译安卓系统源码 及 adb连接手机遇到的问题详解》里列举了所有我遇到的问题以及解决方法,有需要的同学可以参考)。
这里需要执行以下四条命令:
1. "source build/envsetup.sh" (source可以用 . 代替,即". build/envsetup.sh")
2. "lunch",并选择要编译的项目
3. "make idegen -j4" (这里的 -j4 表示用4线程来编译,可以不加)
4. "sudo development/tools/idegen/idegen.sh" (我的电脑需要管理员权限才能执行成功,所以我一般会在前面加上"sudo")
下面进行分布讲解:
1. 进入系统源码的根目录(即可以看到frameworks、kernel等等文件夹的那一级目录),执行". build/envsetup.sh"命令:
2. 而后,继续执行"lunch"命令,并选择你想要编译的那个项目,这里我选了2,即编译 aosp_arm64-eng:
3. 前面两步是对编译环境进行配置,接下来执行"make idegen -j4",并等待(屏幕会输出很多log,这里只贴出最后部分):
4. 看到以上输出以后,执行"sudo development/tools/idegen/idegen.sh",并继续等待,这个过程可能比较长,不要着急
完成以上四个步骤之后,会发现在源码根目录下出现了三个新的文件(也有可能是两个)
1. android.iml (记录项目所包含的module、依赖关系、SDK版本等等,类似一个XML文件)
2. android.ipr (工程的具体配置,代码以及依赖的lib等信息,类似于Visual Studio的sln文件)
3. android.iws (主要包含一些个人的配置信息,也有可能在执行上述操作后没有生成,这个没关系,在打开过一次项目之后就会自动生成了)
"android.iml"和"android.ipr"一般是"只读"的属性,我们这里建议大家,把这两个文件改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况,执行如下两条命令即可。
如果你的电脑性能足够好(内存大于16G,代码下载在SSD上),那么可以直接打开Android Studio,点击"Open an existing Android Studio project"选项,找到并选中刚刚生成的"android.ipr"文件,点击OK,就可以开始导入项目了。 第一次导入,这个过程可能会持续很久,几十分钟或者超过一个小时。不过成功之后,以后再打开项目就会快很多了。
如果电脑性能一般的话,我建议,可以在导入项目前,手动对"android.iml"文件进行一下修改,可以使我们导入的时间尽可能的缩短一些。
首先,要保证"android.iml"文件已经添加了"可写入"的属性(上文中已经介绍了如何修改文件属性)。
接下来,使用文本编辑器打开"android.iml"文件,并执行以下修改(仅代表我的个人习惯,也可以根据同学们的喜好自己调整):
1. 搜索关键字"orderEntry",我一般会将所有带有这个关键字的标签项全部删除,仅保留以下三行,大概如下
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
<orderEntryProperties />
</component>
</module>
2. 搜索”excludeFolder“关键字,对这里进行一些修改,将我们不需要看的代码Exclude掉。通过这个步骤,能极大地提升第一次加载项目的速度。
等项目加载完成后,我们还可以通过Android Studio对Exclude的Module进行调整,所以也不用害怕这里Exclude掉了有用的代码,或少Exclude了一部分代码,在项目加载完以后再进行调整就行了。
完成之后,按照上面说的步骤,使用Android Studio选中"android.ipr"打开项目即可。
优化Android Studio的配置
在打开系统源代码后,我们还可以对Android Studio进行一些配置,使得我们可以更好的进行代码阅读。
1. Exclude不需要的代码目录
点击"File -> Project Structure...",中间的窗口选择"android"(首字母小写的那一个),在弹出的窗口中左边栏中选择"Modules",而后在右边的窗口中选择"Sources"。在这里我们可以看到项目的所有代码目录,我们可以选中不需要的module,并点击上面的"Excluded"按钮,当被选中的目录变为橙色,即表示完成Exclude操作;如果想要取消对某代码目录的Exclude操作,选中该目录,再次点击"Excluded"按钮,等待目录变为蓝色即可。