Android 5.0内核和源代码学习(2)——源码下载和系统启动过程分析

一、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系统的启动过程,有些地方并没有讲的很详细,将来随着学习会继续深入,下一篇还没决定看什么,哈哈。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-29 23:04:28

Android 5.0内核和源代码学习(2)——源码下载和系统启动过程分析的相关文章

Android 5.0内核和源代码学习(3)——SystemServer启动了什么服务?

一.综述 上一篇讲述Android启动过程的时候,在第四部的关键进程SystemServer讲的很粗略,只是简单介绍它启动了很多服务,那么它究竟启动了哪些服务,执行过程是怎么样的呢?这一次,我就通过源代码注释的方式介绍一下SystemServer. 二.SystemServer源代码分析 三.小结 上面的代码是经过精简的,把目光聚焦于SystemServer究竟启动了什么服务,里面很多服务见名生义,就不多加解释了:其中很多打问号的服务,目前还没有弄清楚是干嘛的,随着学习会陆续更新. 如有错漏,请

一个jeecg整合activiti的学习例子,源码下载

社区成员:刘京华采用技术:jeecg+ activiti源码下载地址:http://pan.baidu.com/s/1dDxOHrV 截图演示:  2.jpg (71.81 KB, 下载次数: 0) 4.jpg (41.98 KB, 下载次数: 0) 5.jpg (64.07 KB, 下载次数: 0) 5.jpg (64.07 KB, 下载次数: 0) 一个jeecg整合activiti的学习例子,源码下载

Struts2+Spring+Ibatis用户注册、登录、管理入门学习实例源码下载

原文:Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463735532544.htm Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 项目截图: jar包和sql文件都在源码包中. 运行截图: 用户注册页面: 用户管理页面:

Android中AIDL实现进程通信(附源码下载)

AIDL概述 之前的博客<Android中通过Messenger与Service实现进程间双向通信>演示了如何通过Messenger实现与Service进行跨进程通信,即IPC.但用Messenger实现的IPC存在一点不足:Service内部维护着一个Messenger,Messenger内部又维护着一个Hanlder,当多个client向该Service发送Message时,这些Message需要依次进入Hanlder的消息队列中,Hanlder只能处理完一个Message之后,再从消息队

Android中常见Intent习惯用法-上篇(附源码下载)

Android中的Intent是一个非常重要的类,如果对Intent不是特别了解,可以参见博文<Android中Intent概述及使用>.如果对Intent Filter不是特别了解,可以参见博文<Android中Intent对象与Intent Filter过滤匹配过程详解>. 本文着重讲一下Android中一些常见的Intent的习惯用法,比如如何通过Intent发送短信.发送邮件.启动摄像机拍照录视频.设置闹铃.打开WIFI设置界面等等. 限于篇幅,本博文分为上下两篇,这是上篇

跟厂长学PHP内核(二):源码分析的环境与工具

本文主要介绍分析源码的方式,其中包含环境的搭建.分析工具的安装以及源码调试的基本操作. 一.工具清单 PHP7.0.12 GDB CLion 二.源码下载及安装 $ wget http://php.net/distributions/php-7.0.12.tar.gz $ tar zxvf php-7.0.12.tar.gz $ cd php-7.0.12/ $ ./configure --prefix=/usr/local/php7 --enable-debug --enable-fpm $

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

[学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解

我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴趣的朋友可以参考 Android Handler.Message完全解析,带你从源码的角度彻底理解 . 不过为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程,我们本篇文章的主角也就正是它了. Asyn

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L