当前位置: 代码迷 >> Android >> Android 5.0内核跟源代码学习(2)——源码下载和系统启动过程分析
  详细解决方案

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

热度:90   发布时间:2016-04-27 23:43:00.0
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)      bionicBionicAndroidC/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内核之上,因此它的启动过程从LinuxBootLoader开始到Linux内核完全启动后才开始启动属于Android的部分,Android这一部分的启动过程的主要代码位于android/system/core/init包下。Android启动过程中做了很多事,但是有一些关键的节点,这就是下面所说的步骤。


2Android启动第一步:init进程

Linux内核启动之后就会启动Android的老祖宗——init进程(PID0),那么这个进程干了些什么事呢?总的来说就是根据init.rc脚本中的内容:挂载了一些目录、配置了一些环境变量、启动了很多服务。

1)那么init.rc里面有什么?

init.rc位于android/system/core/rootdir下面,里面定义了一些事件和服务(actioncommandserviceoptions),它的语法规则在android/system/core/init/readme.txt文件里有说明

2init.rc语法简介(更具体的还是自己看readme.txt,很详细):

     a)action的语法形式如下:

          on <trigger>

              <command>

              <command>

     b)Service的语法形式:

           service<name> <pathname> [ <argument> ]*

                 <option>

                <option>

   ...

3Android启动第二步: 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中,这里的XXX3264是根据平台不同而变化的。下面是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)启动Androidruntime  b)创建了一个socket接口,用来接收ActivityManagerServiceSocket请求来创建新的进程  c)启动了SystemServer

 

5Android第四步:SystemServer进程

上一步说zygote的关键一步是启动了SystemServer进程,那么这个进程有什么特殊的呢?SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService等等等等,这个暂时就不细讲了,将来补上。

 

6Android第五步: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
不明觉厉哦
  相关解决方案