Android 简介

2023-10-29

国内移动互联网发展史

播种 :2000年9月19日,中国移动和国内百家ICP首次坐在了一起,日本取经,2001年11月10日,中国移动通信的“移动梦网”正式开通。

萌芽:萌芽时期,先后冒出了搜索、音乐、阅读、游戏等领域的多种无线企业,不过,整个行业都处在混沌之中,因为没有人能够讲得清楚未来是什么,商业模式之争成为讨论最多的话题。

洗礼:2009年1月7日,工信部为中国移动、中国电信和中国联通发放3张第三代移动通信(3G)牌照。

成长:中国互联网络信息中心(CNNIC)今日在京发布第33次《中国互联网络发展状况统计报告》,截至2013年12月,中国网民规模达6.18亿,其中手机网民达到5亿,互联网普及率为45.8% 。2013年12月4日工信部向中国联通、中国电信、中国移动正式发放了第四代移动通信业务牌照,中国电信产业正式进入了4G时代。

移动平台之天下大势—三大移动平台

Android概况及常见概念

SDK: Software Development Kit,软件开发工具包
NDK: Native Development Kit,Android原生工具开发包

Android平台应用领域

物联网时代

手机(市场占有率70%以上):三星、华为、中兴、TCL、摩托罗拉、HTC、魅族、小米等
家电(电视、冰箱、微波炉和电饭煲,马桶):Google、松下、LG、三星等
导航:汽车、个人、轮船、游艇等
其它智能电子设备应用
路由器、娱乐场所、水利检测等

三星智能家电

日本推出Android智能马桶

日本卫浴公司Lixil,2012年底推出了内置谷歌Android功能,通过蓝牙与Android智能手机连接,你可以通过打开/关闭马桶盖、冲水等功能。

操控系统的智能马桶――“Satis”。该马桶内置语音和音乐,智能手机实现对马桶实现遥控,如坐垫加热、冲洗臀部、

Android平台发展史

  • 2008年9月,谷歌正式发布了Android 1.0系统,全球第一台Android设备HTC (G1)
  • 2009年4月,谷歌正式推出了Android 1.5
  • 2009年9月,谷歌发布了Android 1.6的正式版
  • 2010年12月,谷歌正式发布了Android 2.3
  • 2011年2月,Android系统设备的用户总数达到了1.35亿,发布Android 3.0
  • 2011年8月,Android手机已占全球智能机市场48%的份额,跃居全球第一
  • 2011年10月,正式发布Android 4.0
  • 2012年6月28日在Google I/O大会上随搭载Android 4.1的Nexus 7平板电脑一起发布
  • 2012年11月23日首款搭载Android 4.2的手机LG Nexus4及平板电脑Nexus 10上市
  • 2013年7月24日与Nexus 7平板二代同步发表
  • 2013年9月3日发布Android 4.4
  • 2014年6月25日发布Developer版(Android L)
  • 2014年10月15日正式发布Android5.0名称定为Lollipop "棒棒糖"。

Android 版本

什么是Android

Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统,它包括一个操作系统,中间件和一些重要的应用程序。

采用软件堆层(Software Stack,又名软件叠层)的架构,主要分为三部分。

  • 底层以Linux内核工作为基础,由C语言开发,只提供基本功能
  • 中间层包括函数库Library和Dalvik虚拟机,由C++开发。
  • 最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。

不存在任何以往阻碍移动产业创新的专有权障碍,号称是首个为移动终端打造的真正开放和完整的移动软件。这里,你可以把android看作是一个类似于windows的操作系统。

学习android平台下的软件开发正如以前学习windows平台下的软件开发一样。

主要使用于智能设备,如智能手机、平板电脑和智能电视等由Google公司领头开发并推广,2008年推出第一个版本。
此系统最初由"安卓之父"Andy Rubin(安迪-鲁宾)开发(2003年)

Android平台架构介绍

Android平台架构图

Android由底层往上分为4个主要功能层,分别是linux内核层Linux Kernel),系统运行时库层Libraries和Android Runtime),应用程序架构层Application Framework)和应用程序层Applications

Linux内核层

