深入解读Linux与Android的相互关系 Android消息处理系统的原理
深入解读Linux与Android的相互关系
大家都知道Android是基于Linux内核的 操作系统,也曾经和Linux基金会因为内核问题产生过分歧,本文将开始对Android的内核进行剖析,主要介绍Android和Linux之间的关系,后续还会讲到Android系统在Linux系统之上扩展的部分功能和驱动,希望大家能够持续关注IT168技术频道。
虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了自己所特有的驱动程序。下面我们就来分析一下它们之间究竟有什么关系?
一、Android为什么会选择Linux
成熟的操作系统有很多,但是Android为什么选择采用Linux内核呢?这就与Linux的一些特性有关了,比如:
1、强大的内存管理和进程管理方案
2、基于权限的安全模式
3、支持共享库
4、经过认证的驱动模型
5、Linux本身就是开源项目
更多关于上述特性的信息可以参考Linux 2.6版内核的官方文档,这便于我们在后面的学习中更好地理解Android所特有的功能特性。接下来分析Android与Linux的关系。
二、Android不是Linux
看到这个标题大家可能会有些迷惑,前面不是一直说Android是基于Linux内核的吗,怎么现在又不是Linux了?迷惑也是正常的,请先看下面几个要点,然后我们将对每一个要点进行分析,看完后你就会觉得Android不是Linux了。
因为它没有本地窗口系统,没有glibc的支持,而且并不包括一整套标准的Linux使用程序,同时增强了Linux以支持其特有的驱动。
1.它没有本地窗口系统
什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。不同的操作系统的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统,这是Android不是Linux的一个基本原因。
2.它没有glibc支持
由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为C库,而是Google自己开发了一套Bionic Libc来代替glibc。
3.它并不包括一整套标准的Linux使用程序
Android并没有完全照搬Liunx系统的内核,除了修正部分Liunx的Bug之外,还增加了不少内容,比如:它基于ARM构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统等。
4.Android专有的驱动程序
除了上面这些不同点之外,Android还对Linux设备驱动进行了增强,主要如下所示。
1)Android Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcess Communication,IPC)功能。源代码位于drivers/staging/android/binder.c。
2)Android电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化。源代码位于:
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
3)低内存管理器(Low Memory Killer) 比Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。
4)匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c。
5)Android PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c。
6)Android Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c。
7)Android Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。源代码位于drivers/rtc/alarm.c。
8)USB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框架的。源代码位于drivers/usb/gadget/。
9)Android Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。
10)Android timed device 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)。
11)Yaffs2 文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。
上面这些要点足以说明Android不是Linux。本书的主要内容将围绕Android的这些特有的部分展开,我们的讲解会尽量通俗易懂,但还是建议大家先复习一下Linux内核的基本知识。在具体学习之前,我们还是先来总体浏览一下Android对Linux内核进行了哪些改动,在移植时就需要对这些改动加以调整。
深入理解 Android消息处理系统的原理
Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上谷歌参考了Windows的消息循环机制,也在Android系统中实现了消息循环机制。
Android通过Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。
本文深入介绍一下Android消息处理系统原理。
Android系统中Looper负责管理线程的消息队列和消息循环,具体实现请参考Looper的源码。 可以通过Loop.myLooper()得到当前线程的Looper对象,通过Loop.getMainLooper()可以获得当前进程的主线程的Looper对象。
前面提到Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列 和一个消息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默认是没有消息循环和消息队列的,如果想让该线程具有消息队列和消息循环,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。如下例所示:
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here } };
Looper.loop();
} }
这样你的线程就具有了消息处理机制了,在Handler中进行消息处理。
Activity是一个UI线程,运行于主线程中,Android系统在启动的时候会为Activity创建一个消息队列和消息循环(Looper)。详细实现请参考ActivityThread.java文件。
Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。详细实现请参考Looper的源码。
Activity、Looper、Handler的关系如下图所示:
一个Activity中可以创建多个工作线程或者其他的组件,如果这些线程或者组件把他们的消息放入Activity的主线程消息队列,那么该消息就会在 主线程中处理了。因为主线程一般负责界面的更新操作,并且Android系统中的weget不是线程安全的,所以这种方式可以很好的实现Android界 面更新。在Android系统中这种方式有着广泛的运用。
转载于:https://my.oschina.net/alphajay/blog/28925
深入解读Linux与Android的相互关系 Android消息处理系统的原理相关推荐
- android context继承关系,Android - 认识Context
app开发中,我们需要使用app的资源,比如文字.图片,Activity.Service或者broadcastReceiver等等.时常也会用到getApplicationContext()来获取一个 ...
- android context继承关系,android中Context深入详解
以下分别通过Context认知角度,继承关系,对象创建等方面android中Context做了深入的解释,一起学习下. 1.Context认知. Context译为场景,一个应用程序可以认为是一个工作 ...
- Microbiome:应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系(一作解读)...
Microbiome: 应用多维宏组学方法协同揭示复杂细菌群落对目标底物代谢的菌间相互关系 香港大学张彤教授团队与北京大学余珂博士研究团队,以生物降解菌群为研究模型,运用多维宏组学方法(宏基因组.宏转 ...
- Linux与JVM的内存关系分析
Linux与JVM的内存关系分析 原文出处: 美团技术团队 引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 ...
- anaconda中的python如何进行关联分析_Anaconda、Miniconda、Conda、pip的相互关系
Anaconda.Miniconda.Conda.pip的相互关系.如果你想要跳过这篇文章,并得到讨论的要点,你可以阅读每个标题以及下面的摘要. 认为#1:Conda是一个发行版,不是一个软件包管理器 ...
- 安卓linux输入代码在哪里,输入 | Android 开源项目 | Android Open Source Project
Android 输入子系统名义上由遍历系统多个层的事件管道组成. 输入管道 在最低层,物理输入设备会生成描述状态更改(例如按键按压和轻触接触点)的信号.设备固件以某种方式编码和传输这些信号,例如向系统 ...
- Linux与JVM的内存关系分析(转)
引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存 ...
- 《纯技术分析阿里云OS和Android之间的关系》补充
前面一份投稿的错误很抱歉,rom本身就找错了,用了一个AOSP-like的刷机包.好在这份内容错误的投稿多少起到了抛砖引玉的作用,当天晚上,就给出了正确的rom的分析<纯技术分析阿里云OS和An ...
- 大数据、云计算和人工智能的深度剖析与相互关系,值得入行者典藏
云计算.大数据和人工智能,这三个东西现在非常火,并且它们之间好像互相有关系:一般谈云计算的时候会提到大数据.谈人工智能的时候会提大数据.谈人工智能的时候会提云计算--感觉三者之间相辅相成又不可分割.但 ...
- 纯技术分析阿里云OS和Android之间的关系
注:转载一篇比较客观的文章. 前一篇<[多图论证]阿里云OS不太可能是Android以外的东西>用的ROM是错的,是Android的刷机包,不是官方原生的云OS的ROM,所以论据是错的.这 ...
最新文章
- 解决导入.vdi文件时报“uuid is exists”错误
- 近期活动盘点:​年末必学课程《社会网络分析》
- C++实现数组中求第K大数
- pythonexcelweb交互插件_来一次Python与Excel的完美交互
- 会议交流 | “数据智能与知识服务”研讨会的专家报告题目已更新!
- javascript变量提升/函数提升
- mysql复杂查询示例_找到时间和内存复杂性之间的平衡-一个示例
- win10上如何启用或禁用Windows功能
- python提取文本中的数字_EXCEL中提取汉字、字母、数字如此简单
- python 声音合成_使用python进行声音生成/合成?
- Edge浏览器,设定主页(默认打开页面)方法
- 研究预测2022年全球VoLTE市场规模达348亿美元
- PLSQL导入导出表的正确步骤
- paip.输入法编程----二级汉字2350个常用汉字2350个
- MySQL 重置密码
- 详解怎么申请注册一个自己的电子邮箱邮件?怎么注册邮箱账号?
- 【meArm机械臂】第一篇·结构设计及搭建
- 微信小程序 --长按复制、点击复制实现
- NetSpot Pro一款非常强大的可视化wifi检测工具
- 面包师问题--进程同步问题
热门文章
- CentOS 6.3最小化安装后,有些必备工作才可以正常使用
- 微服务架构实战篇(三):Spring boot2.0 + Mybatis + PageHelper实现增删改查和分页查询功能
- hive 建表_大数据面试必备 | Hive数据仓工具面试题!
- C# 使用RabbitMQ(二)安装
- app前后台交互php_PHP分布式架构RPC介绍以及手写RPC框架
- Kibana将语言设置为中文
- PHP根据配置设置可变变量
- java链式语法_javaScript链式调用原理以及加法实现
- vba判断文件编码格式_VBA编写Ribbon Custom UI编辑器07——写入xml
- objdump: ‘1443.14.0)‘: No such file or directory