前言

       古人常说,“熟读唐诗三百首,不会作诗也会吟”,说明了大量阅读诗歌名篇对学习作诗有非常大的帮助。做开发也一样,Android源码是全世界最优秀的Android工程师编写的代码,也是Android开发中绝对的权威所在。Android系统开源,且占据了当今手机系统世界的绝大部分江山,各大手机厂商要做手机系统定制,就必须对Android系统源码非常熟悉,这就要求他们的工程师们去熟读源码。即使是纯第三方App的开发者,要想成为Android开发真正的行家里手,也必须对系统源码有一定的研究。本系列文章将记录笔者学习Android源码的理解和心得,以此来和广大的同行们进行交流和相互提升。

本篇文章是这一系列的第一篇,将主要记录或者介绍Android源码的获取,系统源码的宏观结构及内容,源码阅读工具推荐及使用方法等内容。主要内容如下:

一、Ubuntu下获取Android系统源码

Android源码的获取方式有许多,既可以在Windows下去获取,也可以Linux下去下载,比较常见的方法是在Linux下用repo工具去下载。笔者使用的方式是在Windows7系统下安装Ubuntu16.04双系统,然后采用repo工具去获取的源码。其中每一个步骤都可以在网上找到很多资料,笔者不赘述,也不自己探索方法,这里仅记录下成功安装获取源码过程中参考的网页、主要步骤以及碰到的若干问题,以供读者和笔者自己以后参考使用。基本操作步骤如下:

1、在Win7中分区

在Windows7中为Ubuntu系统分区,参考了【Win7下安装Ubuntu16.04成双系统】中第一节分区步骤。Android系统源码未编译前就有大约20-30G大小,编译后更大,所以一定要预留足够的空间。

2、制作Ubuntu U盘系统启动盘

参看网页【Ubuntu16.04安装基础入门教程】前5步。Ubutu镜像文件从Ubutu官网下载即可,不过需要注意的是,要先弄清楚下载32位还是64位的系统:在主系统Win7桌面查看“计算机”图标属性,可以看到系统的位数,如下图所示:

所以咱们在选择Ubuntu系统的时候也选择64位的。这里笔者也有一个疑问,既然这里Ubuntu和Win7是独立的双系统,那么应该没有必要两个系统的位数必须一致吧,这里笔者没有研究过,读者可以去查资料探索一下,当然,选择同样的位数总是会比较保险一点。在Ubuntu下载版本中,结尾为amd64的版本为64位系统,结尾为i386的版本为32位系统。

3、U盘启动并安装Ubuntu系统

在BIOS boot中将默认的硬盘启动修改为U盘启动,然后重启即可进入到Ubuntu的安装界面,根据需要一步一步进行即可。至于如何进入到BIOS设置界面,不同的主板快捷键不一样,笔者这里不详述,读者根据主板型号百度即可。安装成功后,记得修改回来为默认硬盘启动。

4、Ubuntu中获取源码

参考【Aosp|镜像使用帮助|清华大学开源镜像站】,笔者选择的是“使用每月更新的初始化包”。源码比较大,所以下载需要好几个小时的时间,所以最好在晚上下载,避开网络使用高峰期。

5、碰到的问题记录

(1)安装完Ubuntu后,再重启时,系统选项中找不到原Win7系统。

安装好Ubuntu后,我们希望在启动电脑的时候出现一个系统选项,选择是进入原Win7系统还是新安装的Ubuntu系统。如提问中描述,找不到Win7系统选项入口,就无法进入到原来的Win7系统中。这种情况,请参考【Win7系统安装Ubuntu系统后,不能进入Win7】。笔者曾多次碰到过这个问题,以为是把原Win7系统给覆盖掉了,走过不少的弯路,后来找到链接中的方法才解决。

二、Android源码目录结构

       Android系统源码内容实在太广,其目录结构也实在庞大,每位开发者也无法做到对每一块都弄明白,工作中接触的也只是其中的一小部分。以下只从宏观上对系统源码的一级目录进行介绍,后续再慢慢完善更细致的内容。

三、Android系统架构和源码的联系

在笔者以前的博客【朝花夕拾】Android性能篇之(五)Android虚拟机第二大点中简单介绍过Android的系统架构,其实在Native Libraries层和Linux Kernel层之间还有一层——HAL层,即Hardware Abstract Layer,硬件抽象层。在众多介绍Android系统架构的展示图中,有的版本显示HAL,有的没有,读者知道有这一层就好了。如下为Android源码官网【AOSP:Android Open Source Project 】中Android系统架构图,就展示HAL。

对于Android系统架构每一层,Android源码结构中都有相关目录与之对应。下图展示了在Android源码一级目录中,各框架层和部分目录的对应关系:

