热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android系统架构,方方面面都在这

image.png 关于Android系统 Android,本义指“机器人”,是Google于2007年11月5日宣布的基于Linux平台的操作系统。 Android系统优缺点 开放性
Android系统架构,方方面面都在这
image.png
关于Android系统

Android,本义指“机器人”,是Google于2007年11月5日宣布的基于Linux平台的操作系统。

Android系统优缺点
开放性

在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。
开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。

丰富的硬件

这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,如同从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带iPhone上使用、联系人等资料更是可以方便地转移。

跨平台

由于使用Java进行开发,Android继承了Java跨平台的优点。任何Android应用几乎无需任何修改就能运行于所有的Android设备。包括但不限于手机,平板,手环,车载系统,智能家居。

方便开发

Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。

Google应用

在互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。

太碎片化

纷繁复杂的屏幕尺寸,分辨率,不同版本且订制开发的Android系统,各个厂家硬件,虚拟菜单等,给开发者带来一定的复杂性。

截至目前发行历史版本:

每个版本都是按照英文字母顺序取的字母,然把它作为单词第一个字母,去拼一个甜点的单词,可是到了M,N,O,P,到了Q的时候就变了,改为就叫Android 10了。

  • 1.5 Cupcake(纸杯蛋糕)
  • 1.6 Donut(甜甜圈)
  • 2.2 Froyo(冻酸奶)
  • 2.3 Gingerbread(姜饼)
  • 3.x Honeycomb(蜂巢)
  • 4.0 Ice Cream Sandwich(冰激凌三明治)
  • 4.1 Jelly Bean(果冻豆)
  • 4.4 KitKat(奇巧巧克力)
  • 5.0 Lollipop(棒棒糖)
  • 6.0 Marshmallow(棉花糖)
  • 7.0 Nougat(牛轧糖)
  • 8.0 Oreo(奥利奥)
  • 9.0 Pie (派)
  • 10.0 Android 10
系统架构图:
Android系统架构,方方面面都在这
image.png

基于Android 8.0的系统根目录结构图:

Android系统架构,方方面面都在这

Android从下往上层主要分为4层,如同网络的七层协议,这样做的好处是屏蔽本层与下层的差异。

  • linux内核层(Linux Kernel)
  • 系统运行时库层 (Libraries and Android Runtime)
  • 应用程序框架层(Application Framework)
  • 应用程序层 (Applications)
linux内核层(Linux Kernel)
驱动名称 简介
Android电源管理(Power Management) 针对嵌入式设备的,基于标准Linux电源管理系统的,轻量级的电源管理驱动
低内存管理器 (Low Memory Keller) 选择性杀死进程来释放需要的内存
匿名共享内存 (Ashmem) 为进程之间提供共享内存资源,同时为内核提供回收和管理内存的机制
日志(Android Logger) 一个轻量级的日志设备
定时器(Android Alarm) 提供一个定时器把设备从睡眠状态唤醒
物理内存映射管理 (Android PMEM) DSP及其他设备只能工作在连续的物理内存上,PMEM用于向用户空间提供 连续的物理内存区域映射
Android定时设备(Android Timed device) 执行对设备的定时控制功能
Yaffs2文件系统 Android采用大容量的NAND闪存作为存储设备,使用Yaffs2作为文件系统管理大容量MTD NAND Flash;Yaffs2占用内存小,垃圾回收简洁迅速
硬件抽象层

在linux内核层和系统运行时库层之间还有一层硬件抽象层(Hardware Abstract Layer,HAL),它是对硬件设备的具体实现加以抽象。鉴于许多硬件设备厂商不希望公开其设备驱动的源代码,如果能将android的应用框架层与linux系统内核的设备驱动隔离,使应用程序框架的开发尽量独立于具体的驱动程序,则android将减少对Linux内核的依赖。HAL由此而生,它是对Linux内核驱动程序进行的封装,将硬件抽象化,屏蔽掉了底层的实现细节。

系统运行库层

由系统类库和Android运行时组成。

  • 系统类库(Libraries)

系统类库大部分由C/C++编写,提供的功能通过Android应用程序框架来调用。

