Android 简介

国内移动互联网发展史

播种 :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用于显示位图和矢量字体
WebKitWeb浏览器的软件引擎
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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值