Android以Linux操作系统内核为基础,借助Linux内核服务实现硬件设备驱动,进程和内存管理,网络协议栈,电源管理,无线通信等核心功能。Android4.0版本之前基于Linux2.6系列内核,4.0及之后的版本使用更新的Linux3.X内核,并且两个开源项目开始有了互通。Linux3.3内核中正式包括一些Android代码,可以直接引导进入Android。Linux3.4增添了电源管理等更多功能,以增加与Android的硬件兼容性,使Android在更多设备上得到支持。直到现在最新的android6.0仍然继续延用着linux3.4.0,而linux最新的版本已经到了4.3系列,那么为什么android没有继续去更新Linux kernel的版本也是一个值得探讨的课题。
Android内核 对Linux内核进行了增强,增加了一些面向移动计算的特有功能。例如,低内存管理器LMKLow Memory Keller),匿名共享内存Ashmem),以及轻量级的进程间通信Binder机制等。这些内核的增强使Android在继承Linux内核安全机制的同时,进一步提升了内存管理,进程间通信等方面的安全性。下表列举了Android内核的主要驱动模块:

驱动名称 说明
Android电源管理(Power Management) 针对嵌入式设备的,基于标准Linux电源管理系统的,轻量级的电源管理驱动
低内存管理器(Low Memory Keller) 低内存管理器(Low Memory Keller) 可以根据需要杀死进程来释放需要的内存。扩展了Linux的OOM机制,形成独特的LMK机制
匿名共享内存(Ashmem) 为进程之间提供共享内存资源,同时为内核提供回收和管理内存的机制
日志(Android Logger) 一个轻量级的日志设备
定时器(Anroid Alarm) 提供了一个定时器用于把设备从睡眠状态唤醒
物理内存映射管理(Android PMEM) DSP及其他设备只能工作在连续的物理内存上,PMEM用于向用户空间提供 连续的物理内存区域映射
Android定时设备(Android Timed device) 可以执行对设备的定时控制功能
Yaffs2文件系统 Android采用大容量的NAND闪存作为存储设备,使用Yaffs2作为文件系统管理大容量MTD NAND Flash;Yaffs2占用内存小,垃圾回收简洁迅速。
Android Paranoid网络 对Linux内核的网络代码进行了改动,增加了网络认证机制。可在IPV4,IPV6和蓝牙中设置,由ANDROID_PARANOID_NETWORK宏来启用此特性。

硬件抽象层

内核驱动和用户软件之间还存在所谓的硬件抽象层(Hardware Abstract Layer,HAL),它是对硬件设备的具体实现加以抽象。HAL没有在Android官方系统架构图中标明,下图标出了硬件抽象层在android系统中的位置:

android架构图

鉴于许多硬件设备厂商不希望公开其设备驱动的源代码,如果能将android的应用框架层与linux系统内核的设备驱动隔离,使应用程序框架的开发尽量独立于具体的驱动程序,则android将减少对Linux内核的依赖。HAL由此而生,它是对Linux内核驱动程序进行的封装,将硬件抽象化,屏蔽掉了底层的实现细节。HAL规定了一套应用层对硬件层读写和配置的统一接口,本质上就是将硬件的驱动分为用户空间和内核空间两个层面;Linux内核驱动程序运行于内核空间,硬件抽象层运行于用户空间。

系统运行库层

官方的系统架构图中,位于Linux内核层之上的系统运行库层是应用程序框架的支撑,为Android系统中的各个组件提供服务。系统运行库层由系统类库和Android运行时构成。

系统类库

系统类库大部分由C/C++编写,所提供的功能通过Android应用程序框架为开发者所使用。主要的系统类库及说明如下表:

系统类库名称 说明
Surface Manager 执行多个应用程序时,管理子系统的显示,另外也对2D和3D图形提供支持
Media Framework 基于PacketVideoOpenCore的多媒体库,支持多种常用的音频和视频格式的录制和回放,所支持的编码格式包括MPEG4,MP3,H264,AAC,ARM
SQLite 本地小型关系数据库,Android提供了一些新的SQLite数据库API,以替代传统的耗费资源的JDBC API
OpenGL|ES 基于OpenGL ES 1.0API标准实现的3D跨平台图形库
FreeType 用于显示位图和矢量字体
WebKit Web浏览器的软件引擎
SGL 底层的2D图形引擎
Libc(bionic l ibc) 继承自BSD的C函数库bionic libc,更适合基于嵌入式Linux的移动设备
SSL 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议

