本文主要是对Android系统做一个简介,包括其架构、启动流程、沙箱机制、APK、Darlvik以及ART。

1. 架构

Android是基于Linux内核开发出的一个移动操作系统,系统结构大致可以分为五层。自顶向下分别是系统应用程序、Java API框架、系统运行库、硬件抽象层以及Linux内核。

1.1 Linux内核

Linux内核是Android平台的基础。例如ART依赖于Linux内核层的线程以及内存管理。Android

使用Linux内核,是因为其良好的安全特性以及硬件驱动的支持。

1.2 硬件抽象层

Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。由于Android跟Linux所采用的证书不同,如果把驱动都放在Linux内核层,发布的时候就需要公布源代码,硬件的相关参数和实现就会被公开,这对厂家来说,损失非常大。因此,通过添加这一层,使得商业秘密隐藏起来,减小厂家的损失。单纯从架构角度来说,这一层并不是必须的,只是商业上的一种妥协。

1.3 系统运行库

这一层包含两部分,核心库以及Android运行环境。这一层提供了一个很关键的模块,Art(早期为Dalvik)虚拟机。

1.4 Java API框架

应用程序框架为应用程序提供了许多更高层的服务,例如Activity Manager、Resource Manager、Notifications Manager等。

1.5 系统应用程序

包含一系列系统App,例如通讯录、浏览器等等。

2. Android启动流程

Android系统的整个启动过程,基本上可以划分为三个阶段:

  1. Bootloader引导
  2. Kernel启动
  3. Android系统服务启动

2.1 引导程序(bootloader)

引导程序是Android操作系统开始运行前的一个小程序,引导程序是运行的第一个程序,它不是Android

操作系统的一部分,是OEM厂商或者运营商加锁和限制的地方。

引导程序分两个阶段执行:

  1. 检测外部的RAM以及加载对第二阶段有用的程序。
  2. 引导程序设置网络、内存等。

2.2 内核(kernel)

Android内核与桌面linux内核启动的方式差不多。内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,然后启动init进程。

2.2.1 init进程

init是第一个进程,可以说是root进程或者所有进程的父进程。init进程有两个责任:

  1. 挂在目录。
  2. 运行init.rc脚本。

init.rc文件是由被称为Android初始化语言所编写的,有特定的格式以及规则。init进程创建完毕后,就可以在屏幕上看到Android的Logo了。

2.2.2 Zygote进程

Zygote是一个虚拟器进程,是由init进程fork出来的,在系统引导的时候启动。Zygote会预加载以及初始化系统的核心库类,使得虚拟机共享代码、低内存占用以及最小的启动时间成为可能。在Android系统中,所有应用程序进程以及系统服务进程(SystemService)都是由Zygote进程fork出来的,它建立了App运行所需要的环境,是非常重要的进程。在这个阶段可以看到启动动画。

2.3 Android系统服务启动

在此过程中,主要是系统服务以及其他服务的创建过程。核心服务如Activity管理器、包管理器以及电池服务等。其他服务如通知管理器、网络连接服务以及设备存储监视服务等。

一旦系统服务在内存中跑起来,Android变完成了引导过程,这个时候就会收到开机启动广播ACTION_BOOT_COMPLETED

3. 沙箱机制

