人们老是喜欢从将陌生的事物和本身所了解的东西关联起来,以加深对未知事物的了解,这一讲咱们从windows操做系统提及,逐步引领带你们走入android的世界。写任何程序都须要知道程序运行的原理和环境,就好比开发winform程序,你至少须要知道操做系统的原理,CLR运行时,了解一些经常使用的C/C++库。诚然,你不须要所有了解得很清楚也能写出很不错的应用程序,可是你了解的越清楚,钻研得越透彻,那么你越能开发出适合于你所在平台的、更优化的应用程序。譬如在windows操做系统上,你的程序是这样运行的:java
那么android之上你的程序是如何运行的呢?一图胜千言:linux
为了避免让朋友们一进来就看得昏头昏脑的,这张图我简化了不少,简单介绍下:android
Linux kernel:管理你手机硬件的驱动程序,包含相机驱动、蓝牙驱动、wifi驱动等等,提供给上层调用。你没看错,android用的就是精巧成熟的Linux内核。程序员
C/C++ libraries:C/C++的库,包含webkit,openGL(喜欢玩游戏的朋友这里看),最重要的是包含一个sqllite,你没看错,喜欢尝鲜的.Net朋友都玩过的最流行的嵌入式数据库,在你手机里面躺着呢。你的联系人啊,短信什么的,都存在这个里面的。 (对妹子联系人啊短信啊有什么想法很差,嗯,要相互信任。)web
Android运行时:这里最重要的是dalvik虚拟机。咱们知道java应用程序运行在jvm虚拟机上(至关于CLR运行时),显然手机的功耗和PC不能比,因此google对jvm作了大量优化,因而便诞生了dalvik虚拟机,原来的Java应用程序的运行方式为:xx.java->xx.class->jvm执行,如今的Java应用程序执行方式为:xx.java->xx.class->xx.dex->dalvik执行。这一点你们内心有数就行,咱们虽然是速成android,但也是保质保量的:)sql
Android framework:android提供的一系列java系统服务,供应用程序调用以实现功能。数据库
直接上图:windows
简单说明以下:架构
一 android启动时会首先加载linux kerner,而后启动Init进程,这点和linux系统一致。框架
二 Init进程对各类设备初始化,分别介绍以下:
1 Zygote:每当java应用程序运行时,zygote便会派生出一个子进程来执行java应用程序,该子进程即是用来执行java应用程序的虚拟机。
2 System Server :android系统的一个核心进程,由Zygote进程派生,它创建了android的大部分java服务,譬如地理位置信息服务等。
3 Media Server:运行基于C/C++的本地系统服务,好比相机等。
4 Content manager:这就是一个适配器模式的实现,不论是本地C/C++服务仍是系统java服务,都得来这里报道,最后统一给java应用程序提供API调用。
5 Daemons:链接管理服务。包含USB链接管理,无线通讯链接管理,最重要的是ADB(android debugger birdge)链接管理,可让你手机里运行的异常信息,显示在你的eclipse里面。这点咱们后面会用到。
这张图引出了Android最重要的四大核心概念之一:服务。即Android的大部分功能都是以服务的形式存在的,不论是你是进程间通信的IPC,仍是远程过程调用RPC,在android中都是调用一系列的服务,这是否是有点像SOA的架构体系呢。软件设计的最终目地,都是为了易于维护,易于拓展,方便复用等等。而解耦是其中很关键的一步。看来不论是.Net仍是android,软件的思想是通用的。您说呢?
这里再简单的介绍下JNI和NDK,从上面的讲解中咱们知道,android的本地库虽然是以服务的形式注册在Context Manager中,可是若是现有的注册的服务没法知足功能、恰恰您又知道它的本地库有这么个功能,该怎么办呢?咱们在.Net BCL中API,其实也有部分调用的是操做系统底层C/C++写的库,这种状况下,咱们能够理解为这些C/C++写的库在.Net中“注册”了,打引号的缘由相信大家懂的,那没注册的C/C++功能咱们就不能用么?固然能,咱们有P/Invoke,那么java呢,固然也能,有JNI(java native interface),固然,人家除了能够在Java中调用C/C++库的功能,还能够在C/C++中调用java类的功能,真是亮瞎了个人双眼,有人问怎么调用?Java的执行不是要虚拟机么?嗯,人家提供虚拟机的接口给你,是你能够在C/C++的内存区中,装载虚拟机,并调用指定Java类的方法... ...
考虑到JNI的编写很麻烦,为了方便JNI的程序编写,提升开发效率,google提供了NDK套件,方便java和C/C++程序的互相调用,这样Java和C/C++程序就能够互通有无了。如今高端的android程序员,基本上都会和这些东西打交道。
不得不说,人家google确实是有境界的,这些里面工做的人,才能真正叫程序员吧。
这一讲咱们简单的了解android framework的框架,虽然我们是速成型,可是勿在浮沙筑高台的思想一直是个人座右铭,宁肯不熟悉语法,不熟悉API,不熟悉程序编写,可是底层原理愣是要搞清楚的,这就是成长为高端程序员的必经之路。
下一讲咱们将完成Android环境搭建和Hello world,同时逐步引入Android中的剩余三大核心概念。
最近准备系统架构师设计师考试,也比较忙。下一篇博客何时出来,看推荐数了 : )