Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何阅读Android源码 #2

Open
foxleezh opened this issue Oct 10, 2017 · 8 comments
Open

如何阅读Android源码 #2

foxleezh opened this issue Oct 10, 2017 · 8 comments

Comments

@foxleezh
Copy link
Owner

foxleezh commented Oct 10, 2017

前言

当我们把源码下载下来之后,会感到茫然无措,因为AOSP的源码实在是太多了,这里我们需要明确一些问题:

  • 要阅读哪些源码
  • 阅读源码的顺序和方式
  • 用什么工具来阅读

下面我将从这三个问题一一展开

一、要阅读哪些源码

这个问题是比较个性化的,因为不同的人从事着不同的工作,有的人从事应用开发,可能对Java层东西感兴趣;有的人从事Framework开发,可能对Framework层感兴趣;有的从事硬件开发,可能对底层实现感兴趣。

这个都因人而异,但是有一点,不能盲目地毫无目的地看源码,因为这样的话最终你会淹没在AOSP的大海里,看了一年半截啥都看了,却又感觉都没看透,别人问你源码的东西,都能说个一二,但是一往深了说,就不知所以了。

所以对于AOSP源码,不在于多,而在于精,你不要试图把所有的源码都看懂,你只要对自己感兴趣的那部分深入研究就可以,因为即便是Google工程师也不可能把AOSP全部读完。

对于我而言,我是从事应用层开发的,我主要会了解以下几个方面的源码:

  • Android系统启动流程,应用启动流程,四大组件启动流程,这将列入系统启动篇
  • 系统常用服务ActivityManagerService,WindowManagerService等,这将列入系统服务篇
  • 通信机制,主要是Binder和Handler,这将列入通信篇
  • 进程和线程的创建,运行,销毁,这将列入进程篇
  • View的绘制和显示流程,事件分发机制,这将列入图形绘制篇
  • Android虚拟机ART运行机制,类加载机制,Java注解,Java反射,这将列入虚拟机篇
  • Android对于Java集合的优化算法,这将列入Java基础篇

二、阅读源码的顺序和方式

2.1 阅读顺序

读源码是一个日积月累的过程,不可能一蹴而就,当我们列出自己感兴趣的源码后,我们需要制定一个阅读计划,先读什么再读什么。这个也是因人而异,根据自己的兴趣来就是,你最想读什么,那就排前面。

我一直在说兴趣,因为兴趣是最好的老师,只有你对一样东西感兴趣了,才会有动力去学,去研究,才会不觉得累,如果一开始就去啃一些你不感兴趣的东西,到头来也是乏味不专注的,理解的程度也是不深,而且很有可能失去信心,最后放弃阅读。

当然,如果你对好几样东西都感兴趣,那就有一些原则了:

  • 事物都讲究先后,就像树木扎根大地一样,先有大地,才有树木,基础的东西先看
  • 相互有关联的东西一起看,不要一会儿看系统启动,突然又去看事件分发什么的

2.2 阅读方式

Android系统涵盖的范围很广,从上层的应用程序,到Framework,再到Libraries以至硬件,从Java层到C++,就像一座几十层的大厦一样,每层都有楼梯,也有电梯,我们需要做的就是在大厦里上下穿梭。

当我们阅读某一个知识点源码的时候,不同的知识点有不同的阅读方式,有些适合从下往上读,比如系统启动流程,我是从事件开始的地方开始读,从init.cpp开始,然后到zygote进程,到Java虚拟机,最后到Luncher;

有些适合从上往下读,比如Activity的启动,我是从startActivity方法开始读,然后到ActivityThread,然后到ActivityManagerService;

有些适合两头从中间读,比如Binder,我是从Java层看到C++层,但是看到驱动那儿看不动了,然后就从接收Binder的地方往回看,最后在两端集中在驱动的地方前后对比,才将Binder看通。

这里还是有个好的方式,就是从事件触发的地方开始看是比较合适的。

三、用什么工具来阅读

