草庐IT

安卓进阶之android系统架构

Suzy.Mo 2023-06-05 原文

安卓进阶之android架构

安卓进阶躲不开阅读源码和深入了解安卓的底层,这是一篇入门级别的文章,可以对安卓架构有个大体的认识。

AOSP与Android系统架构

首先要理解andriod和AOSP的关系,我们日常开发的安卓跟市面上的安卓不是一个意思,我们开发的是安卓app,市面上的安卓其实是安卓系统。

维基百科:Android是基于Linux 内核和其他开源软件的修改版本的移动操作系统,主要为智能手机和平板电脑等触摸屏移动设备设计。

官方文档:**Android 开放系统平台 (Android open source project AOSP)**是公开可用且可修改的 Android 源代码。任何人都可以为他们的设备下载和修改 AOSP。 AOSP 提供完整且功能齐全的 Android 移动平台实现。

五层的安卓架构(下图左边),一些书籍或者博客上常见的这张图;最新版可看官方文档(回头看这篇文章的时候可能也会过时)。以下介绍会结合两个图进行说明。

最新的AOSP软件堆栈架构如下图右边,即我们说的android系统架构:

详细介绍如下:

应用层(System apps)

包括Android appPrivileged appDevice manufacture app等应用程序,system apps的意思就是手机系统中的apps,两个版本在这一层是一样的。

  • 安卓应用(Android app):仅使用 Android SDK 中的 Android API 创建的应用程序。
  • 特权应用程序(Privileged app):结合使用 Android 和系统 API 创建的应用程序。这些应用程序必须作为特权应用程序预安装在设备上。
  • 设备制造应用程序(Device manufacture app):使用 Android API、系统 API 和直接访问 Android 框架实现的组合创建的应用程序。

应用框架层(Java API Framework)

我们平时开发都是用到这一层提供的API,而这一层是java编写的,所以称为Java API。Android 4大组件,6大布局,view等系统定义的原生组件都在这层。

由于Framkwork层和Android SDK 是有交集的(或者是包含关系),旧版本中其实是把Framework层和Android SDK合并作为一层去介绍了。

  • Framework层

    又称安卓框架。一组 Java 类、接口和其他构建应用程序的预编译代码。该框架的某些部分可通过使用 Android SDK 的 Android API 公开访问。Android 框架代码在应用进程中运行。

  • Android SDK = Android API + System API

    又称安卓开发工具包。一个软件开发工具包,用于创建与 Android 框架交互的应用程序。 Android SDK 由适用于所有应用程序的 Android API 和仅适用于特权应用程序的系统 API 组成。

后续的源码阅读会经常看到ActivityManagerService(AMS)、WindowManagerService(WMS)这些,这些都是FrameWork层的源码。

名称功能描述
Activity Manager(活动管理器)管理各个应用程序生命周期,以及常用的导航回退功能
Location Manager(位置管理器)提供地理位置及定位功能服务
Package Manager(包管理器)管理所有安装在Android系统中的应用程序
Notification Manager(通知管理器)使得应用程序可以在状态栏中显示自定义的提示信息
Resource Manager(资源管理器)提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
Telephony Manager(电话管理器)管理所有的移动设备功能
Window Manager(窗口管理器)管理所有开启的窗口程序
Content Provider(内容提供者)使得不同应用程序之间可以共享数据
View System(视图系统)构建应用程序的基本组件

系统服务(System services)

这个是五层架构中没有提及的部分,是在新版中单独分离出来的一层。

系统服务是模块化的、集中的组件,例如system_server 、SurfaceFlinger 和 MediaService。

**Android 框架 API 公开的功能与系统服务通信以访问底层硬件。**所以它夹在应用框架层和运行库层之间。

系统运行库层

旧版中系统运行库包括native库和ART库。

新版中两者是分开的,而且并不在同一层,旧版中的本机C/C++库,在新版中扩展为本机的进程和库。

  • ART库:Android run time是 AOSP提供的Java应用运行环境。所以我们的程序采用java语言编写, 程序在Android运行时中执行。ART 将应用程序的字节码转换为特定于处理器的指令,这些指令由设备的运行时环境执行。

    运行时库包括核心库和ART(Android5.0后,Dalvik被ART取代),其中核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。

  • Native daemons and libraries:本机守护进程和库。

    • 该层中的本机守护进程包括inithealthdlogdstoraged 。这些守护进程直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。
    • 该层中的本机库包括libclibloglibutilslibbinderlibselinux 。这些本机库直接与内核或其他接口交互,不依赖于基于用户空间的 HAL 实现。

硬件抽象层(HAL)

