.Net程序员玩转Android系列之二~Android Framework概要(1)
从windows操作系统说起
人们总是喜欢从将陌生的事物和自己所了解的东西关联起来,以加深对未知事物的了解,这一讲我们从windows操作系统说起,逐步引领带大家走入android的世界。写任何程序都需要知道程序运行的原理和环境,就比如开发winform程序,你至少需要知道操作系统的原理,CLR运行时,了解一些常用的C/C++库。诚然,你不需要全部了解得很清楚也能写出很不错的应用程序,但是你了解的越清楚,钻研得越透彻,那么你越能开发出适合于你所在平台的、更优化的应用程序。譬如在windows操作系统上,你的程序是这样运行的:

那么android之上你的程序是如何运行的呢?一图胜千言:

为了不让朋友们一进来就看得昏头昏脑的,这张图我简化了很多,简单介绍下:
Linux kernel:管理你手机硬件的驱动程序,包含相机驱动、蓝牙驱动、wifi驱动等等,提供给上层调用。你没看错,android用的就是精巧成熟的Linux内核。
C/C++ libraries:C/C++的库,包含webkit,openGL(喜欢玩游戏的朋友这里看),最重要的是包含一个sqllite,你没看错,喜欢尝鲜的.Net朋友都玩过的最流行的嵌入式数据库,在你手机里面躺着呢。你的联系人啊,短信什么的,都存在这个里面的。 (对妹子联系人啊短信啊有什么想法不好,嗯,要相互信任。)
Android运行时:这里最重要的是dalvik虚拟机。我们知道java应用程序运行在jvm虚拟机上(相当于CLR运行时),显然手机的功耗和PC不能比,所以google对jvm做了大量优化,于是便诞生了dalvik虚拟机,原来的Java应用程序的运行方式为:xx.java->xx.class->jvm执行,现在的Java应用程序执行方式为:xx.java->xx.class->xx.dex->dalvik执行。这一点大家心里有数就行,我们虽然是速成android,但也是保质保量的:)
Android framework:android提供的一系列java系统服务,供应用程序调用以实现功能。
从你的手机开机-讲解android的启动过程
直接上图:

简单说明如下:
一 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中的剩余三大核心概念。
最近准备系统架构师设计师考试,也比较忙。下一篇博客什么时候出来,看推荐数了 : )
.Net程序员玩转Android系列之二~Android Framework概要(1)的更多相关文章
- [Linux] PHP程序员玩转Linux系列-lnmp环境的搭建
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 在平常的工作中,我作为PHP程序员经常要搭建一下环境,这个环境就是Linux系统下安装nginx,php,mysql这三个软件,对软件进行 ...
- [Linux] PHP程序员玩转Linux系列-搭建代码开发环境
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 有些同学可能觉得我写的都是啥yum安装的,随便配置一下而已,没啥技术含量,我的目的 ...
- [Linux] PHP程序员玩转Linux系列-备份还原MySQL
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 前几天有个新闻,说是g ...
- [Linux] PHP程序员玩转Linux系列-自动备份与SVN
我的代码经常在开发修改,为了代码的安全性,比如哪天误删了文件,或者哪天改错东西了,可以恢复回来,我要搞代码备份.备份代码,我先做最简单的,使用linux的定时机制加shell命令打包文件,每天按日期保 ...
- [Linux] PHP程序员玩转Linux系列-nginx初学者引导
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-Nginx中的HTTPS
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
- [Linux] PHP程序员玩转Linux系列-升级PHP到PHP7
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...
随机推荐
- git .gitignore忽略规则不生效解决办法
忽略规则不生效, 原因是.gitignore只能忽略那些原来没有被track的文件, 如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 那么解决方法就是先把本地缓存删除(改变成 ...
- Django-03视图层
5.1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片 ...
- BAT机器学习面试1000题系列(41-45题)
41.线性分类器与非线性分类器的区别以及优劣 如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是.常见的线性分类器有:LR,贝叶斯分类,单层感知机.线性回归常见的非线性分类器: ...
- spring的包大概作用(备忘)
1.spring.jar 是包含有完整发布模块的单个jar 包. 2. org.springframework.aop 包含在应用中使用Spring的AOP特性时所需的类. 3. org.spring ...
- Struts2框架里面action与前端jsp页面进行交互路径问题---》一个对话框里面有很多超链接,进行相应的跳转
一个对话框里面有很多超链接,右边是点击超链接跳转到的相应页面(在一个页面上就相当于点击该超链接时候,就把该简短页面置顶):这个问题困扰我两天:还请大神给我解决,也没有解决,我仔细对比了相关路径,后面添 ...
- 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
01 什么是禁忌搜索算法? 1.1 先从爬山算法说起 爬山算法从当前的节点开始,和周围的邻居节点的值进行比较. 如果当前节点是最大的,那么返回当前节点,作为最大值 (既山峰最高点):反之就用最高的邻居 ...
- ubuntu下面的某些软件安装
1. python 下面的mysql驱动:不是在pip里面安装,执行下面命令 apt-get install python-mysqldb
- Touchmove获取当前触摸的Dom节点
原文链接:https://www.jianshu.com/p/a2a41fe20790 Touchmove获取当前触摸的Dom节点 近期为自己的app增加一个通讯录首字母导航的功能,如下图蓝色框部分, ...
- 用API爬取天气预报数据
1.注册免费API和阅读技术文档: 注册地址:https://console.heweather.com 文档地址:https://www.heweather.com/documents/api-ur ...
- Linux基本结构
Linux 的基本目录结构: 基本介绍: Linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后再次目录下载创建其他的目录. 经典的一句话:linu ...