理解Android系统结构和Android系统源码的对应关系,有助于帮助咱们理解Anroid系统源码。当然,这幅思维导图中只介绍了源码一级目录和系统架构的对应关系,深入各个目录,每个系统架构层还可以找到很多源码与之对应,读者可以再深入研究研究。与此同时,同一个目录下的源码,也可能涉及多个系统架构层的内容,比如,frameworks层中就有frameworks/base/packages/SystemUI这个目录,众所周知,SystemUI是一款系统App,是属于应用层的。所以,对某个目录的对应的系统架构层,也不能一概而论。

四、Android源码阅读工具介绍

选择好的源码阅读工具,可以让工作事半功倍。如今市面上有许多工具来辅助阅读源码,有在线阅读的,比如:AndroidXRef、Android SDK Search等;也有本地阅读的,比如:Source Insight等。同时,Google也提供了官方网站,用于指导开发者使用源码:【AOSP文档网站(中文版)https://source.android.google.cn/

1、AndroidXRef

前文也说过,Android源码非常庞大,下载源码也是非常耗用时间。我们可能经常碰到需要临时查看源码,而当前设备上没有的情况。幸运的是,有一些在线阅读源码的网站,给开发者带来了很大的便利,AndroidXRef就是其中一款备受青睐的源码在线阅读网站【网址:http://androidxref.com/】。在这里,笔者简单介绍一下该网站的基本使用。

(1)查看并选择系统版本

进入首页后,可以看到Google发布的各个系统版本,按照发布时间排序,包括版本别名,版本号,内核号等,如下图所示,开发者可以根据需要点击进入对应的版本。

(2)源码查找主界面功能点

(3)搜索条件的解锁及使用

1)Full Search

进行全文搜索,属于模糊查询,忽略大小写,会匹配所有的单词、字符串、标识符以及数字等,包括注释在内。如下图所示,为全文搜索“Activity”的结果,也显示了所在文件的路径,可以点击进入对应的文件。

2)Definition

搜索符号定义相关的代码。如下所示,同样输入“Activity”后,显示的搜索结果,“Activity”都是作为包名、类名或定义类型,方法名等出现的,可以和上面Full Search结果做对比。多次尝试搜索的结果来看,这里会区别大小写,搜索的也是整个单词,这里搜索会更精准一些。

3)Symbol

符号搜索,主要用于搜索类中的成员变量等,也是精确查找,如下图所示,就是根据成员变量“FEATURE_NO_TITLE”搜索的结果。

4)File Path

搜索源码文件名或路径中包含搜索条件字符串的文件,忽略大小写。如下所示,显示了文件路径或文件名中包含了“Activity”的结果。

5)History

该条件暂时没发现怎么使用,有写帖子上甚至直接说该条件没用,这里笔者不做说明,也不举例了。

该部分能够帮助开发人员快速定位到想要查看的代码,熟练使用,能极大地提高效率。上述介绍的都是单一条件搜索,开发人员可以根据实际情况对条件进行组合搜索,这样搜索起来就更精准了,使用起来很简单,这里不再举例子了。

2、Android SDK Search

该工具使用起来使得在线阅读源码更方便,将API和源码完美结合起来。但是使用该工具,需要VPN,即需要FQ,访问境外服务器。这里笔者就不详细介绍了,能FQ的读者,可以参考如下使用方法网址:【Android SDK Search 使用方法】。另外提供一个免费FQ工具,简单易用:【蓝灯(Lantern)】。

3、Source Insight

这是一款被开发者们广泛使用和称赞的本地源码阅读软件,除了阅读,还可以方便地进行开发。Source Insight工具功能强大,操作复杂,以后会专门写一篇文章来介绍它的使用,这里篇幅有限,就不详细介绍了。除此之外,还有很多开发工具可以用来阅读源码,比如Eclipse,Android Studio等都可以用来阅读系统源码,但这方面的功能无法和Source Insight相提并论,就不多做介绍了,把使用最广泛,最专业的工具用好就可以了。

五、附录:Andriod源码下载地址分享

1、android-6.0.1_r72

链接:https://pan.baidu.com/s/1jq_Op-iFtk53PonHd3aadA  提取码:vfg1

2、android-7.1.1_r1

链接:https://pan.baidu.com/s/1yb1jPBl471W8AbdO2056rg  提取码:v32i

3、android-8.0.0_r1

链接:https://pan.baidu.com/s/1EsXV75Yd9UYKyCn-THGFgQ  提取码:c1w8

4、android1.6-8.1

链接:https://pan.baidu.com/s/1ngsZs

本篇文章作为Android系统源码系列的第一篇,主要介绍了获取源码,以及源码阅读工具使用方法等方面内容,为后续深入分析和理解源码做准备工作。限于笔者的经验和知识水平,文中有论述不准确或不恰当的地方,请读者们多多指正,谢谢!