名称 简介
Surface Manager 管理应用显示,另外也对2D和3D图形提供支持
Media Framework 基于PacketVideo的OpenCORE的多媒体库,支持多种常见音视频格式的录制和播放
SQLite 本地小型关系数据库,如平时用数据库用到
OpenGL 基于OpenGL ES 1.0API标准实现的3D跨平台图形库
FreeType 用于显示位图和矢量字体
WebKit Web浏览器的软件引擎
SGL 基于2D图形引擎
Libc(bionic ibc) C函数库bionic libc,更适合基于嵌入式Linux的移动设备
SSL 安全套接层,为网络通信提供安全及数据完整性的一种安全协议,如https请求需认证

几个常用且比较重要的C/C++程序库所在的目录如图:

Android系统架构,方方面面都在这
  • Android运行时(Android Runtime)

由核心库和Dalvik虚拟机组成。
核心库:核心库提供了Java5 se API的多数功能,并提供Android的核心API,如android.os,android.net,android.media等。

Dalvik虚拟机:Dalvik虚拟机是基于apache的java虚拟机,并被改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调试管理,安全和异常管理,垃圾回收等重要功能。

Jvm、Dalvik和Art

java虚拟机 Dalvik虚拟机
java虚拟机基于栈,基于栈的机器必须使用指令来载入和操作栈上数据 Dalvik虚拟机基于寄存器
java虚拟机运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar获取相应的字节码) Dalvik运行的是自己专属的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据)
一个应用对应一个Diavik虚拟机实例,独立运行

Android应用编译及运行流程:

Android系统架构,方方面面都在这
image.png
aapt:

即Android Asset Packaging Tool(Android 打包工具),在SDK的build-tools目录下,也行平时没有用到过,但是开发工具生成Apk时会自动使用aapt将代码和资源文件打包在其中。

Apk打包流程:

Android系统架构,方方面面都在这
image
SDK和NDK的关系:
Android系统架构,方方面面都在这
image

ndk可以通过native code跨过使用dalvik runtime,直接调用到android内核资源,而sdk则需要在dalvik runtime环境下才能调用到内核资源。然而两者并不是各司其职,各不相关。android提供了JNI(java native interface)使两者可以进行相互调用和通信。

应用框架层(Application Framework)

应用程序框架层提供开发Android应用程序所需的一系列类库,高度封装直接调用。

应用框架层的主要实现代码在frameworks/base和frameworks/av目录下,其中frameworks/base目录结构如图:

Android系统架构,方方面面都在这
类库名称 简介
视图系统(View System) 创建应用所需的组件
活动管理器(ActivityManager) 管理各个应用程序生命周期,为所有程序的窗口提供交互的接口
窗口管理器(Window Manager) 对窗口程序进行管理
内容提供者(Content Provider) 提供一个应用程序访问另一个应用程序数据的功能,实现应用间共享数据
通知管理器(Notification Manager) 使应用可以在系统状态栏中显示通知消息
包管理器(Package Manager) 管理应用安装、卸载,应用版本号、版本名,查询相关权限等功能
资源管理器(Resource Manager) 提供各种非代码资源供应用程序使用,如字符串,颜色,图片,音频等
位置管理器(Location Manager) 提供位置服务
电话管理器(Telephony Manager) 提供设备电话相关功能
XMPP服务 Google在线即时交流软件中一个通用的进程,提供后台推送服务
应用层(Applications)

系统内置的应用程序以及非系统级的应用程序都属于应用层,负责与用户进行直接交互,通常都是用Java进行开发的。包括设备系统自带的工具,日历,音乐,浏览器,图片查看等应用,还有开发者开发应用程序。

源码根目录中的packages目录对应着系统应用层,目录结构图:

Android系统架构,方方面面都在这
在线阅读Android源码

在Android系统源码官网,各个Android版本的源码任君挑选。
Android在线阅读源码地址

Android系统架构,方方面面都在这
屏幕快照 2020-08-30 10.13.45.png

虽然我们平时开发应用主要行走在Applications层上,但是并不限制我们往下走,虽然这条路是艰难漫长的,坚持下去总有拨云见雾的一天。该篇文章保持更新。


推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • iOS开启Google位置服务器和显示定位权限的方法
    本文介绍了在iOS开发中如何开启Google位置服务器和显示定位权限的方法,包括导入CoreLocation和MapKit库、在界面导入头文件和在info.plist文件中添加授权等步骤。同时还介绍了iOS11中NSLocationAlwaysAndWhenInUseUsageDescription的功能变化。阅读本文可以帮助开发者了解如何在iOS应用中使用Google位置服务器和处理定位权限相关的问题。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
author-avatar
勿泊心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有