摘抄:http://baike.baidu.com/link?url=ohiJS-ORerVtiZLJu3s4h1iRtetO_3bxhElptQvyNeoLWdSjvAweli4GCZITSR3oxzI5WemwqzFo7kZoMn2b1q
Android操作系统是基于Linux实现的,然而Android的核心价值却不是Linux,所以说,Android的内核不是指Linux,本书不是一本介绍Linux的书。这就好比苹果的操作系统iOS是基于Unix实现的,然而iOS的核心价值却不是Unix。
那么,Android的内核是什么,它的核心价值都包含什么?
大家听过和Android内核最多的词语应该是“Android Framework”以及“Dalvik虚拟机”,那么,这两个核心部分从内部运行机制的角度来看,到底扮演着什么角色,彼此之间如何协同工作呢?了解清楚了这些,也就了解了所谓Android的核心价值,即Android内核。
从进程的角度来看,Android的运行环境如下图所示:

当Linux内核启动后,此时系统的状态和普通的Linux系统基本相同,通过配置Linux中的init.rc文件,可以指定内核启动后都要执行什么程序,而这之后所启动的程序才是Android系统和普通Linux应用系统的区别。

init.rc中所启动的一个重要进程被称作zygote进程,如上图中红色边框所示,zygote这个英文单词的意思是“受精卵”,本书将其称为“种子进程”,从进程的角度来看,种子进程仅仅是一个Linux进程而已,它和一个只包含main()函数的C程序所产生的进程是同一个级别,如上图中双实线边框所示。
种子进程里面所运行的程序基本上就是Android内核的精华所在,其内部主要完成了两件事情。第一件事情是装载了一段程序代码,这些代码都是用C语言写的,这段代码的作用只是为了能够执行Java编译器编译出的字节码,这段代码就是传说中的Java虚拟机,在Android中称为Dalvik虚拟机。
第二件事情必须基于第一件事情之后,即当Dalvik虚拟机代码初始化完成后,从一个名为ZygoteInit.java类中的main()函数中开始执行。这里大家就奇怪了,Dalvik虚拟机如何知道ZygoteInit这个Java类在哪个Jar包里面?实际上,这个Jar包的目录位置信息正是在init.rc中进行配置的,只不过没有直接指定,而是使用一个标志符,当这个标志符是“zygote”时,Dalvik虚拟机就会从“硬编码”的字符串中得到ZygoteInit类所在的Jar包,而这个Jar包正是framework.jar。
接下来的事情即是简单的,又是复杂的。所谓简单是指,ZygoteInit类中main()函数所做的事情和Linux本身就没多大关系了,理论上完全可以在该main()函数中实现任意简单的功能;所谓复杂是指,该main()函数中才刚刚开始启动Android的核心功能。
在ZygoteInit类中的main()函数中,首先加载一些类文件,这些类将作为以后所有其它Apk程序共享的类,接着,会创建一个Socket服务端,该服务端将用于通过Socket启动新进程。
该进程之所以被称为“种子”进程的原因就是,当其内部的Socket服务端收到启动新的Apk进程的请求时,会使用Linux的一个系统调用folk()函数从自身复制出一个新的进程,新进程和Zygote进程将共享已经装载的类,这些类都是在framework.jar中定义的。
以上从进程的角度分析了Android内核的概念,下面从图形用户界面的角度再来看看Android内核的含义。大家都知道,Linux内核所提供的功能主要包括:
l进程调度
l内存管理
l 驱动模型
这些功能都是和用户界面没有关系的,内核一般仅仅会通过USB接口或者RS232串口输出一些状态信息,而对于窗口操作系统而言,这还远远不够,最重要的就是操作系统应该提供一套用户界面子系统,该子系统包含如何创建、删除窗口,以及用户如何和窗口进行交互,同时还应该提供一套界面程序库,以便第三方开发商能够基于该界面库快速的开发一些窗口应用程序。而这就是Android最核心的内容,完成这些功能的代码大部分都在那个framework.jar文件中,Dalvik虚拟机只不过是执行这些功能代码的一个环境而已。
因此,如果考虑图形用户界面,则一个Android应用程序的内部关系如下图所示:

首先,内部模块可分为三个大部分,分别是:

第一部分,Linux驱动端。该模块重新把标准Linux驱动抽象为Android所定义的硬件接口,从而保持了Android内核代码的独立性,即当Linux驱动有变动时,只需要修改该适配层,而不需要再修改Android内核的代码。该驱动端也被称作硬件抽象层(Harware Abstarction Layout)。
第二部分,Framework服务端,该服务端主要进行输入消息的处理,并将消息传递给窗口管理服务线程(WmS),WmS内部会根据当前所有应用窗口的层次关系,决定应该把这个消息派发给哪个窗口。除了WmS外,还包含一个核心线程组件,即Activity管理线程(AmS),Activity是Android中定义的一个程序片段,这个片段可理解为“可以被动态加载的程序”,即,当应用线程启动后,可以根据用户的操作,有选择的加载不同的Activity。
第三部分,Apk应用程序客户端。每一个Apk应用程序的客户端都是从ActivityThread类中的main()函数开始执行,这和一个普通的Java程序完全相同,当ActivityThread启动后,会向AmS报告说“自己已经启动了,请告诉我要执行哪一个Activity片段”,AmS会通过进程间通信(Inter Process Communication)的方式把要加载的Activity信息告诉给ActivityThread,从而ActivityThread执行指定的Activity,而在Activity内部会调用Framework中提供的各种添加窗口的函数进行窗口的添加和删除。

