apk开发教程!带你全面解析Android框架体系架构view篇,成功入职腾讯
项目一直在使用现成的开源框架xUs(全称是xUtils),其核心模块包括BitmapUs、DbUs、ViewUs和HttpUs四个主要组件。其中这些核心模块在项目中应用较为广泛。为了深入了解其工作原理,最近开始研究x Utils的源代码。我对它的内部机制一直很好奇。我首先从BitmapUs模块入手进行了解析。由于这个加载过程与大多数图片加载框架类似,在内存缓存阶段会优先尝试加载图片数据;如果内存缓存为空,则会转向文件缓存系统获取;如果文件缓存也未找到相关内容,则需要通过网络接口下载图片并将其存储到内存和文件缓存中以供后续使用。
这篇帖子先分析内存缓存是如何实现的。好吧开始进入正题。
基于Linux的pc启动过程
众所周知,各种程序软件(包括操作系统)通常运行在内存中;但我们的操作系统一般存储在硬盘上;当按下开机键时;此时内存中没有任何程序处于运行状态;因此必须借助某种机制将操作系统的加载过程实现出来;完成这一功能的就是 BIOS 。
装过系统的人一定知道BIOS这个东西,那么它究竟是什么呢?
BIOS即为Basic Input/Output System(基本输入输出系统),它运行于IBM PC兼容系统中并被公认为行业内的标准接口(源自维基百科)。实际上很多人一开始接触电脑时都会觉得很难理解什么是BIOS。然而真正了解后会发现BIOS是我们电脑启动的第一项加载程序,并且它并不是以Java或C编程语言开发而是采用汇编语言完成功能。
BIOS 程序固定在主板上的这块芯片上, 具有连接计算机硬件与操作系统的功能, 它存储着...的基本输入输出程序、开机自检程序以及系统自启动程序.
那么BIOS程序是如何启动的呢?bios程序启动是由硬件完成的任务。这些处理器在开机时自动切换至16位实模式运行状态。在此状态下硬件设计会强制设定CS寄存器值为FFFFFF和IP寄存器值为零如此一来cs:ip指针指向的位置是FFFFO也就是该程序的第一步执行位置这样的配置使得整个bios引导流程得以顺利实现这也是所有计算机系统的基础
因此这是一个硬件厂商之间的规定,在所有BIOS程序模块的入口地址均为0xFFFF0的情况下,在开机时会找到这个地址位置;若该地址处没有代码段,则计算机将无法正常启动而死机;若该地址处有代码段,则会依次执行该代码段并继续运行下去即完成BIOS程序的启动过程
补充:
在BIOS程序运行开始时
针对Linux操作系统而言
在执行一系列BIOS代码之后的过程中,****计算机完成了自检等基本操作。与此同时,硬件系统通过与BIOS协同工作来处理相关事务,使得CPU接收到了一个特定的中断信号。当CPU接收到该中断时,它能够迅速定位到对应于该中断的处理程序,从而能够调用相应的中断服务函数。在此基础上,由相应的服务函数将引导程序放置到内存中的指定位置,完成数据加载过程。
在引导程序发挥作用的过程中, 逐步加载操作系统中的其他应用程序, 实现了从实时操作系统到保护型操作系统的切换, 为其核心入口函数main做好了铺垫, 接下来将是操作系统初始化的关键阶段, 最终完成了计算机启动这一重要步骤.
Android手机的启动过程
Android系统作为基于Linux系统的移动操作系统,并非像普通个人电脑那样具备BIOS程序。
替代了Bootloader —— 系统启动加载程序。如同引导盘,在系统加载前 用于 初始化硬件设备 , 创建 内存空间 的 初始 图像 , 为 后续 调用 操作系统 内核 做好 准备。
在 Android 系统中,并没有独立的硬盘存储空间;相反地,在其存储介质中有一个称为 ROM 的部分。 ROM 也类似于一个类似硬盘的空间来存储操作系统以及应用程序。 ROM 也会按照类似的方式被划分成若干区域,在 Android 系统中主要分为几个区域:
- /boot: 存放启动模块 包含内核与内存操作功能
- /system: 类似于C盘 系统存储Android软件及后台服务
- /recovery: 可进入此区域执行系统修复操作
- /data: 用于存储用户的各项信息 包括通讯录短信设置与应用安装
- /cache: 负责存储操作系统运行中最常访问的数据与应用程序
- /misc: 包含一些额外的配置选项 如主菜单界面重启模式等
- /sdcard: 用于个人文件管理 包括照片音乐视频等多媒体资料
那么 Bootloader又是如何被加载的呢?就像PC一样,在开机加电的时候, CPU会从厂商预设的系统总线地址处读取指令,这个地址在各厂商之间有约定俗成的规定,类似于80x86架构中的0xFFFF0地址等特征,因此Android设备会将固态存储设备上的ROM预先映射到该系统总线地址上.当开机加电时,CPU就会从该系统总线地址开始运行Bootloader程序,完成启动过程并加载Linux内核到内存中.
在Linux内核启动时会初始化一系列软硬件设施。随后会加载所需的驱动程序。接着会挂载根文件系统。随后会启动并执行其内部的init脚本。该init脚本是Android系统 boot过程中至关重要的一环。
Android系统的 init 进程可被视为其核心组件之一。该进程中包含了多个本地服务功能模块,在解析完成后会生成一个称为 Zygote 的关键中间态。值得注意的是,在解析 init.rc 文件后会启动 Zygote 进程的创建工作(即 booting),而我们的应用正是基于这个过程构建而成的。
- 导入ZygoteInit类,并对Zygote Socket服务端套接字进行注册;
- 加载虚拟机;
- 预先导入Android核心组件
- 预先导入系统所需资源
随后Zygote进程会生成一个System Server进程,并由其负责启动并管理整个framework系统, 具体包含Activity Manager、PowerManager等功能。
当System Server将系统服务启动完成后(或准备好),就会触发ActivityManager启动首个Android应用程序对应于我们的桌面应用界面。
至此,从Android手机开机到看到桌面程序所有过程分析完了。
学习分享
在当今信息高度共享的时代,在这个背景下,大量资源都可通过网络平台获取;这主要取决于你是否愿意去寻找以及你所采用的寻找方式是否得当。
实际上许多朋友虽然拥有大量资源 但这些资源往往杂乱无章 可能难以有效管理和利用 即使能够找到也容易导致资源被遗忘或无法长期保存
如果大家觉得在网上找资料十分杂乱、不成系统的话,我也分享一套给大家相当有条理的资源包给各位参考使用。我也常常会 dedicated to 仔细研读这些优质内容。
2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,
适合人群:
第一点,
学习知识存在碎片化问题,
没有系统的学习路径与明确的进阶方向。
第二点,
开发几年后,
不知道如何进一步提升自己,
显得有些迷茫。
第三点,
到了合适年龄后,
未来的发展方向变得复杂,
是选择转向管理还是加强技术研究?
如果你有相关需求,
我这里正好有解决方案。
或许能帮助你改善现状!
鉴于文章内容较为丰富,
篇幅限制无法全面展开所有细节。
部分内容以图片形式展示。
如需获取完整资料包的朋友,
可通过我的GitHub仓库免费下载:
我的GitHub项目详细了解相关技术与实践内容。
%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)免费获取。**