以上的很多类库,例如SQlite,WebKit,SSL都在会在日常开发中有用到。(todo:之后楼主会对于其中常用的几个类库去专门做研究和学习,并且输出对应的博客)

除上表列举的主要系统类库之外,Android NDKNative Development Kit),即Android原生库,也十分重要。NDK为开发者提供了直接使用Android系统资源,并采用C或C++语言编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。实际上,NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发C或C++的动态库提供方便,并能自动将生成的动态库和Java应用程序一起打包成应用程序包文件,即.apk文件。
注意,使用原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C,C++编写,更容易产生安全漏洞,原生库的缺陷(bug)也可能更容易直接影响应用程序的安全性。

运行时

Android运行时包含核心库和Dalvik虚拟机两部分。

  • 核心库:核心库提供了Java5 se API的多数功能,并提供Android的核心API,如android.os,android.net,android.media等。
  • Dalvik虚拟机:Dalvik虚拟机是基于apache的java虚拟机,并被改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调试管理,安全和异常管理,垃圾回收等重要功能。

本质而言,Dalvik虚拟机并非传统意义上的java虚拟机(JVM)。Dalvik虚拟机不仅不按照Java虚拟机的规范来实现,而且两者不兼容。

Dalvik和标准Java虚拟机有以下主要区别:

  • Dalvik基于寄存器,而JVM基于栈。一般认为,基于寄存器的实现虽然更多依赖于具体的CPU结构,硬件通用性稍差,但其使用等长指令,在效率速度上较传统JVM更有优势。
  • Dalvik经过优化,允许在有限的内存中同时高效地运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,都拥有一个独立的Dalvik虚拟机实例。Android这种基于Linux的进程“沙箱”机制,是整个安全设计的基础之一。
  • Dalvik虚拟机从DEX(Dalvik Executable)格式的文件中读取指令与数据,进行解释运行。DEX文件由传统的,编译产生的CLASS文件,经dx工具软件处理后生成。
  • Dalvik的DEX文件还可以进一步优化,提高运行性能。通常,OEM的应用程序可以在系统编译后,直接生成优化文件(.ODEX); 第三方的应用程序则可在运行时在缓存中优化与保存,优化后的格式为DEY(.dey文件)。

这部分内容,即从android4.4开始就出现了ART(android runtime),但是这个ART并不是指这一节的主题,而是一种用来代替Dalvik的新型运行环境。当然在4.4的正式环境中用的还是Dalvik,真正开始用ART取代Dalvik是从android5.0开始的。(todo:针对这个改动,楼主会专门另开一个篇幅的文章去探究ART和Dalvik之间的区别)

另外这一节中有提到NDK,相信对于开发者而言SDK和NDK都是必要要接触和了解的东西,那么先从下图来看看sdk和ndk的关系。
sdk and ndk
很显然地,ndk可以通过native code跨过使用dalvik runtime,直接调用到android内核资源,而sdk则需要在dalvik runtime环境下才能调用到内核资源。然而两者并不是各司其职,各不相关。android提供了JNI(java native interface)使两者可以进行相互调用和通信。

应用程序框架层

应用程序框架层提供开发Android应用程序所需的一系列类库,使开发人员可以进行快速的应用程序开发,方便重用组件,也可以通过继承实现个性化的扩展。具体包括的模块如表:

应用程序框架层类库名称 功能
活动管理器(Activity Mananger) 管理各个应用程序生命周期并提供常用的导航回退功能,为所有程序的窗口提供交互的接口
窗口管理器(Window Manager) 对所有开启的窗口程序进行管理
内容提供器(Content Provider) 提供一个应用程序访问另一个应用程序数据的功能,或者实现应用程序之间的数据共享
视图系统(View System) 创建应用程序的基本组件,包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons),还有可嵌入的web浏览器。
通知管理器(Notification Manager) 使应用程序可以在状态栏中显示自定义的客户提示信息
包管理器(Package Manager) 对应用程序进行管理,提供的功能诸如安装应用程序,卸载应用程序,查询相关权限信息等。
资源管理器(Resource Manager) 提供各种非代码资源供应用程序使用,如本地化字符串,图片,音频等
位置管理器(Location Manager) 提供位置服务
电话管理器(Telephony Manager) 管理所有的移动设备功能
XMPP服务 是Google在线即时交流软件中一个通用的进程,提供后台推送服务

