Android系统框架

转自:网络

Android系统是基于Linux和Java技术,它在底层采用Linux内核和本地库,在上层提供Java支持框架和开发接口。它借助于 Linux强大的稳定性、开放性和可移植性,Java语言开发的广泛性、简单性和可移植性,一经推出就受动广泛关注和欢迎,在嵌入式开发中产生比较深远的 影响。

图1.1 Android系统架构

考虑到性能的问题,Google没有采用Sun的基于堆栈的虚拟机,而是开发了一个基于寄存器的Android虚拟机 -Dalvik虚拟机。当然Android系统提供了一个工具用来把Java虚拟机格式转换为Daleik虚拟机格式。不过Android仅支持有限的 Java运行库,因此不是所有的Java程序都可以在Android里直接编译运行。

当然任何一个系统都有其固有个缺点,而且它就隐藏在它的优点之中,Android也不例外。首先Android系统的开放性导致任何厂家都可以修改 定制而推出自己的Android系统,这就导致了尽管设备运行的系统都是Android,但运行的程序就或多或少不兼容,这对第三方程序开发员人来说不是 个好消息,标准的不统一势必会影响的Android程序的开发使用。其次,尽管Android系统是基于Linux和Java的,但由于它开发了一套独立 的UI系统,它完全不兼容现有的Linux和Java应用程序,这不仅是浪费了现有的开发资源,而且是极大的浪费了未来的开发资源。不管Android社 区有多大,比起Linux开源社区来说,它也是大海中的一点水,这是否会给对手以机会呢?如Intel的Moblin系统、Nokia的Maemo系统以 及Ubuntu的上网本系统,还有最新的由Intel和Nokia联合开发的MeeGO系统。

回到Android系统本身,如图1.1,它主要包括五个部分,分别是Linux 内核(红色部分)、本地库(绿色部分)、Dalvik 虚拟机(黄色部分)、应用程序框架和应用程序(蓝色部分)。

  • Android Linux内核

最初的Android内核是基于2.6.25的,但由于采用的同样的版本管理系 统,Android内核紧跟Linux内核的进度,目前最新的开发版本是2.6.31,但版本其实已经不重要了,你只要记住Android内核基本上同步 于Linux内核就可以了,在此基础上Android对Linux内核做了些修改和功能添加使之Android化,如著名的Binder、匿名共享内存 (ashmem)等。

目前在Android的源代码仓库中有4个关于Linux的项目,他们分别是:

  • kernel/common.git:Common Android Kernel Tree
  • kernel/experimental.git :Experimental Kernel Projects
  • kernel/msm.git :Kernel Tree for MSM7XXX family on Android
  • kernel/omap.git :Kernel Tree for OMAP family on Android
  • 本地库

说到本地库,首先我们想到的一定是libc库。是的,Android也不例外,他支持c 库,但不是glibc或其他常见的小型仓库,比如uclibc,而是一个额称为Bionic的C库。尽管它不是很强大,但足够用了。按照Google的说 法,选择Bionic的原因是因为:

  • 尽量移除GPL License的模块
  • 更小的代码密度和更快的运行速度

但Bionic C库也有它的局限性:首先,不完全支持posix标准;其次,不支持libm和libthread_db;第三,不能使用标准的Toolchain来编译 Android本地应用。Android的编译链也是依赖于Bionic库的,它的动态链接库加载使用的是linker,而不是ld.so。它的 prelink使用的是apriori(build/tools/apriori),strip 工具使用的是soslim(build/tools/soslim)而不是strip。

Android的本地库基本上位于源代码树的external和system目录下。

  • Dalvik虚拟机

Dalvik是Google Android平台最重要的一个部分,是Google专门为Android开发的Java虚拟机,被称为Dalvik虚拟机。按照Google的说 法,Dalvik具有高效、简洁、节省资源的特点,非常适合资源有限的嵌入式系统。

Dalvik是按照Apache License v2方式发布的,Google尽量把GPL Licnse的软件移除Android系统。这就避免了非免费的Java ME版权问题,也移除了GPLv2的Java SE。

以前也有些公司搞过Linux/Java平台,即底层支持Linux系统、上层采用Java技术,但都因为效率的问题而放弃。Google的Dalvik虚拟机很好的解决了这个问题,同其他的Java虚拟机相比,Dalvik虚拟机有如下特点:

  • Dalvik虚拟机采用了基于寄存器的虚拟机技术。与Java虚拟机不同,Dalvik采用了基于寄存器(register based)的技术,而不是基于堆栈(stack based)的技术。我们不去争论基于寄存器的虚拟机是不是更好,如果有兴趣,你可以去比较他们的性能差异。
  • Dalvik虚拟机使用自定义的字节码格式(称为DEX文件,.dex),不兼容现有Java字节码格式。Android里的dx工具负责把Java字节码转换成Dalvik字节码。
  • Dalvik虚拟机运行效率高,同事代码密度小,节省资源。
  • Dalvik虚拟机常量池只使用32位的索引。
  • Dalvik虚拟机不支持JIT编译技术(Just In Time Compiler)。

对于Android应用程序开发者来说,我们必须清楚如何在Android Dalvik虚拟机上使用内存,下面是内存使用上的一些限制:

  • Dalvik默认的栈大小是12K(3个页,每个页4K)。
  • Dalvik堆(heap)默认启动大小:2M,默认最大值16M。
  • Dalvik堆(heap)支持的最小启动大小:1M,支持的最大值1024M。
  • Dalvik的堆和栈参数可以通过–Xms 和–Xmx更改。

对于Android的Java应用程序来说,每一个应用对对应于一个独立的Dalvik虚 拟机实例进程,当然每个Android Java应用程序的线程也对应于一个Linux线程。这相当于每个Android Dalvik应用程序都运行在自己的沙盒里面从而保证Dalvik应用程序的安全性。当然Android系统也充分利用了这个特性,每个Android Dalvik应用程序都被赋予了一个独立的Linux PID(app_*)。

  • 应用程序框架

Android应用程序框架完全使用Java语言编写,运行在Android Dalvik虚拟机之上,它通过Java JNI接口调用本地库的接口。

Android应用程序框架向下封装了系统的各种系统服务及硬件的访问接口,向上提供统一的应用程序开发接口,即Android API。Android应用程序通过调用Android应用程序框架接口来实现各种功能。

Android应用程序框架封装了大部分的系统服务功能,它们包括:

  • Activity Manager
  • Windows Manager
  • Content Provider
  • View System
  • Resource Manager
  • Notification Manager
  • Packet Manager
  • Telephony Manager
  • Location Manager

对于Android开发者来说,Android应用程序框架是最重要的一部分,只有真正理解了这个框架说包含的内容,才能写出高效的Android应用程序。

  • 应用程序

Android是一个功能完全的移动设备操作系统,它自带了核心应用程序,这样你就不需要额外的开发而直接在你的设备上使用Android系统了,这些应用程序开起来中规中矩,如果你想要一个更加绚丽的操作界面,你可以修改他们来实现自己的应用程序。

很明显,Android应用程序都是用Java语言开发的,它依赖于Android应用框架(framework.jar),同时运行在Android Dalvik虚拟机之上。

原文地址:https://www.cnblogs.com/youngerchina/p/5624556.html