andorid整体概念浅析

1、Android各个版本以及市场份额

 

android系统是由Andy Rubin创建的,后来被Google收购了;最早的版本是:Android 1.1版本 而现在最新的版本是今年5.28,Google I/O大会上推出的Android M,有趣的是Android系统的命名都是以点心来命名的,下述表是15个Android版本名称,对应API号以及发布时间!

系统版本名称API版本号发布时间
Android 1.5:Cupcake:纸杯蛋糕 3 2009.4.30
Android 1.6:Donut:甜甜圈 4 2009.9.15
Android 2.0/2.0.1/2.1:Eclair:松饼 5/6/7 2009.10.26
Android 2.2/2.2.1:Froyo:冻酸奶 8 2010.5.20
Android 2.3:Gingerbread:姜饼 9 2010.12.7
Android 3.0:Honeycomb:蜂巢 11 2011.2.2
Android 3.1:Honeycomb:蜂巢 12 2011.5.11
Android 3.2:Honeycomb:蜂巢 13 2011.7.13
Android 4.0:Ice Cream Sandwich:冰激凌三文治 14 2011.10.19
Android 4.1:Jelly Bean:果冻豆 16 2012.6.28
Android 4.2:Jelly Bean:果冻豆 17 2012.10.30
Android 4.3:Jelly Bean:果冻豆 18 2013.7.25
Android 4.4:KitKat:奇巧巧克力 19 2013.11.01
Android 5.0:Lollipop:棒棒糖 21 2014.10.16
Android M:预览版 22 2015.5.28

好了,除了上面这些公共版本外,当然还有一些其他的版本,截止2015.1,各个版本的市场份额如下:


Android系统份额分布图(截止2015年1月)

 

2、android碎片化

 

碎片化实际上是指的差异越来越多,要实现兼容会增加隐形的成本

1、屏幕的分辨率

2android的版本差异,已经客制化的rom的差异

 ①系统碎片化:我们开发App时可能需要做到低版本兼容,比如,最低兼容至2.3版本;由于各种Rom定制的盛行,国人都喜欢对原生系统做一些更改,这导致了在原生系统上可行,而在定制Rom上不可行的问题,比如相机调用~

②屏幕碎片化:市面上各种各样屏幕尺寸的手机,4.3寸,4.5寸,4.7寸,5.0寸,5.3...等等,除了手机外,还有Android平板,所以开发时我们可能要处理这个屏幕适配的问题

使用android studio开发的时候能够选择兼容最低的android版本:Mininum SDK选择对应的android版本

 

3、android系统特性

 

dalvik虚拟机是基于寄存器的,Java虚拟机是基于字节码的,两种是不同的

SQLite,是一款轻型的数据库

webkit引擎,浏览器都是基于搜索引擎进行开发的

 

4、android软件层叠框架

这个基本上在任何一本讲解android框架的书上都会提到

Android平台架构图

 

  1. Application(应用程序层) 我们一般说的应用层的开发就是在这个层次上进行的,当然包括了系统内置的一组应用程序,使用的是Java语言,基本上所有的都被API所封装起来了。
  2. Application Framework(应用程序框架层) 无论系统内置或者我们自己编写的App,都需要使用到这层,比如我们想弄来电黑名单,自动挂断电话,我们就需要用到电话管理(TelephonyManager) 通过该层我们就可以很轻松的实现挂断操作,而不需要关心底层实现,这一块主要是通过java语言写成的,是应用apk世界的基石。
  3. Libraries(库) +Android Runtime(Android运行时) Android给我们提供了一组C/C++库,为平台的不同组件所使用,比如媒体框架;而Android Runtime则由Android核心库集 + Dalvik虚拟机构成,Dalvik虚拟机是针对移动设备的虚拟机,它的特点:不需要很快的CPU计算速度和大量的内存空间;而每个App都单独地运行在单独的Dalvik虚拟机内每个app对于一条Dalvik进程)而他的简单运行流程如: Dalvik的运行流程该层主要是由C/C++编写的,所以可以视为native层,也就是我们经常在网上看到的那个本地层。这个native是极力被google隐藏起来的世界。
  4. Linux内核 这里就是涉及底层驱动的东西了,一些系统服务,比如安全性,内存管理以及进程管理等

Android Runtime实际上在之前的那个NativeWindowManager里面获取JNIEnv指针就是调用AndroidRuntime::getJNIEnv();函数来获取的

在《深入理解android卷I》中看到了针对这样的软件层叠结构划分了几个世界。

Android系统的最大特点之一:

搭建了一个被广大Java开发者热捧的Java世界。但这个世界不是空中楼阁,它的运转依赖与另一个被Google极力隐藏的Native世界。这两个世界的交互关系可用下图表示:

存疑:
1、JNI可以直接和OS进行系统调用吗?这个是不是类似手势、皮套等之类的功能呢?
2、JNI和native世界之间是通过进程间的通讯来实现的吗?虽然之前我只看到了键值的上报这块,但是他们之前是通过传递参数来实现的啊!我并没有看到binder或者所谓的socket来实现进程之间的通信啊?
 

从上图可知:

1. Java虽具有与平台无关的特性,但Java和具体平台之间的隔离却是由JNI层来实现的。Java是通过JNI层调用Linux OS中的系统调用来完成对应的功能的。

2. 除了Java世界外,还有一个核心的Native世界,它为整个系统高效和平稳地运行提供了强有力的支持。一般而言,Java世界经由JNI层通过IPC方式与Native世界交互,而Android平台上最为神秘的IPC方法就是Binder了。

posted on 2017-08-01 11:40  feifeiyuan  阅读(385)  评论(0编辑  收藏  举报