(最全最详)Android简述

来源:互联网 发布:javascript post 例子 编辑:程序博客网 时间:2024/05/19 17:59
Android操作系统最初由Andy Rubin创办的公司研发而来,最初主要支持手机。

2005年由Google注资收购,并于2007年11月5日正式向外界展示了这款名为Android的操作系统。

Android 体系结构

 

  Android系统的架构android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
  1.应用程序
  Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
  2.应用程序框架
  开发人员也可以完全访问核心应用程序所使 用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过 得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
  隐藏在每个应用后面的是一系列的服务和系统, 其中包括;
  * 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。
  * 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据
  * 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。
  * 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
  * 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。
  有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序.
  3.系统运行库
  1)程序库

  Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
  * 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。
  * 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
  * Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
  * LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
  * SGL - 底层的2D图形引擎
  * 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。
  * FreeType -位图(bitmap)和矢量(vector)字体显示。

  * SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
  2)Android 运行库
  Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
  每一个Android应用程序都在它自己 的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行 (.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过 SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。
  Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
  4.Linux 内核
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
(补充)


Dalvik VM 和 JVM 的比较


Android的虚拟机Dalvik介绍

Dalvik和标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器,而JVM基于栈。一直以来都有人在猜测,选择基于寄存器的方式是因为它对提前优化(ahead-of-time optimization)提供了更好的支持,而这对类似于移动电话这样的受限环境是颇有裨益的。

  Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。

  每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。


Android应用程序架构



src    java原代码存放目录
gen  自动生成目录 目录 自动生成的java代码 BuildConfig R资源目录下文件的引用
             目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你入          res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。

R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。

另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。

res 资源(Resource)目录 应用程序的资源目录 存放图片 布局 字符串

在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。

libs 支持库目录 目录存放三方的jar包 dependent

程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。

assets 资源目录 资产目录 打包进去一些外部的资源

Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp

AndroidManifest.xml 项目清单文件 文件 清单文件. 配置应用程序的信息 包名,版本 ,图标,名称

这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。

bin 编译的临时文件对应的目录
project.properties 项目环境信息,一般是不需要修改此文件 编译的版本


Android 打包应用程序并安装的过程


1.拷贝apk文件到 /data/app/xx.apk
2.写注册表 /data/system/package.xml packages.list


Eclipse对安卓测试程序启动过程

程序:
adt: android develop tools (eclipse的一个插件)
ddms : dalvik debug manager system
adb.exe android debug bridge android调试桥
aapt.exe android application package tools android程序打包工具

Ÿ Eclipse将.java源文件编译成.class

Ÿ 使用dx工具将所有.class文件转换为.dex文件

Ÿ 再将.dex文件和所有资源打包成.apk文件

Ÿ 将.apk文件安装到虚拟机完成程序安装

Ÿ 启动程序 – 开启进程 – 开启主线程

Ÿ 创建Activity对象 – 执行OnCreate()方法

Ÿ 按照main.xml文件初始化界面


工程编译步骤

步骤中提到的工具如下表:


第一步:打包资源文件,生成R.java文件
【输入】Resource文件(就是工程中res中的文 件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml 文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(Android.jar文件)
【输出】打包好的资源(一般在Android工程的bin目录可以看到一个叫resources.ap_的文件就是它了)、R.java文件(在gen目录中,大家应该很熟悉了)
【工 具】aapt工具,它的路径在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系统,按 惯例路径应该这样写:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。

第二步:处理AIDL文件,生成对应的.java文件(当然,有很多工程没有用到AIDL,那这个过程就可以省了)
【输入】源码文件、aidl文件、framework.aidl文件
【输出】对应的.java文件
【工具】aidl工具

第三步:编译Java文件,生成对应的.class文件
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【输出】.class文件
【工具】javac工具

第四步:把.class文件转化成Davik VM支持的.dex文件
【输入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)
【输出】.dex文件
【工具】javac工具

第五步:打包生成未签名的.apk文件
【输入】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件,当然很多工程都没有这样的文件,如果你不使用C/C++开发的话)
【输出】未签名的.apk文件
【工具】apkbuilder工具