HAL 是一个抽象层,具有供硬件供应商实现的标准接口。 HAL 允许 Android 不了解较低级别的驱动程序实现。使用 HAL 允许在不影响或修改更高级别系统的情况下实现功能。

Linux 内核层(Linux Kernel)

作为任何操作系统的核心部分,内核与设备上的底层硬件进行对话。在可能的情况下,AOSP 内核被拆分为与硬件无关的模块和特定于供应商的模块。

andriod内核是基于Linux内核的,在此基础上添加了关于安卓的驱动。

系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。

其中的驱动包括:音频(Audio)、android IPC机制(Binder机制)跨进程通讯、显示 (Display)主要是屏幕显示、按键(Keypad) 处理按键的分发等、蓝牙(BlueTooth)、相机(Camera)、内存分配与共享(Shared Memory)、USB、WIFI、电源管理(power management)

Andriod系统源码目录

官方网站:https://cs.android.com/android/platform/superproject

国内网站:https://www.androidos.net.cn/android/10.0.0_r6/xref

整体架构

Android源码根目录描述
abi应用程序二进制接口
art全新的ART运行环境
bionic系统C库
bootable启动引导相关代码
build存放系统编译规则及generic等基础开发包配置
ctsAndroid兼容性测试套件标准
dalvikdalvik虚拟机
developers开发者目录
development应用程序开发相关
device设备相关配置
docs参考文档目录
external开源模组相关文件
frameworks应用程序框架,Android系统核心部分,由Java和C++编写
hardware主要是硬件抽象层的代码
libcore核心库相关文件
libnativehelper动态库,实现JNI库的基础
ndkNDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码
out编译完成后代码输出在此目录
packages应用程序包
pdkPlug Development Kit 的缩写,本地开发套件
platform_testing平台测试
prebuiltsx86和arm架构下预编译的一些资源
sdksdk和模拟器
system底层文件系统库、应用和组件
toolchain工具链文件
tools工具文件
Makefile全局Makefile文件,用来定义编译规则

应用层部分

应用层位于整个Android系统的最上层,源码根目录中的packages目录对应着系统应用层。它的目录结构如下:

packages目录描述
apps核心应用程序
experimental第三方应用程序
inputmethods输入法目录
providers内容提供者目录
screensavers屏幕保护
services通信服务
wallpapers墙纸

应用框架层

应用框架层一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。
应用框架层的主要实现代码在/frameworks/base和/frameworks/av目录下,其中/frameworks/base目录结构如下:

/frameworks/base目录描述
api定义API
cmds重要命令:am、app_proce等
core核心库
data字体和声音等数据文件
docs文档
graphics图形图像相关
include头文件
keystore和数据签名证书相关
libs
location地理位置相关库
media多媒体相关库
native本地库
nfc-extrasNFC相关
obex蓝牙传输
opengl2D/3D 图形API
packages设置、TTS、VPN程序
saxXML解析器
services系统服务
telephony电话通讯管理
test-runner测试工具相关
tests测试相关
tools工具
wifiwifi无线网络

C/C++程序库部分

系统运行库层(Native)中的
C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,这里给出几个常用且比较重要的C/C++程序库所在的目录位置。

目录位置描述
bionic/Google开发的系统C库,以BSD许可形式开源。
/frameworks/av/media系统媒体库
/frameworks/native/opengl第三方图形渲染库
/frameworks/native/services/surfaceflinger图形显示库,主要负责图形的渲染、叠加和绘制等功能
external/sqlite轻量型关系数据库SQLite的C++实现

Android运行时库的代码放在art/目录中。硬件抽象层的代码在hardware/目录中,这一部分是手机厂商改动最大的一部分,根据手机终端所采用的硬件平台会有不同的实现。

参考文章

安卓操作系统(维基百科)

Android进阶解密第一章

Android系统基础架构

有关安卓进阶之android系统架构的更多相关文章

  1. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  2. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  3. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  6. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  7. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  8. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  9. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

  10. ruby - 我可以从 Ruby 中的系统调用中获得连续输出吗? - 2

    当您在Ruby脚本中使用系统调用时,您可以像这样获得该命令的输出:output=`ls`putsoutput这就是thisquestion是关于。但是有没有办法显示系统调用的连续输出?例如,如果您运行此安全复制命令,以通过SSH从服务器获取文件:scpuser@someserver:remoteFile/some/local/folder/...它显示随着下载进度的连续输出。但是这个:output=`scpuser@someserver:remoteFile/some/local/folder/`putsoutput...不捕获该输出。如何从我的Ruby脚本中显示正在进行的下载进度?

随机推荐