【安卓本卓】Android系统源码篇之(一)源码获取、源码目录结构及源码阅读工具简介的更多相关文章

  1. Linux第一篇【介绍、安装Ubuntu、基本目录结构】

    Linux介绍 Linux:不管是不是我们这些学编程的都肯定会听说过这么一个系统,一般地,我们在PC端都是用Windows操作系统,那我们学习Linux操作系统有什么用呢??? 由于我们的JAVAEE ...

  2. 【安卓开发】Android系统中Parcelable和Serializable的区别

    http://greenrobot.me/devpost/android-parcelable-serializable/ 进行Android开发的时候,我们都知道不能将对象的引用传给Activiti ...

  3. 【工利其器】必会工具之(二)Android开发者官网篇

    前言 当刚开始踏入Android程序员这个行业的时候,想必绝大多数的人都和笔者一样,热血沸腾,激情四射,买了很多讲解Android开发的书籍.当开发某个功能需要学习某方面知识的时候,大家又成了“面向百 ...

  4. Android系统四层架构分享

    Android系统四层架构 个人网站:http://www.51pansou.com Android视频下载:Android视频 Android源码下载:Android源码 如果把Android系统看 ...

  5. iTOP4418开发板7寸屏幕Android系统下横竖屏设置

    Android系统屏幕旋转设置 平台: iTOP4418开发板+7寸屏幕 1. Androd4.4源码可以编译成手机模式和平板模式,讯为iTop4418 开发平台的Android系统默认编译为平板模式 ...

  6. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

  7. (3.1)mysql基础深入——mysql二进制与源码目录结构介绍

    (3.1)mysql基础深入——mysql二进制与源码目录结构介绍 关键字:二进制目录结构,源码目录结构(编译安装目录结构) 1.二进制安装程序目录结构 [1] BIN -- mysql的可执行文件( ...

  8. Android 系统属性

    /************************************************************************ * Android 系统属性 * 说明: * 由于需 ...

  9. 【树莓派】树莓派上刷android系统

    这位前辈之前做了基于android2.3版本刷入树莓派的事情,http://blog.csdn.net/lichwei1983/article/details/44082669 1.android 镜 ...

随机推荐

  1. maya cmds pymel 'ESC' 退出 while, for 循环

    maya cmds pymel 'ESC' 退出 while, for 循环 import maya.cmds as cmds cmds.progressWindow(isInterruptable= ...

  2. tensorflow 使用 2 Felch ,Feed

    Felch ::在会话里可以执行多个 op , import tensorflow as tf input1 = tf.constant(3.0) input2 = tf.constant(2.0) ...

  3. JTAG各类接口针脚定义及含义

    注:转自 揽月阁 JTAG有10pin的.14pin的和20pin的,尽管引脚数和引脚的排列顺序不同,但是其中有一些引脚是一样的,各个引脚的定义如下. 一.引脚定义 Test Clock Input ...

  4. CMD 中常见命令

    引自百度经验:https://jingyan.baidu.com/article/67508eb41d44a09cca1ce4f1.html ipConfig:查询ip ping:查询连接速度: pi ...

  5. python学习:购物车程序

    购物车程序 product_list = [ ('mac',9000), ('kindle',800), ('tesla',900000), ('python book',105), ('bike', ...

  6. 关于外网无法访问阿里云主机CentOs

    前两天阿里云ECS搞活动,所有买了个三年的Ecs,然后照着之前在虚拟机同样的搭建服务器,一切都很正常,可是 当我配置好防火墙和nginx之后,发现个问题,外网无法访问. 思考: 1.我的nginx没配 ...

  7. HTTP Status 500 - Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    今天整合ssm框架 时 遇到的问题 困扰我好长时间     原因就是  mapper文件 没有被加载进来 但是 为什么没有被加载进来呢  因为中间的配置文件出了一些问题 网上大多数说法是   在pom ...

  8. nvidia-smi GPU异常消失 程序中断

    GPU型号为NVIDIA的1080Ti,最近出现的状况的是某一个GPU突然就出问题了,如果在该GPU上有运行程序的话则程序中断,nvidia-smi显示出来的GPU则少了这一个. 1.一开始怀疑是温度 ...

  9. Lua学习链接

    Lua捕获 Lua中_G 是个什么鬼 Lua与ObjC的交互

  10. 电子科技大学第九届ACM趣味程序设计竞赛(热身赛)题解

    比赛地址:http://acm.uestc.edu.cn/#/contest/show/191 A题 小羽涂色 题意: 在x轴的正半轴上,问你是否存在一段区间[L,R]其中包含r个奇数和g个偶数. 分 ...