第六步:对未签名.apk文件进行签名
【输入】未签名的.apk文件
【输出】签名的.apk文件
【工具】jarsigner

第七步:对签名后的.apk文件进行对齐处理(不进行对齐处理是不能发布到Google Market的)
【输入】签名后的.apk文件
【输出】对齐后的.apk文件
【工具】zipalign工具

知道了这些细节之后,我们就可以实现很多我们想实现东西了,比如:自动化,我们可以使用某种脚本,像Windows下的批处理,linux下的Bash,Java下的Ant,Python、Perl这样的脚本语言,甚至直接用Java、.net这们的强类型语言也是可以的。如果你真正弄懂了上面的步骤,了解了编译打包过程的本质,你完全可以以你想要的任何方式实现它的自动化,这才是真正的“举一反三,以不变应万变”。再比如,对Android SDK的精简,大家知道,现在Android SDK动辙几百兆,我们完全可以应用上面的知识,只保留必要的工具,把SDK精简到10M以下。当然,还可以做很多事情,前提是你真正弄懂了它。


cpu:
intel x86结构 主要运用在pc机 笔记本 k800 k880
AMD x86结构
arm 主要运用在移动平台 卖标准 绝大多数android手机处理器


屏幕:

VGA 640*480
QVGA 320*240
HVGA 480*320
WVGA 800*480
FWVGA 854*480
WSVGA 1024*600

基础概念
  Android操作系统


  Android是一个基于Linux、使用java作为程序接口的操作系统。他提供了一些工具,比如编译器、调试器、还有他自己的仿真器 (DVM — Dalvik Virtual Machine)。Android是由google领导的Open Handset Alliance开发的。

  Android使用的虚拟机比较特别。Dalvik使用了一些特别的方法。你在Android上不能运行普通的Java程序。Android提 供了一个dx的工具,可以把普通的Java类文件转换为dex(Dalvik Executable)文件。Android程序最后通过aapt(Android Asset Packaging Tool)程序来打包成一个.apk文件。Eclipse下面的ADT可以自动将class转换为dex,然后在发布的时候打包成apk文件。

  Android支持2D和3D的openGL图形库,支持SQLite数据库。

  每一个Android程序都运行在Android系统分配的一个独立的空间内,所以每个程序都不会影响和破坏到其他的程序,这是很安全的。
  一些重要的Android组件

  一个Android程序由下面这些部分组成。

Activity:代表了Android程序的展现层,比如用户看到的界面。一个Android程序会有一些个Activities,在程序运行过程中也会切换。
Views:一个Activities的用户界面是继承自android.view.View。views的布局通过android.view.ViewGroups来管理。
Services:不需要UI展现的后台任务。可以通过android的提醒框架给用户提示。
Content Provider:为程序提供数据,通过Content Provider你的程序可以与别的程序共享数据。Android的SQLite数据库可以看做一个Content Provider。
Intents:是一个异步的消息系统,可以从别的系统或服务获取数据。程序可以直接调用一个服务或者activity,也可以请求android系统。
Broadcast Receiver:接受系统消息或者隐含的intent,可以根据系统的改变做出反应。一个程序可以注册成为某些事件的Broadcast Receiver,当事件发生时,程序就执行。