什么是Android内核相关推荐

  1. quado编辑Android代码步骤,Ubuntu11.10下编译android内核源码

    编译android源码时并不会自动编译android内核,因此需要手动编译这部分代码.编译内核所用的时间比编译android源码要少得多,只需一会就编译完成. 1.确定内核版本 进入存放android ...

  2. Android内核开发:源码的版本与分支详解

    我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢? (1) Android版本有哪 ...

  3. Android内核开发:学会分析系统的启动log

    本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统 ...

  4. Android内核开发:系统编译输出的镜像文件

    本文是<Android内核开发>的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系 ...

  5. ANDROID内核和驱动篇-ANDROID内核介绍(转)

    已经有一些的文章介绍Android内核了,本系列篇将从Linux内核的角度来分析Android的内核,希望给初学者提够有用的信息.本章将简单的介 绍Android内核的全貌,起到一个抛砖引玉的作用.从 ...

  6. CVE-2015-3636(pingpong root) android内核 UAF漏洞分析

    前言 去年差不多这个时候就计划把这个漏洞给分析了,由于android没有经常搞,所以踩了很多坑,中间一度因为各种原因停滞放弃,最近遇到一个事情让我下定决心把它了结,也算是解决一个心病.过程会写详细一点 ...

  7. linux核能软件,ARM big.LITTLE大小核架构在Linux和Android内核下多核调度算法

    在2013年,big.LITTLE家族又增加了新的SoC实现,有2个Cortex-A15+3个Cortex-A7核的ARM的参考测试芯片TC2,以及在三星Galaxy S4手机中应用的Samsung- ...

  8. android4 设置栈大小,【技术分享】Android内核漏洞利用技术实战:环境搭建栈溢出实战...

    [技术分享]Android内核漏洞利用技术实战:环境搭建&栈溢出实战 2017-08-14 16:22:02 阅读:0次 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn ...

  9. Android内核和Linux内核的区别

    1.Android系统层面的底层是Linux,并且在中间加上了一个叫做Dalvik的Java虚拟机,从表面层看是Android运行库.每个Android应用都运行在自己的进程上,享有Dalvik虚拟机 ...

  10. android 内核态

    今天,简单讲讲android的内核态的知识. 一.内核态(Kernel Mode)与用户态(User Mode) 内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可 ...

最新文章

  1. 第一届全国大学生智能汽车竞赛获奖名单
  2. python爬取小说章节信息用pygame进行数据显示_爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)...
  3. centos在线安装svn
  4. 线下实操:搭建微服务天气预报应用!
  5. ActiveMQ介绍
  6. SpringCloud(Gateway网关使用)
  7. 基于 Docker 打造前端持续集成开发环境
  8. iis8.5限速没有效果怎么回事_电梯为何会发生坠梯?没有安全措施吗?能在井道底安装大弹簧吗?...
  9. 了解on的依赖的调查作业的最终目的,前期尽可能的要出更多的工数
  10. Sql Server2005创建数据库
  11. mui 框架图片预览
  12. 正弦交流电的瞬时值、最大值、有效值
  13. 软件工程(速成)——第四章 总体设计
  14. 民宿运营经验分享:玩转自我营销,带动流量持续增长
  15. Improving Graph Collaborative Filtering with Neighborhood-enriched Contrastive Learning(个人笔记)
  16. 如何在 Windows 下创建 macOS 引导介质 (USB 启动盘)
  17. 互动作业Android版本下载,互动作业app
  18. 原创 | 聊聊延迟满足
  19. uniapp 实现聊天页面 textarea固定在底部且高度自增
  20. 01背包+概率dp Just another Robbery 抢银行

热门文章

  1. DM6467的CAN模块调试(SPI转CAN)
  2. ubuntu 下最简单的歌词软件osdlyric (with banshee)
  3. 制作的自媒体短视频很模糊?教你3个方法,让视频变清晰
  4. 苹果电池显示维修_安装第三方电池的iPhone也可享受苹果官方维修
  5. 火遍全国的网络热梗“yyds”,创造者被判刑 3 年
  6. win7如何修改html图标,win7如何更改软件图标_win7修改应用程序图标的教程
  7. KY122 找出直系亲属
  8. Dynamics CRM和企业微信集成(二)方案实现
  9. 强大易用!新一代爬虫利器 Playwright 的介绍
  10. 中国“千禧一代”是一群什么样的消费者?