Android利用了Linux的基于用户的保护策略(user-based protection),作为鉴定和分离应用程序资源的一种手段。每个Android应用都运行在自己的沙箱内:

  • Android操作系统是一种多用户Linux系统,其中的每个应用都是一个不同的用户;
  • 默认情况下,系统会为每个应用分配一个唯一的Linux用户ID(该ID仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户ID才能访问这些文件;
  • 每个进程都具有自己的虚拟机 (VM),因此应用代码是在与其他应用隔离的环境中运行;
  • 默认情况下,每个应用都在其自己的Linux进程内运行。Android会在需要执行任何应用组件时启动该进程,然后在不再需要该进程或系统必须为其他应用恢复内存时关闭该进程。

Android系统可以通过这种方式实现最小权限原则。也就是说,默认情况下,每个应用都只能访问执行其工作所需的组件,而不能访问其他组件。 这样便营造出一个非常安全的环境,在这个环境中,应用无法访问系统中其未获得权限的部分。

4. APK介绍

4.1 简介

APK即Android Application Package,Android

应用程序包。是Android系统中的应用程序包的文件格式。APK文件可以看作应用代码、资源、证书以及manifest文件的容器,它基于zip格式将这些资源打包。它的MIME type为application/vnd.android.package-archive。

4.2 结构

一个APK文件通常包含以下文件:

META-INFO文件夹:
MANIFEST.MF: 清单文件。
CERT.RSA: 保存着该应用程序的证书和授权信息。
CERT.SF: 保存着SHA-1信息资源列表。
lib:包含不同CPU架构的库。
res:资源文件夹。
assets:可被AssetManager访问的资源文件夹,不会被特殊处理。
AndroidManifest.xml:manifest文件。
classes.dex:classes文件通过DEX编译后的文件格式,在Dalvik虚拟机上运行的主要代码部分。
resources.arsc:包含预编译的应用资源,例如XML等。

4.3 构建工具

针对一般的应用开发,在Eclipse年代,构建主要是使用Ant。对于Android Studio年代,则是Gradle,它是AS默认的构建工具,结合了Ant以及Maven的优点,简洁并且灵活性高。

5. Dalvik以及ART

谷歌在Android L上直接删除Dalvik,使用了ART作为替代,那么这两者有什么区别呢?

5.1 Dalvik

Dalvik主要是完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理、垃圾回收等等重要功能。Dalvik还负责进程隔离,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

Dalvik是一个基于寄存器,运行dex格式文件的虚拟机。它不同于JVM的栈架构,也不能运行Java的字节码。从Android

2.2开始,Dalvik支持JIT。app每次运行的时候,Dalvik会将dex文件编译为机器码,这种实时编译的方式是其与ART最主要的区别。

5.2 ART

ART是一种在Android操作系统上的运行环境,ART能够在第一次安装的时候,把应用程序的字节码转换为机器码。采用了预编译(AOT,Ahead-Of-Time)技术。在安装的时候,ART使用dex2oat工具来编译app。与Dalvik相比,主要的改进是减少了字节码到机器码的翻译过程。

5.3 区别

  • ART采用预编译(AOT,Ahead-Of-Time)技术,启动运行会更快。
  • 对于同一个app,ART所需要的存储空间比Dalvik大,安装的时间也会变长。
  • ART不用实时编译,因此对于CPU的使用减少了很多,续航能力更强一些。
  • ART有着更高的GC效率,更友好的debug支持。

6. 参考

  1. Android启动过程深入解析
  2. Android系统启动流程
  3. Platform Architecture
  4. System and kernel security
  5. Android硬件抽象层(HAL)概要介绍和学习计划

喜闻乐见-Android简介的更多相关文章

  1. 《第一行代码》之——1.Android简介

    Android简介 Android系统架构 (图片源自维基百科) Android大致分为四层架构,五块区域. Linux内核层 Android系统基于Linux2.6,这一层为Android设备的各种 ...

  2. Android开发-API指南-Android简介

    Introduction to Android 英文原文:http://developer.android.com/intl/zh-cn/guide/index.html 采集日期:2014-4-16 ...

  3. android自学笔记(1):android简介

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名称,中国大陆地区较 多人使用“安卓 ...

  4. Android 简介:Android SDK 和开发框架简介

    理解Android软件栈: 库: C/C++库(libc,SSL) Android 运行时可以让Android手机从本质上与一个移动Linux实现区分开来.Dalvik并不是Java虚拟机,是一个基于 ...

  5. Android简介(一)

    Android构架 Android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用架构层.系统运行库层和Linux核心层. 1. ...

  6. 喜闻乐见-Android LaunchMode

    launchMode,通俗点说,就是定义了Activity应该如何被launch的.那么这几种模式的区别以及应用场景,会有何不同呢?谷歌是基于什么原因设计这几种模式的呢?这几种模式背后的工作原理是什么 ...

  7. 喜闻乐见-Android应用的生命周期

    本文主要讲述了App的启动流程.Application的生命周期以及进程的回收机制. 在绝大多数情况下,每一个Android应用都在自己的Linux进程中运行.当需要运行某些代码时,进程就会被创建.进 ...

  8. Android 简介

    一 Android起源 android: 机器人 android是google公司开发的基于Linux2.6的免费开源操作系统 2005 Google收购 Android Inc. 开始 Dalvik ...

  9. 【译】Android系统简介

    简介  本文主要介绍Android的基础知识和体系结构,本文主题: 简介什么是Android,为什么开发者需要关注Android: Android体系结构(如Linux Kernel, Librari ...

随机推荐

  1. shell if 条件判断

    condition='123' if [ -z condition]; then echo "condition 是空的" fi 字符串判断: = 两个字符串相等. != 两个字符 ...

  2. I2C软件调试思路并知识总结

    I2C是一种只使用两根线的串行通信协议.一根线是串行数据线SDA,另外一种是串行时钟线SCL. I²C允许相当大的工作电压范围,但典型的电压准位为+3.3V或+5v. I²C的参考设计使用一个7比特长 ...

  3. C语言中const关键字的用法

    关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理 ...

  4. 机器学习基石笔记:13 Hazard of Overfitting

    泛化能力差和过拟合: 引起过拟合的原因: 1)过度VC维(模型复杂度高)------确定性噪声: 2)随机噪声: 3)有限的样本数量N. 具体实验来看模型复杂度Qf/确定性噪声.随机噪声sigma2. ...

  5. AB(ApacheBench)工具 -- 压力测试

    服务器负载太大而影响程序效率也是很常见的,Apache服务器自带有一个叫AB(ApacheBench)的工具,可以对服务器进行负载测试 同时美多商城的秒杀功能也会被高负载影响,从而导致超卖现象 安装x ...

  6. 【xsy1503】 fountain DP

    题目大意:给你$D$个格子,有$n$个喷水器,每个喷水器有一个喷水距离$r_i$. 现在你需要在这$D$个格子中选择$n$个位置按照任意顺序安装这$n$个喷水器,需要满足$n$个喷水器互相喷不到对方. ...

  7. kubernetes入门之构建单机集群

    1.kubernetes简介 kubernetes简称k8s,它是一个全新的基于容器技术的分布式架构方案,它是谷歌十几年来大规模应用容器技术的经验累积和升华的一个重要成果.如果我们的系统设计遵循了k8 ...

  8. SQL 必知必会·笔记<18>管理事务处理

    事务处理是一种机制,用来管理必须成批执行的SQL操作,保证数据库不包含不完整的操作结果.利用事务处理,可以保证一组操作不会中途停止,它们要 么完全执行,要么完全不执行(除非明确指示).如果没有错误发生 ...

  9. Windows10安装Docker

    一.Docker下载安装 一般情况下,我们可以从Docker官网docker下载安装文件,但是官方网站由于众所周知的原因,不是访问慢,就是下载慢.下载docker安装包动不动就要个把小时,真是极大的影 ...

  10. [BZOJ 4671]异或图

    Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...