android应用程序的四个核心的组件:
1.activity ui界面的展现,不适合做耗时操作
2.content provider 内容提供者 暴露自己应用私有的数据给别的应用程序
3.broadcast receiver 广播接受者.
4.service 后台服务. 长期在后台运行, 都没用户界面的一个组件.


  安全和许可

  Android对一些任务有特别的许可。例如一个程序需要使用Internet,那么就需要在他的配置文件中获取相应的许可。在安装过程中,用户可以确认这个程序是否取得相应的许可。
  AndroidManifest.xml

  每一个Android程序都通过AndroidMainfest.xml来描述。这个文件中必须声明所有的activity、 services、broadcast receiver、以及Content provider。也需要包含程序需要的许可。例如,如果程序需要访问网络,就必须声明。“AndrManifest.xml”可以认为是Android 程序的部署声明。

  package属性定义基础库。他必须是唯一的。所以比较好的处理办法就是使用你自己的域名的倒序,防止冲突。

  “android:versionName” 和”android:versionCode”用来表明你的程序的版本。versionName可以是任意的字符串用来给用户看 的,versionCode必须是整数,这是菜市场用来判断你的程序是否更新的一个标志。通常从1开始,然后发布一个新版本就+1。

  “activity”定义了这个类下面的动作。

  “uses-sdk”属性用来确定你的程序需要的SDK的最低版本,防止你的程序被安装在不被支持的SDK上。
  R.java Resources 以及Assets

  Android项目中的gen目录包含一些生成的文件。生成的“R.java”包含了项目中的res文件中的资源文件。这些资源部署在res文件夹的可以是菜单、布局图标、图片、动画等等。例如,一个资源文件可以是一个图片或者一些包含了某些字符串的XML文件。

  如果你创建了一个新的资源,那么他就自动创建在R.java中。他的引用是一个整型值,Android系统有一些方法可以访问到这个资源。比如 可以通过getString(R.string.yourString)来访问你的字符资源的引用,但是最好不要去改动R.java。

  assets中可以存放任何类型的数据,在java中你可以通过AssetsManager以及getAssets()方法来访问。
  动作(activities)和布局(layout)

  动作的用户界面通过布局来确定。layout是android.view.ViewGroups的一个实例。layout定义了UI元素,他们的属性以及摆放位置。UI元素基于android.view.View。

  布局可以通过java代码或者xml文件来定义。在你不知道内容的时候可以使用java代码布局,比如你的内容是从网上获取到的数据。

  基于XML的布局定义在/res/layout中。这些文件描述了视图组、视图、以及他们的关系和具体的属性。如果一个UI元素需要通过java代码访问,那么你就需要通过android.id来赋予这个元素一个唯一的id。

  通过XML定义布局是比较推荐的一种方式,可以将视图和程序的逻辑分离,比较好管理一些。
  动作(activities)和生命周期(lifecycle)

  操作系统控制着程序的生命周期。操作系统可以在任何时候中断程序,比如有来电了。Android对于动作有一些预先定义的关于生命周期的方法,

比较重要的是:
onSaveInstanceState():如果动作停止就会调用。用来存储数据,好让重新启动的时候恢复到原来的状态。
onPause():在动作结束的时候触发,用来释放资源和存储数据。
onResume():在动作重启的时候触发,用来初始化程序

  上下文

  android.context.Context类提供了与系统通信的方法。他是程序的全局信息的一个接口。Contexts提供了getSystemService方法可以用来接收不同硬件的消息。作为动作和服务,你可以直接通过this来访问。


MVC模型

Android 中MVC 的具体体现:
视图层(view):一般采用xml文件进行界面的描述,也可以使用javascript+html等的方式作为view层,当然需要进行java和javascript之间的通信。
模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的;
控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写业务代码,要通过activity交给model层做业务逻辑的处理, android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。

Android 的官方建议应用程序的开发采用MVC 模式。何谓MVC?先看看下图
MVC 是Model,View,Controller 的缩写,从上图可以看出MVC 包含三个部分:
.. 模型(Model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
.. 视图(View)对象:是应用程序中负责生成用户界面的部分。也是在整个MVC 架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
.. 控制器(Control)对象:是根据用户的输入,控制用户界面数据显示及更新Model 对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给M 层处理。

Android 鼓励弱耦合和组件的重用,在Android 中MVC 的具体体现如下
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较多的话,就一定可 以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
   2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在 acitivity中写代码,要通过activity交给model层做业务逻辑的处理, 这样做的另外一个原因是android中的acitivity 的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
  3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。



转载请注明:http://my.csdn.net/my/mycsdn






3 0
原创粉丝点击