《Android程序设计》一3.6 Android应用的运行时环境

3.6 Android应用的运行时环境

Android独特的应用组件架构在某种程度上是Android多处理并发的产物。为了使该环境能够适应多个供应商的多种应用,信任每个供应商只需要很少的工作,Android执行Dalvik VM的多个实例,每个任务执行一个实例。在3.7节及后续的章节中,我们将探讨组件生命周期如何促进Android提高应用堆内的垃圾收集工作,以及如何促进多个堆之间的内存回收策略。
由于这种简单而又可靠的多处理方式,Android必须高效地把内存划分成多个堆。每个堆相对较小,这样内存可以支持多个应用同时运行。在每个堆中,由于有了组件生命周期而使得不使用的组件,尤其是当前不活跃的用户界面组件,在堆的空间紧张时能够执行垃圾回收,而在需要时能够重新获取。因此,由这种方式又引入了以数据库为中心的数据模型,其中大部分数据都是内在持久的,关于这一点本书后面将会更加详细地讨论,尤其是第11章。

3.6.1 Dalvik虚拟机

Android的多路处理利用了虚拟机的多进程和多实例,需要虚拟机的每个实例都能有效利用空间。这是通过组件生命周期来完成的,它使得对象某种程度上能够通过虚拟机本身执行垃圾回收和重新创建。Android通过Dalvik虚拟机运行特地为Android开发的字节码系统,该字节码系统名为dex。dex字节码的空间效率几乎是Java字节码的两倍,对于每个进程,从根本上看,在内存消耗上仅为Java类的一半。Android系统还使用写时复制(copy-on-write)的内存管理方式来实现同一个Dalvik可执行文件的多个实例之间的堆内存的共享。

3.6.2 Zygote:派生新的进程

当每个新的进程启动虚拟机的一个新的实例时,如果每次都加载所有必要的基类,则效率会很低。由于Android把每个应用放在独立的进程中,它会利用底层Linux操作系统的fork操作,通过模板进程生成新的进程,该进程在启动新的虚拟机实例时能够达到最优状态。该模板进程的名字就是Zygote。Zygote模板进程是Dalvik虚拟机的一个实例,它包含一组预加载类及Zygote进程的其他状态,这些进程通过fork操作生成Zygote的
副本。

3.6.3 沙盒:进程和用户

Android的安全在很大程度上依赖于Linux操作系统层的安全机制,尤其对于进程和用户级别的边界限制。由于Android面向的是个人设备,即个人持有和使用的设备,Android巧妙地利用了Linux内在的多用户支持特性:为每个应用供应商创建一个单独的用户。这意味着每个应用以不同的用户权限运行(除了那些来自同一个供应商的)。在默认情况下,一个应用所拥有的文件,其他应用是无法访问的。
这就类似于在Windows系统上,你以自己的用户名运行Word程序,而以同事的用户名运行Web浏览器。无论要切换查看Word还是Web浏览器,都需要首先退出,然后切换用户才能查看,而无法同时查看。Android允许一个登录的手机用户查看以不同的Linux级别用户运行的多个应用。
这种方式带来的直接影响是由于每个应用在自己的“独立运行空间(silo)”中执行,因而安全性得到了提高。
桌面操作系统通常不会如此全面地考虑应用的沙盒特征——一旦安装了某个应用,用户的所有数据都会信任该应用。Android设计师们设想的是来自众多供应商的很多小的应用,这些供应商并非都是完全可信的。因此,一个应用无法直接访问其他应用的数据。

时间: 2024-09-14 11:26:36

《Android程序设计》一3.6 Android应用的运行时环境的相关文章

使用 ARChon 运行时环境在 Ubuntu 上运行 Android 应用

