显然,Eclipse不是阅读Android源码的好工具,不流畅,搜索低效,继承性关系/调用关系都无法有效查看。
方法:Source Insight,sublime Text 3。其中source Insight容易崩溃,推荐使用sublime Text 3。在这个工具帮助下,你才可以驾驭巨大数量的Android 源码,你可以从容在Java,C++,C代码间遨游,你可以很快找到你需要的继承和调用关系。下面介绍两种软件安装方法:
Source Insight安装:
第一步:通过wine安装source insight,
1)安装wine: sudo apt-get install wine ,大概几分钟就好
2)下载source insight,网上还是比较多的,搜索一下就有,解压后会有一个×××setup.exe文件,在该目录下输入指令
安装source insight: wine ×××Setup.exe 按照向导安装即可
3)安装完毕后,可以新建一个脚本来快速启动Source Insight
在工作目录下新建文件insight.sh,写入如下内容:
#!/bin/bash
wine "c:\Program_files\Source_Insight_3\Insight3.exe"
我的路径进行了更改,带空格文件夹不好操作,里面有两个文件夹Program files和Program files (x86),我的Insight3.exe在目录/home/bruceking90/.wine/drive_c/Program files (x86)/Source Insight 3下,所以只要更改Program files (x86)和Source Insight 3。
更改带空格文件或文件夹指令为
mv Program\ files\ \(x86\) Program_files
mv Source\ Insight\ 3 Source_Insight_3
文件夹中含有空格可以通过添加\防止找不到目录
然后注销一下,再source insight.sh,就可以打开source insight。
sublime Text 3安装:
第一步:sublime Text 3下载,找到对应版本,链接:http://www.sublimetext.com/3
第二步:下载到的包为sublime-text_build-3114_amd64.deb,安装deb命令 dpkg -i <package.deb>
dpkg -i 文件所在目录/sublime-text_build-3114_amd64.deb
第三步:打开软件,按win键(windows图标按键),输入sub差不多就出来图标,点击打开:找到help,license manager,输入下面破解
—– BEGIN LICENSE —–
Andrew Weber
Single User License
EA7E-855605
813A03DD 5E4AD9E6 6C0EEB94 BC99798F
942194A6 02396E98 E62C9979 4BB979FE
91424C9D A45400BF F6747D88 2FB88078
90F5CC94 1CDC92DC 8457107A F151657B
1D22E383 A997F016 42397640 33F41CFC
E1D0AE85 A0BBD039 0E9C8D55 E1B89D5D
5CDB7036 E56DE1C0 EFCC0840 650CD3A6
B98FC99C 8FAC73EE D2B95564 DF450523
—— END LICENSE ——
第四步:安装package control插件
通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台,粘贴代码后回车安装
import urllib.request,os;pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
好了,现在的问题是:当你拿到一份几十G的源码,该从哪里开始呢?
1.Android源码分为功能实现上的纵向,和功能拓展上的横向。在阅读源码时需要把握好着两个思路。
譬如你需要研究音频系统的实现原理,纵向:你需要从一个音乐的开始播放追踪,一路下来,你发现解码库的调用,共享内存的创建和使用,路由的切换,音频输入设备的开启,音频流的开始。
譬如你要看音频系统包括哪些内容,横向:通过Framework的接口,你会发现,音频系统主要包括:放音,录音,路由切换,音效处理等。
2.Android的功能模块绝大部分是C/S架构
你心里一定需要有这个层级关系,你需要思路清晰地找到Server的位置,它才是你需要攻破的城,上面的libraries是不是很亲切的样子?看完它长成啥样后,然后你才能发现HAL和Kernel一层层地剥离。
很多研究源码的同学兜兜转转,始终在JAVA层上,这是不科学的,要知道libraries才是它的精髓啊。
3.Android的底层是Linux Kernel。
在理解1,2后,还是需要对Kernel部分有个简单的理解,起码你要熟悉kernel的基础协议吧!你要能看懂电路图吧!你要熟悉设备的开启和关闭吧!你要熟悉调寄存器了吧!这方面的书太多了,我建议根据实例去阅读,它并不复杂,不需要一本本厚书来铺垫。
在libraries和kernel间,可能还会有个HAL的东东,其实它是对kernel层的封装,方便各个硬件的接口统一。这样,如果我换个硬件,不用跑了长得很复杂的libraries里面改了,kernel调试好了后,改改HAL就好了。