Android 源码阅读神器当然是Source Insight

Source Insight的好处:

  • 支持方法跳转,类跳转,并且对C++支持很好
  • 支持文件搜索,java,c++,xml都支持,并且支持内容搜索
  • 支持一键导入,随时配置路径
  • 而且最重要的,导入文件数多的时候不卡

下面我讲讲如何使用Source Insight

3.1 下载安装Source Insight

下载地址 http://download.csdn.net/download/foxlee1991/9882553 ,我还专门配置了一个跟Android Studio一样的Darcula主题,下载地址 http://download.csdn.net/download/foxlee1991/9882535

3.2 导入AOSP源码

我目前还没有下载完整的AOSP源码,只是先下载了几个重要的源码。打开Source Insight,选择Project -> New Project,取个名字比如叫AOSP,点击OK

选择你要查看的源码目录,点击OK

选择需要将哪些目录下的源码导入,点击Add Tree

导入成功后会有很多文件列在下方,点击Close

3.3查看源码

现在进入项目还是一片空白,需要把工具栏打开,然后就可以看源码了

左边是方法和成员变量搜索,右边Project File是搜索类名,Project Symbol是内容搜索

还有一些快捷键,比如Ctrl+左键可以方法跳转,左上角有前进和后退,Ctrl+G 是跳转到指定行,Ctrl+F 搜索内容,有时我们会遇到方法无法跳转,这时我们需要点击Project,选择Synchronize Files,全局关联一下,如图

这里要注意导入的文件不要太多,太多会导致Synchronize失败,我们可以选择性地导入一些目录

我们在导入源码的时候,有时一些汇编的源码(以.s或.S结尾)无法导入,这时我们需要点击Options,选择File Type Options,在C/C++里添加.s和.S的支持,然后Close,如图

然后我们重新追加一些目录,点击Project,选择Add and Remove Projec Files,选择对应目录Add Tree即可,同时我们也可以选择Remove Tree删除对应目录源码,操作如下

四、其他

在真正开始阅读Android源码之前,最好是去了解一些C/C++的语法知识,因为源码核心的部分都是用C/C++写的,如果你对一些基础语法不太了解,会看得云里雾里的,这里我给大家推荐两本书《C标准库 中文版》《C++标准库 中文第2版》,另外一些学习网站也不错:

@guiyu
Copy link

guiyu commented Oct 26, 2017

si很好用,可惜只有windows版本,在linux下的表现堪忧,mac貌似根本不支持。

如果可以,还是使用android studio来直接导入aosp的源码,虽然有些hide类或者方法导致找不到合适的引用,jni的关联也做的不好,但通过全局搜索还是可以做到对代码理解的。

再退一步说,vim+ctags+cscopes,也是可以作为源码阅读的工具。

@foxleezh
Copy link
Owner Author

foxleezh commented Nov 1, 2017

@guiyu 我本身在这个项目里就是拷贝了源码,可以直接用Android Studio阅读

@water-chris
Copy link

我觉得单纯阅读代码的话,可以尝试opengrok的方式,比SI查询快,搜索更全面;就是前期索引耗时

@tianyah
Copy link

tianyah commented Sep 27, 2018

请问这个黑色背景样式怎么文件有吗

@runningmoonlight
Copy link

同问,这个Source Insight的黑色背景样式能否分享一下?感激不尽

@foxleezh
Copy link
Owner Author

同问,这个Source Insight的黑色背景样式能否分享一下?感激不尽

有的啊,http://download.csdn.net/download/foxlee1991/9882535

@LySnake
Copy link

LySnake commented Sep 11, 2020

刚入行的时候,用Source Insight开打linux内核代码,直接崩了Source Insight。

后来再也没用过。

现在看来,应该电脑配置过低或者要加大Source Insight的内存使用配置?

@littlebayreal
Copy link

想请问一下AndroidStudio导入ipr源码后,c++,jni文件不支持点击跳转,有什么办法能够让它和java文件一样支持高亮,跳转呢??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants