本文主要是对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. 什么是Spring Boot?

    什么是Spring Boot? Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者 ...

  2. Spark基础脚本入门实践1

    1.创建数据框架 Creating DataFrames val df = spark.read.json("file:///usr/local/spark/examples/src/mai ...

  3. Servlet-xml配置简介以及url-pattern简介

    编写一个Servlet是需要实现Servlet接口,或者继承HttpServlet. 一个已经注册的Servlet可以被多次映射,如下图所示 或者多个url-pattern放在同一个servlet-m ...

  4. [Leetcode]394.字符串解码

    题目与解释 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正 ...

  5. Xamarin.Android 关于so包报错问题

    问题描述:使用so包时报错. 解决方法: 1.保证 libs > armeabi 和 armeabi-v7a 中的so包一致. 2.去掉 x86,x86_64,arm64-v8a. 3. so的 ...

  6. mysql 开发进阶篇系列 28 数据库二进制包安装(centos系统准备)

    1. centos 7安装工作 对于mysql二进制安装,我这里在使用一台新的centos系统.准备好VMware,Xftp-6.0, Xshell-6.0.在VMware中网络使用桥接模式,分配20 ...

  7. python3中的range函数返回的是列表吗?

    注意,这里说的Python3里面的range函数,和Python2是不同的,返回的不是列表,是可迭代对象. 在python3中,如果执行下面的语句 print(range(10)) 得到结果是 ran ...

  8. PostgreSQL 使用小点

    1.timestamp 有分时区和无时区(减少使用),8个字节,包含日期和时间,范围是:公元前4713 - 公元294276.底层存储的是时间戳,这对任何地区的都一样,而具体时间显示则可从数据库层面设 ...

  9. centos6.10搭建ELK之elasticsearch6.5.4

    1.环境准备 1.1.安装java环境版本不要低于java8 # java -version java version "1.8.0_191" Java(TM) SE Runtim ...

  10. 理解交叉熵(cross_entropy)作为损失函数在神经网络中的作用

    交叉熵的作用 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点: 而即便是R ...