Security Sandbox 安全沙盒

Android操作系统是基于多用户的iinux系统上的,从他的系统架构图就中可以看得很明显:

Android System Architecture

所以很多地方Android都直接利用了linux的特性。

  • Android里面每个应用都被当作linux系统中的一个用户,被赋予一个唯一的user ID。这个user ID只有操作系统知道,应用自己是不知道的(当然通过root之后没有什么不可能)。这样应用的文件也就很简单的可以通过user permission来设定。
  • 每个应用都运行在独立的进程里,这样的好处是Android系统对应用的管理可以简化到对进程的管理,如挂起恢复等都可以直接用进程的特性。而内存管理也变得简单,因为不同的应用就是不同的进程,不会相互影响。
  • 另外,每个京城都有着自己独立的虚拟机dvm,也就意味着应用都是运行在独立的虚拟机里的,虚拟机相当于沙盒,互相之间的影响非常小。

当然应用之间不可能完全没有交流,Android提供了如下几种方式:

  • 两个应用如果是同一个组织个人开发,并且有着同样的签名,那么他们可以要求系统赋予他们一样的user ID,这样他们可以互相访问文件;而android在设计时为了节省系统资源,则认为既然你们都已经有一样的user ID,那么也在也没有必要把这两个应用区分到不同的进程和虚拟机中,所以有着一样的user id的应用会共享一样的linux process和虚拟机。
  • 应用可以访问储存在各种设备上的数据,比如联系人,短信或者sd卡等。这些权限必须在安装时分配user ID的时候就给予之后是不能更改的,而一个应用需要哪些权限,需要通过manifest.xml来声明。
  • 还有一种更通用的方法就是通过系统提供的广播机制,后面会提到的广播,相当于一个系统级的Message Bus。可以通过subscribe和send消息(Intent)来向其他应用程序发布消息。

Application Components 程序组件

在Android系统中一个应用主要是由下面四种组件构成的:

  1. Activity: Activity代表了一个单独的screen,是能够响应外界事件的一个最小单位(还不是很清楚activity里面的view的结构,但是感觉很多软件都滥用了Activity,导致在Activities之间切换时每个Activity都需要消耗时间做初始化)。从文档历来看,Activity不应该是UI上的结构,而应该是一个程序逻辑上的结构,程序的Entry point,意味着外部可以不通过应用的其他部分直接访问到这个界面。而如果一个Activity是“私有的”,即不为外界所知也不响应外部消息的,那么应该整合进另一个Activity。
  2. Service: Service是一个后台服务,多用来执行一些长期运行的操作或者需要在另一个进程里执行的操作以避免当前应用进程阻塞。而Service是没有用户界面的。
  3. Content Provider:Content Provider提供了一组可以共享的数据,其他的应用程序可以访问甚至修改。而后面数据可以储存在文件系统,SQLLite数据库或者网络上。同样也Content Provider也可以被设置为私有。
  4. Broadcast Receiver:前面讲到了广播,而Broadcast receiver就是应用响应广播时间的组建,许多广播使用系统发出的,比如:锁频,电池没电等。而应用也可以发布广播,这样应用就可以通过广播相互交流。

Intent消息

在Android系统设计中,任何一个应用都可以启动其他应用的组件,可以是activity,也可以是service, broadcast receiver。在android中,应用的entry point并不是唯一的。样程序之间的整合能做的很好,但是现在这样看到的非常少,因为除了基础的功能,很多大家都愿意自己做一套新的而不是利用现有的。

每个应用都是不一样的,而且你也不知道这些应用是否已经安装,因此直接在代码中调用其他的应用是不现实的。这个时候就需要用到之前提到的message bus,而这个message bus做的还不仅仅是广播。通过向系统发送Intent,系统可以根据Intent的内容执行一定的操作,帮你激活应用。

Intent可以在components之间发送,不管是在一个应用内还是多个应用之间。对于activities和services,Intent会定义要做什么和对什么数据(通过URL),而对于broadcast receivers,intent则只定义一个一直的动作。而content providerz则是由contentResolver来激活的。

Manifest File

Android应用的根目录下都有一个文件*AndroidManifest.xml“, 而他主要做几件事情:

  1. 申明应用所包含的components,这样系统就知道这个应用有多少components,能够对什么消息作出相应,能够如何被激活。同时也会在里面包含这些components能做什么的信息,这样当系统受到一个Intent说要执行actionA的时候,系统就知道要去找谁了。
  2. 申明应用所需的权限,如果没有这些权限应用就无法正常工作,所以在安装是系统就根据=manifest file=里的内容告知用户应用需要这些权限,否则就不给安装。这个步骤不能逐个控制经被诟病蛮久了,很多无关的应用都要求访问联系人短信等权限,你只有不装或者忍受两种选择。
  3. 申明最低系统需求,这个是通过API Level API Level就是一个数字,越新的版本数字越大,所以只要系统的数字大于应用所申明的数字,那么这个应用就可以运行。
  4. 申明需要的硬件和软件功能,如蓝牙,摄像头等。也包含屏幕尺寸啊输入的要求之类的信息
  5. 需要的而外的libraries

Application Resources

一个应用除了代码还会有图片音效视频的资源文件,这些文件都被统一管理了起来放在res/目录下。而Android sdk build tools则对每一个资源都生成一个unique ID,并在R.java里面生成这些ID的reference。这样你在代码里就能够直接引用这些资源。并且对于不同的密度,资源也是不一样的。