方法一:
线上阅读
方法二:本地阅读
一.获取源码
通过Git去官网下载Android源码。
步骤1:
git clone http://android.googlesource.com/platform/frameworks/base.git
步骤2:
git base
ls -l
步骤3:
git tag //查看发行版本
http://img.blog.csdn.net/20131224194006609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVuZzB6aGFvdGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
步骤4:
git checkout android-4.4_r1
这样我们就得到了Android4.4的源码。
但是我再下6.0.1的时候出现了两个文件名字忽略大小写相同的情况,就导致了有个文件丢失了,本地代码有修改,怎么也checkout 6.0的情况。于是我就去网上随便找了个6.0的源码,推荐个网盘地址。
网上大部分还是推荐使用Ubantu环境来看搞android和看源码的,资料也比较多,但是个人电脑并不是很想刷。
步骤5:
如果你只想下载部分源代码(例如Launcher)可以执行以下命令:
git clone http://android.googlesource.com/platform/packages/apps/Launcher.git
http://img.blog.csdn.net/20131224200022109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVuZzB6aGFvdGFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
所有代码下载的列表
git clone http://android.git.kernel.org/kernel/common.git
git clone http://android.googlesource.com/platform/external/webkit.git
git clone http://android.googlesource.com/platform/development.git
git clone http://android.googlesource.com/platform/system/bluetooth.git
git clone http://android.googlesource.com/platform/external/freetype.git
git clone http://android.googlesource.com/platform/system/vold.git
git clone http://android.googlesource.com/platform/system/extras.git
git clone http://android.googlesource.com/platform/system/core.git
git clone http://android.googlesource.com/platform/frameworks/ex.git
git clone http://android.googlesource.com/platform/system/media.git
git clone http://android.googlesource.com/platform/frameworks/base.git
git clone http://android.googlesource.com/platform/system/netd.git
git clone http://android.googlesource.com/platform/packages/apps/AlarmClock.git
git clone http://android.googlesource.com/platform/packages/apps/Nfc.git
git clone http://android.googlesource.com/platform/system/wlan/ti.git
git clone http://android.googlesource.com/platform/packages/providers/ImProvider.git
git clone http://android.googlesource.com/platform/packages/apps/CertInstaller.git
git clone http://android.googlesource.com/platform/packages/apps/Tag.git
git clone http://android.googlesource.com/platform/packages/providers/TelephonyProvider.git
git clone http://android.googlesource.com/platform/hardware/qcom/media.git
git clone http://android.googlesource.com/platform/packages/providers/WebSearchProvider.git
git clone http://android.googlesource.com/platform/frameworks/opt/carddav.git
git clone http://android.googlesource.com/toolchain/manifest.git
git clone http://android.googlesource.com/toolchain/mpc.git
git clone http://android.googlesource.com/toolchain/build.git
git clone http://android.googlesource.com/device/sample.git
git clone http://android.googlesource.com/toolchain/gmp.git
git clone http://android.googlesource.com/toolchain/gold.git
git clone http://android.googlesource.com/toolchain/gcc.git
git clone http://android.googlesource.com/toolchain/mpfr.git
git clone http://android.googlesource.com/toolchain/benchmark.git
git clone http://android.googlesource.com/toolchain/gdb.git
git clone http://android.googlesource.com/kernel/omap.git
git clone http://android.googlesource.com/platform/packages/apps/Sync.git
git clone http://android.googlesource.com/platform/prebuilt.git
git clone http://android.googlesource.com/platform/dalvik.git
git clone
git clone http://android.googlesource.com/platform/external/tinyxml.git
git clone http://android.googlesource.com/platform/external/srec.git
git clone http://android.googlesource.com/platform/external/neven.git
git clone http://android.googlesource.com/platform/external/dhcpcd.git
git clone http://android.googlesource.com/platform/external/skia.git
git clone http://android.googlesource.com/platform/external/clearsilver.git
git clone http://android.googlesource.com/platform/external/elfutils.git
git clone http://android.googlesource.com/platform/hardware/ril.git
git clone http://android.googlesource.com/platform/external/icu4c.git
git clone http://android.googlesource.com/platform/external/netperf.git
git clone http://android.googlesource.com/platform/external/sqlite.git
git clone http://android.googlesource.com/platform/external/ping.git
git clone http://android.googlesource.com/platform/external/googleclient.git
git clone http://android.googlesource.com/platform/external/tremor.git
git clone http://android.googlesource.com/platform/packages/apps/Settings.git
git clone http://android.googlesource.com/platform/packages/providers/MediaProvider.git
git clone http://android.googlesource.com/platform/packages/apps/Email.git
git clone http://android.googlesource.com/platform/packages/providers/ContactsProvider.git
git clone http://android.googlesource.com/platform/packages/apps/Contacts.git
git clone http://android.googlesource.com/platform/packages/apps/Updater.git
git clone http://android.googlesource.com/platform/packages/apps/Stk.git
git clone http://android.googlesource.com/platform/packages/apps/Camera.git
git clone http://android.googlesource.com/platform/packages/apps/Launcher.git
git clone http://android.googlesource.com/platform/external/safe-iop.git
git clone http://android.googlesource.com/platform/packages/providers/DrmProvider.git
git clone http://android.googlesource.com/platform/external/bluetooth/bluez.git
git clone http://android.googlesource.com/platform/packages/apps/Mms.git
git clone http://android.googlesource.com/platform/packages/apps/Browser.git
git clone http://android.googlesource.com/platform/packages/providers/CalendarProvider.git
git clone http://android.googlesource.com/platform/packages/apps/Calculator.git
git clone http://android.googlesource.com/platform/frameworks/opt/com.google.android.git
git clone http://android.googlesource.com/platform/packages/apps/AccountsAndSyncSettings.git
git clone http://android.googlesource.com/platform/packages/apps/HTMLViewer.git
git clone http://android.googlesource.com/platform/packages/apps/GlobalSearch.git
git clone http://android.googlesource.com/platform/packages/providers/ManagementProvider.git
git clone http://android.googlesource.com/platform/packages/apps/PackageInstaller.git
git clone http://android.googlesource.com/platform/packages/providers/UserDictionaryProvider.git
git clone http://android.googlesource.com/platform/packages/apps/Provision.git
git clone http://android.googlesource.com/platform/packages/apps/Gallery3D.git
git clone http://android.googlesource.com/platform/frameworks/opt/emoji.git
git clone http://android.googlesource.com/platform/packages/apps/Phone.git
git clone http://android.googlesource.com/platform/packages/apps/Gallery.git
git clone http://android.googlesource.com/platform/external/svox.git
git clone http://android.googlesource.com/platform/system/vold.git
git clone http://android.googlesource.com/platform/system/wlan/ti.git
git clone http://android.googlesource.com/platform/packages/providers/ImProvider.git
git clone http://android.googlesource.com/platform/packages/providers/GoogleSubscribedFeedsProvider.git
git clone http://android.googlesource.com/platform/packages/apps/Launcher2.git
git clone http://android.googlesource.com/platform/packages/providers/DownloadProvider.git
git clone http://android.googlesource.com/platform/packages/apps/DeskClock.git
git clone http://android.googlesource.com/platform/packages/apps/SoundRecorder.git
git clone http://android.googlesource.com/platform/packages/apps/Protips.git
git clone http://android.googlesource.com/platform/packages/apps/Stk.git
git clone http://android.googlesource.com/platform/packages/apps/SpeechRecorder.git
git clone http://android.googlesource.com/platform/packages/apps/Music.git
git clone http://android.googlesource.com/platform/packages/apps/VoiceDialer.git
git clone http://android.googlesource.com/platform/packages/providers/GoogleContactsProvider.git
git clone http://android.googlesource.com/platform/packages/apps/IM.git
git clone http://android.googlesource.com/platform/packages/apps/QuickSearchBox.git
git clone http://android.googlesource.com/platform/packages/apps/GoogleSearch.git
git clone http://android.googlesource.com/platform/packages/providers/ApplicationsProvider.git
git clone http://android.googlesource.com/platform/frameworks/opt/com.google.android.googlelogin.git
二 使用Source InSight 阅读 Android 源码
步骤1: 安装 Source Insight
– 下载地址 : http://www.sourceinsight.com/down35.html;
– 注册码 : SI3US-361500-17409 .
步骤2:导入 Android 源码
– 创建工程 : Project -> New Project, 输入一个工程名, 文件路径设置为 Android 源码路径, 这个一定要注意, 否则会拷贝整个 Android 源码。
– 设置工程 : 默认即可;
– 导入源码 : 选择全部导入, 前提是电脑配置好, 如果电脑配置一般, 可以一个一个导入.
– 选择导入子目录 : 不仅导入目录, 子目录迭代导入.
– 扫描源码文件 :
– 扫描完成 : 只有 22万个文件.
– 开始导入 :
步骤3:查找阅读源码
– 查找 IBinder 源码 :
Source Insight 参考快捷键 : http://www.cnblogs.com/mengdd/p/3506526.html.
三 怎样阅读源码
1.怎么入手
a.宏观上看,Android源码分为功能实现上的纵向,和功能拓展上的横向。在阅读源码时需要把握好着两个思路。譬如你需要研究音频系统的实现原理,纵向:你需要从一个音乐的开始播放追踪,一路下来,你发现解码库的调用,共享内存的创建和使用,路由的切换,音频输入设备的开启,音频流的开始。譬如你要看音频系统包括哪些内容,横向:通过Framework的接口,你会发现,音频系统主要包括:放音,录音,路由切换,音效处理等。
b.Android的功能模块绝大部分是C/S架构你心里一定需要有这个层级关系,你需要思路清晰地找到Server的位置,它才是你需要攻破的城,上面的libraries是不是很亲切的样子?看完它长成啥样后,然后你才能发现HAL和Kernel一层层地剥离。很多研究源码的同学兜兜转转,始终在JAVA层上,这是不科学的,要知道libraries才是它的精髓啊。
c.Android的底层是Linux Kernel。在理解1,2后,还是需要对Kernel部分有个简单的理解,起码你要熟悉kernel的基础协议吧!你要能看懂电路图吧!你要熟悉设备的开启和关闭吧!你要熟悉调寄存器了吧!这方面的书太多了,我建议根据实例去阅读,它并不复杂,不需要一本本厚书来铺垫。在libraries和kernel间,可能还会有个HAL的东东,其实它是对kernel层的封装,方便各个硬件的接口统一。这样,如果我换个硬件,不用跑了长得很复杂的libraries里面改了,kernel调试好了后,改改HAL就好了。
2.阅读方法:
a.分层次阅读
在阅读代码的时候不要一头就扎下去,这样往往容易只见树木不见森林,阅读代码比较好的方法有一点象二叉树的广度优先的遍历。在程序主体一般会比较简 单,调用的函数会比较少,根据函数的名字以及层次关系一般可以确定每一个函数的大致用途,将你的理解作为注解写在这些函数的边上。当然很难一次就将全部注 解都写正确,有时候甚至可能是你猜测的结果,不过没有关系这些注解在阅读过程是不断修正的,直到你全部理解了代码为止。一般来说采用逐层阅读的方法可以是 你系统的理解保持在一个正确的方向上。避免一下子扎入到细节的问题上。在分层次阅读的时候要注意一个问题,就是将系统的函数和开发人员编写代码区分开。在 c, c++,java ,delphi中都有自己的系统函数,不要去阅读这些系统函数,除非你要学习他们的编程方法,否则只会浪费你的时间。将系统函数表示出来,注明它们的作用 即可,区分系统函数和自编函数有几个方法,一个是系统函数的编程风格一般会比较好,而自编的函数的编程风格一般比较会比较差。从变量名、行之间的缩进、注 解等方面一般可以分辨出来,另外一个是象ms c6++会在你编程的时候给你生成一大堆文件出来,其中有很多文件是你用不到了,可以根据文件名来区分一下时候是系统函数,最后如果你实在确定不了,那就 用开发系统的帮助系统去查一下函数名,对一下参数等来确定即可。
b.写注解
写注解是在阅读代码中最重要的一个步骤,在我们阅读的源代码一般来说是我们不熟悉的系统,阅读别人的代码一般会有几个问题,1搞明白别人的编程思想不 是一件很容易的事情,即使你知道这段程序的思路的时候也是一样。2阅读代码的时候代码量一般会比较大,如果不及时写注解往往会造成读明白了后边忘了前边的 现象。3阅读代码的时候难免会出现理解错误,如果没有及时的写注解很难及时的发现这些错误。4不写注解有时候你发生你很难确定一个函数你时候阅读过,它的功能是什么,经常会发生重复阅读、理解的现象。
c.重复阅读
一次就可以将所有的代码都阅读明白的人是没有的。至少我还没有遇到过。反复的去阅读同一段代码有助于得代码的理解。一般来说,在第一次阅读代码的时候 你可以跳过很多一时不明白的代码段,只写一些简单的注解,在以后的重复阅读过程用,你对代码的理解会比上一次理解的更深刻,这样你可以修改那些注解错误的 地方和上一次没有理解的对方。一般来说,对代码阅读3,4次基本可以理解代码的含义和作用。
d.运行并修改代码
如果你的代码是可运行的,那么先让它运行起来,用单步跟踪的方法来阅读代码,会提高你的代码速度。代码通过看中间变量了解代码的含义,而且对 以后的修改会提供很大的帮助 用自己的代码代替原有代码,看效果,但在之前要保留源代码 600行的一个函数,阅读起来很困难,编程的人不是一个好的习惯。在阅读这个代码的时候将代码进行修改,变成了14个函数。每一个大约是40-50 行左右.
参考资料:
http://blog.csdn.net/deng0zhaotai/article/details/17512515
http://blog.csdn.net/shulianghan/article/details/50553001
https://www.zhihu.com/question/19759722
https://source.android.com/devices/graphics/