应用层

Android平台的应用层上包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序。例如,智能手机上实现的常见基本功能 程序,诸如SMS短信,电话拨号,图片浏览器,日历,游戏,地图,web浏览器等程序,以及开发人员开发的其他应用程序。

区别DVM与JVM

Dalvik虚拟机(DVM)存在于Android系统,JVM是Java虚拟机,两者都是虚拟机,它们之间有什么区别呢?

Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。(dx 是一套工具,可以将 Java .class 转换成 .dex 格式. 一个dex档通常会有多个.class。由于dex有时必须进行最佳化,会使档案大小增加1-4倍,以ODEX结尾。) 

Dalvik 和标准 Java 虚拟机(JVM)的首要差别

Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 JVM字节码中,局部变量会被放入局部变量表中,继而被压入堆栈供操作码进行运算,当然JVM也可以只使用堆栈而不显式地将局部变量存入变量表中。Dalvik字节码中,局部变量会被赋给65536个可用的寄存器中的任何一个,Dalvik指令直接操作这些寄存器,而不是访问堆栈中的元素。

Dalvik 和 Java 字节码的区别

VM字节码由.class文件组成,每个文件一个class。JVM在运行的时候为每一个类装载字节码。相反的,Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。Java编译器创建了JVM字节码之后,Dalvik的dx编译器删除.class文件,重新把它们编译成Dalvik字节码,然后把它们写进一个.dex文件中。这个过程包括翻译、重构、解释程序的基本元素(常量池、类定义、数据段)。常量池描述了所有的常量,包括引用、方法名、数值常量等。类定义包括了访问标志、类名等基本信息。数据段中包含各种被VM执行的函数代码以及类和函数的相关信息(例如DVM所需要的寄存器数量、局部变量表、操作数堆栈大小),还有实例变量。

Dalvik 和 Java 运行环境的区别 

Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

Dalvik虚拟机在Android2.2之后使用JIT (Just-In-Time)技术,与传统JVM的JIT并不完全相同。

Dalvik虚拟机有自己的 bytecode,并非使用 Java bytecode。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 简介 的相关文章