在此之前,我们尝试过在多款安卓应用模拟器工具上运行安卓应用,比如Genymotion.VirtualBox和Android SDK等.但是,有了这套全新的Chrome安卓运行环境,就可以在Chrome浏览器中运行安卓应用了.所以,下面是一些步骤来指导你如何使用ARChon运行时环境在Ubuntu上安装安卓应用. 谷歌已经公布了首批支持原生运行在Chrome OS的安卓应用,而这个全新的"安卓运行时环境"扩展程序使其成为可能.如今,一位名为Vlad Filippov的开发者已经找到了一种

《Android程序设计》一1.3 SDK的组件

1.3 SDK的组件 Android SDK的主体是通用组件,辅以一些专用组件.在很多情况下,配置.插件和扩展是这些组件在Android中的实现形式.Android SDK的开发是一个对现代化和完整的SDK进行高效开发的研究.Google为了能够快速地把Android推向市场采用了这种方式.在探索Android SDK的过程中,你会感受到这一点.Eclipse.Java语言.QEMU及其他已有的平台.工具和技术一起组成了Android SDK最重要的组成部分. 在创建简单的应用来确认SDK安装的

《Android程序设计》一2.3 作用域

2.3 作用域 作用域决定了程序中的变量.方法和其他符号的可见范围.任何符号在其作用域外都是完全不可见的,不能被使用.在这一节我们将简要地介绍作用域的主要内容,从最高层开始. 2.3.1 Java包 Java包提供了一种机制,它把相关类型分组到一个全局唯一的命名空间.这种分组机制可以防止在一个包的命名空间内的标识符和其他开发人员在其他命名空间内创建和使用的标识符冲突.一个典型的Java程序由很多Java包的代码组成.典型的Java运行时环境提供了如java.lang和java.util这样的包.

《Android程序设计》一3.2 活动、意图和任务

3.2 活动.意图和任务 Android活动既是用户交互单元(通常填满Android移动设备的整个屏幕)也是执行单元.开发交互式的Android程序时,首先要继承Activity类.活动提供了在Android应用中可重用.可交换的UI组件流.那么,一个活动如何调用另一个活动,如何将信息传递给第二个活动呢?不同活动之间的基本通信单元是Intent类.Intent类是一个抽象的功能描述,用来定义一个活动要求另一个活动执行的功能,类似于是第二个活动提供的功能的一张照片.Intent类是构建松散耦合的系

二维码-Android 导入library 运行时提示NotFoundClass

问题描述 Android 导入library 运行时提示NotFoundClass 用eclipseADT 写一个简单的APP,其中包括二维码扫码 需要用到 ImageIO 等外部类,于是导入了JRE1.6 library ,一切正常 也可以正常import javax.imageio.ImageIO;等 然而真机运行时却一直提示ClassNotFoundException 上网查过一番之后,楼主在build path 里的Order and Export勾选上了该library,但问题依旧--

我的Android进阶之旅------>Android实现数据存储技术

本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种: 使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置

[置顶] 我的Android进阶之旅------>Android解决异常: startRecording() called on an uninitialized AudioRecord.

今天使用AudioRecord进行录音操作时候,报了下面的异常. E/AndroidRuntime(22775): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord. E/ ( 357): Request requires android.permission.RECORD_AUDIO E/AudioFlinger( 357): openRecord() permiss

详解Android权限管理之Android 6.0运行时权限及解决办法_Android

前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以上设备越来越多了,所以Android 6.0 权限适配是必不可少的工作,这里主要介绍一下我们公司是如何做Android 6.0权限适配的. Android 6.0以下非运行时权限: 根据上面博客我们很清楚的知道,Android的权限其实就是为了程序之间更加的安全的访问,所以权限有等级之分,比如:No

详解Android权限管理之Android 6.0运行时权限及解决办法

前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以上设备越来越多了,所以Android 6.0 权限适配是必不可少的工作,这里主要介绍一下我们公司是如何做Android 6.0权限适配的. Android 6.0以下非运行时权限: 根据上面博客我们很清楚的知道,Android的权限其实就是为了程序之间更加的安全的访问,所以权限有等级之分,比如:No