一、Android源码下载
上一次简单介绍了Android系统的层次结构,这次开始动真格了——下载源码和分析源码!
那么,Android的源码从哪下?当然是谷歌官网,下载方法官网也讲得很详细,但是奈何中国的墙比较厚,所以上面的办法是没用的,当然,有些是有用的,地址:http://source.android.com/source/downloading.html
谷歌官网没办法下,幸好还有一些国内网站,废话不多说,直接开始步骤:
工具和环境:VM虚拟机+Ubantu14系统
第一步:Ubantu里面需要有git工具:sudoapt-get install git
第二步:下载并配置repo信息:
a) mkdir ~/bin
PATH=~/bin:$PATH
git clonegit://aosp.tuna.tsinghua.edu.cn/android/git-repo.git
b) a步骤中得到的git-repo中的repo文件拷贝到bin目录
cpgit-repo/repo ~/bin/
c) 修改repo文件,修改REPO_URL(用图形界面改也可以)
sudo gedit~/bin/repo
在该文件中修改URL(这是清华大学的)
REPO_URL ='git://aosp.tuna.tsinghua.edu.cn/android/git-repo'
第三步:初始化repo并开始下载
mkdir anroid
cd android
git config --global user.email"[email protected]"
git config --global user.name"Your Name"
repo init -ugit://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-5.0.2_r1
repo sync
下载结果上图证明(5.0的源码,很大32G左右):
二、Android源代码包简介
就用上图的顺序,一个一个粗略介绍下去(可能有错误和不详尽的地方,将来随着学习继续跟进)
(1) abi: applicationbinaryinterface,应用程序二进制接口
(2) art: AndroidRuntime,就是5.0新的AOT形式虚拟机
(3) bionic:Bionic是Android的C/C++library库(为何不用glibc?体积小,版权)
(4) bootable:启动引导相关代码
(5) build:系统编译规则及generic等基础开发配置包
(6) cts: Android兼容性测试套件标准
(7) dalvik:顾名思义,虚拟机
(8) developers:作用不详
(9) development:开发者需要的例程和工具
(10) device:设备相关代码,作用不详,里面有谷歌三星摩托罗拉htc的目录
(11) docs:介绍android开源相关的文档,怎么做贡献之类的。
(12) external:使用的一些开源组件,比如AES,网页服务器,压缩工具等等
(13) frameworks:第二层,核心框架(包括核心javaapi) ,是Android应用程序的框架
(14) hardware:主要是硬件适配层HAL代码
(15) libcore:第三层,核心库
(16)libnativehelper:作用不详,只有一句话,支持Android的类库的功能
(17) ndk:顾名思义,ndk(nativedevelopment kit)开发用
(18) packages:应用程序包,放了很多APP,比如闹钟、浏览器、输入法什么的
(19) pdk: 平台开发包(PlatformDevelopment Kit),这个是为OEM准备的
(20) prebuilts: x86和arm架构下预编译的一些资源
(21) sdk:这个不用讲,软件开发套件,包含各版本API和模拟器
(22) system:系统包,底层文件系统库、应用及组件——C语言,重点要看的!
(23) tools:工具,里面有fat32lib和gradle
Android 5.0的工程结构和之前的版本是有区别的,请不要纠结少了什么多了什么的问题。总之包结构简单浏览之后,可以开始重点研究某一部分了,接下来要将的Android系统启动过程主要位于System包下。
三、Android源代码之System包简介
Android源码System包截图如下,同时附带了包简介,其中研究重点就在于Core包。
四、Android的系统启动过程详解
1、简述
Android系统可以看成是Linux的一个分支,工作在Linux内核之上,因此它的启动过程从Linux的BootLoader开始到Linux内核完全启动后才开始启动属于Android的部分,Android这一部分的启动过程的主要代码位于android/system/core/init包下。Android启动过程中做了很多事,但是有一些关键的节点,这就是下面所说的步骤。
2、Android启动第一步:init进程
Linux内核启动之后就会启动Android的老祖宗——init进程(PID为0),那么这个进程干了些什么事呢?总的来说就是根据init.rc脚本中的内容:挂载了一些目录、配置了一些环境变量、启动了很多服务。
(1)那么init.rc里面有什么?
init.rc位于android/system/core/rootdir下面,里面定义了一些事件和服务(action、command、service、options),它的语法规则在android/system/core/init/readme.txt文件里有说明
(2)init.rc语法简介(更具体的还是自己看readme.txt,很详细):
a)action的语法形式如下:
on <trigger>
<command>
<command>
b)Service的语法形式:
service<name> <pathname> [ <argument> ]*
<option>
<option>
...
3、Android启动第二步: init进程启动关键进程:ServiceManager进程
Init进程会启动很多关键进程,ServiceManager就是其中一个,从名字上就可以发现,它是一个服务管理器,管理Service的注册和监听对Service的请求,没错,这里的Service就是Android的四大组件之一,是不是豁然开朗?
它的定义位于/home/wang/android/frameworks/native/cmds/servicemanager包中,它可以理解为Binder机制中的“DNS服务器”,负责Binder服务注册时的名称到底层Binder驱动提供的值的解析。下面是init.rc脚本里面启动它的方式:
service servicemanager /system/bin/servicemanager
class core –分类是核心服务
user system
group system
critical --4分钟内有4次退出,则重启设备,这样看来它是不是很关键?
onrestartrestart healthd --它重启的时候也重启别的服务
onrestartrestart zygote
onrestartrestart media
onrestartrestart surfaceflinger
onrestartrestart drm
4、Android启动第三步:init进程启动关键进程:Zygote进程
Zygote其实是受精卵的意思,正如其名,它的作用就是用来生成新的进程。他的启动地方和之前的版本不一样了,Android5.0的启动它的命令在android/system/core/rootdir/init.zygoteXXX.rc中,这里的XXX是32、64是根据平台不同而变化的。下面是init.zygote64.rc具体代码:
service zygote /system/bin/app_process64 -Xzygote/system/bin --zygote --start-system-server
class main
socket zygotestream 660 root system
onrestart write/sys/android_power/request_state wake
onrestart write/sys/power/state on
onrestartrestart media
onrestartrestart netd
第一句是很关键的,拆开来看是这样:
服务名:zygote
要启动的路径(或者叫程序):/system/bin/app_process64–Xzygote
启动的参数:/system/bin--zygote --start-system-server
好,问题来了,为啥启动的路径的结尾不是像servicemanager那样是自己呢?
这种路径表示,它并不是一个单独的进程,而是处于进程app_process64-Xzygote中,它的源代码位于android/frameworks/base/cmds/app_process/app_main.cpp中。
好吧,绕来绕去,蛋疼了不?这样吧,直接说这个app_process64-Xzygote干了什么吧。我认为有三个关键操作:a)启动Android的runtime b)创建了一个socket接口,用来接收ActivityManagerService的Socket请求来创建新的进程 c)启动了SystemServer
5、Android第四步:SystemServer进程
上一步说zygote的关键一步是启动了SystemServer进程,那么这个进程有什么特殊的呢?SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService等等等等,这个暂时就不细讲了,将来补上。
6、Android第五步:Home界面启动
上面的步骤完成后就进入了最后一步,启动Home界面。好,Android系统的启动过程就讲完了。
五、小结
这一篇主要介绍了Android的源代码的工程包结构和Android系统的启动过程,有些地方并没有讲的很详细,将来随着学习会继续深入,下一篇还没决定看什么,哈哈。
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 4楼yuxiangyunei昨天 22:14
- 哥们,好好努力,写详细点
- Re: a3694146416小时前
- 回复yuxiangyunein是刚刚迈出底层之路,确实需要努力,谢谢你的评论,第一个评论,很有纪念价值……
- 3楼zhoubin1992昨天 11:49
- 顶 一起努力
- 2楼u010028869昨天 11:12
- 学习了。http://blog.csdn.net/u010028869 互相交流。
- 1楼xieeyulu昨天 10:35
- 不明觉厉哦