随机推荐

  • 4.决策树

    决策树 一 决策树概述 训练阶段 根据训练数据构造决策树模型 在测试阶段 对数据进行分类 决策树重要的三个阶段 1 特征的选择 2 决策树的生成 3 决策树剪枝 决策树内部节点表示特征或者属性 叶节点表示类别 特征的选择 根据信息增益 ID
  • totimestamp mysql_mysql多个TimeStamp设置

    timestamp设置默认值是Default CURRENT TIMESTAMP timestamp设置随着表变化而自动更新是ON UPDATE CURRENT TIMESTAMP 但是由于 一个表中至多只能有一个字段设置CURRENT T
  • 使用websocket模拟一下发送和接收消息

    好的 下面是使用 WebSocket 模拟发送和接收消息的一些指导思路 在客户端和服务端之间建立 WebSocket 连接 客户端可以使用 JavaScript 的 WebSocket 对象来建立连接 服务端可以使用支持 WebSocket
  • 图像识别小车(PCB设计)——电赛学习笔记(4)

    学习来源 B站唐老师讲电赛 PCB设计极速入门 立创EDA ALTIUM DESIGNER 10 0PCB设计极速入门 立创EDA ALTIUM DESIGNER 10 0 哔哩哔哩 bilibili 一 设计过程 使用嘉立创EDA加Alt
  • 【初探DETR】UP-DETR 复现

    项目链接 https github com dddzg up detr 论文 https arxiv org abs 2011 09094 UP DETR 遵循两个步骤 预训练和微调 展示了在 ImageNet 上预训练的模型 然后在 CO
  • MOS管的使用方法

    转载自http blog csdn net qingwufeiyang12346 article details 48385773 http user qzone qq com 2756567163 1 三个极的判定 栅极 G 中间抽头 源
  • java 分布式日志_打造分布式日志收集系统

    前言 系统一大 就会拆分成多个独立的进程 比如web wcf web api等 也就成了分布式系统 要看一个请求怎么从头到尾走的 就有些困难了 要是进行DEBUG 跟踪 就更加麻烦了 困难程度要视进程多少而定 越多越复杂 分布式日志收集系统
  • Java工作线程 主存 同步机制_Java 并发变成同步机制

    并发编程的演进 批处理 多进程 多线程 在多线程变成中 由于多个线程共享进程的变量 有可能出现同时访问一个资源的情况 因此需要使用同步机制 java的内存模型 Java内存模型规定所有的变量都存在主存当中 每个线程都有自己的工作内存 线程对
  • netty5学习笔记-内存池4-PoolArena

    前面我们讲到了内存池中的几个重要的类 1 PoolChunk 维护一段连续内存 并负责内存块分配与回收 其中比较重要的两个概念 page 可分配的最小内存块单位 chunk page的集合 2 PoolSubpage 将page分为更小的块
  • Node.js通过js_code获取微信小程序的session_key和openid

    前言 小程序自己写一个node后台服务来接收前段的code 访问微信后台获取他的session key和openid const url require url const http require http const request r
  • 【go】Unmarshal时候报错提示proto.Unmarshal: missing method ProtoReflect

    问题 使用proto Unmarshal报错 提示以下信息 cannot use promoRule variable of type db PromotionRuleSet as protoreflect ProtoMessage val
  • 【WebStorm学生认证】如何用学生邮箱进行JetBrains学生认证

    前言 用邮箱进行学生认证 为期一年 到期再次进入官网续期即可 1 进入JetB rains官网 会看到右侧有个白色小人图案 点进去登录 注册 如果没有账号 如下图所指位置 注册一个 注意 采用学生邮箱 edu 邮箱 进行注册 有账号直接登录
  • Apollo自动驾驶系统概述——传感器技术(文末参与活动赠送百度周边)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • 独家定制来了!免费帮你生成专属你的卡通头像!

    在如今的互联网时代 无论是哪个平台 都会使用到头像 你最喜欢用哪种头像 为满足大家的少男少女之心 皮卡智能最新研发了一款新的卡通头像风格 Q版卡通头像 可爱到像是定制绘画出来的 话不多说 直接上效果吧 原图 原图 原图 无论你是大叔还是萝莉
  • 放大电路中的反馈(电压串联负反馈,电流串联负反馈,电压并联负反馈,电压并联负反馈)

    放大电路中的反馈 反馈的判断 反馈的存在与否 从结构上判断 结构上存在一个通路 关系上存在一个反馈量 图a 从结构来讲不存在一个通路 图b 从结构来讲存在一个通路 从关系来讲 将Ui置零 输入反向端出现了一个R1 R1 R2 Uo这样一个信
  • 王垠——想得太多,做得太少

    我大四的时候 读到王垠从清华退学的文章 当时我虽然还没有正式开始攻读博士学位 但是也在实验室待了一年多了 老油条一根 对清华的博士生的学习生活了解得差不多了 当时读王垠的文章 我开始很不解 就剩一年 何不再坚持一下呢 后来我了解到一个人不能
  • GBase 8s 的四种运行模式

    1 离线模式 不能执行任何操作 2 在线模式 可以执行各种操作 3 单用户模式 可以执行SQL操作和命令行维护操作 只能管理员 GBASEDBT DBSA 连接 其它普通用户不能连接 4 静态模式 只能执行命令行维护操作 如备份数据库
  • 常用SQL语句-Part1

    1 向某个数据表中 增加一列 Oracle Alter Table table name Add column name colomn type Commit Sql Server Alter Table table name Add co
  • 超级实用的shell脚本100例(一)

    超级实用的shell脚本100例 一 1 编写 hello world 脚本 bin bash echo hello world 2 通过位置变量创建 Linux 系统账户及密码 bin bash 1 是执行脚本的第一个参数 2 是执行脚本
  • Android 简介

    国内移动互联网发展史 播种 2000年9月19日 中国移动和国内百家ICP首次坐在了一起 日本取经 2001年11月10日 中国移动通信的 移动梦网 正式开通 萌芽 萌芽时期 先后冒出了搜索 音乐 阅读 游戏等领域的多种无线企业 不过 整个