安卓机型固件系统分区的基础组成 手机启动规律初步常识 各分区的基本含义与说明

2023-09-17 12:44:18

此贴为基本常识。感兴趣的友友可以了解手机的启动顺序和各模式的基本操作与意义。另外了解手机系统分区各文件夹的含义

分区说明对应贴:安卓机型固件中分区对应说明

手机开机基本启动顺序

当我们按下手机开机键的时候。基本的启动顺序为

注意:该结构图并不反映手机的实际分区顺序和位置,只是一个逻辑结构图。当按下电源键手机上电启动后,首先从bootloader分区中一个固定的地址开始执行指令,bootloader分区分成两个部分,分别叫做primarybootloader和secondarystagebootloader。Primarybootloader主要执行硬件检测,确保硬件能正常工作后将secondarystagebootloader拷贝到内存(RAM)开始执行。Secondarystagebootloader会进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式。比如说大家所熟知的通过电源键和其它一些按键的组合,可以进入到recovery,fastboot或者选择启动模式的启动界面等。我们在论坛上看到的bootloader通常指的就是secondarystagebootloader。不过我们不需要关心太多的细节,可以简单的理解为bootloader就是一段启动代码,根据用户按键有选择的进入某种启动模式。

fastboot模式:

fastboot是android定义的一种简单的刷机协议,用户可以通过fastboot命令行工具来进行刷机。比如说fastbootflashbootboot.img这个命令就是把boot.img的内容刷写到boot分区中。一般的手机厂商不直接提供fastboot模式刷机,而是为了显示他们的牛B之处,总是会提供自己专有的刷机工具和刷机方法。比如说三星的Odin,摩托的RSD,华为的粉屏等等。但是其本质实际上是相同的,都是将软件直接flash到各个分区中。目前的机型在fast模式刷机前加了一个bl锁的机制。没有解锁bl的情况下是无法fast模式刷机的.

recovery模式:

当进入recovery模式时,secondarystagebootloader从recovery分区开始启动,recovery分区是一个独立的Linux系统,当recovery分区上的Linux内核启动完毕后,开始执行第一个程序init(init程序是Linux系统所有程序的老祖宗)。init会启动一个叫做recovery的程序(recovery模式的名称也由此而来)。通过recovery程序,用户可以执行清除数据,安装刷机包等操作。一般的手机厂商都提供一个简单的recovery程序,而大名鼎鼎的CWMRecovery就是一个加入了很多增强功能的recovery程序,要想用上CWMRecovery前提是recovery分区可以被刷写。大家在论坛上看到的解锁bootloader,通常指的就是解锁recovery或fastboot,允许刷写recovery分区,这样大家就可以用上喜爱的第三方Recovery了。手机除了普通的CPU芯片以外,

MODEM基带分区

还有MODEM处理器芯片。该芯片的功能就是实现手机必需的通信功能,大家通常所的刷基带分区就是刷写modem分区。目前的机型有些刷机后进不去系统就与基带分区有关。

正常启动当我们只是按下电源键开机时,会进入正常启动模式。手机会从boot分区开始启动。Boot分区的格式是固定的,首先是一个头部,然后是Linux内核,最后是用作根文件系统的ramdisk。当Linux内核启动完毕后,就开始执行根文件系统中的init程序,init程序会读取启动脚本文件(init.rc和init.xxxx.rc)。

System分区基本架构

从上到下依次为:

核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电话,音乐等。应用层往下就是开发人员所接触的。

框架层这一层是Android系统的核心,它提供了整个Android系统运作的机制,像窗口管理,程序安装包管理,开发人员所接触的Activity,Service,broadcast等等。

JNI层:JNI层是Java程序和底层操作系统通信的一个机制,它使得Java代码可以调用C/C++代码来访问底层操作系统的API。

Dalvik虚拟机:Android开发使用Java语言,应用程序的Java代码会被编译成dalvik虚拟机字节码,这些字节码由dalvik虚拟机解释执行。
本地库:本地库一般是由C/C++语言所开发,直接编译成相应CPU的机器码,这其中包含标准C库,用以绘制图形的skia库,浏览器核心引擎webkit等。

从这张软件结构图来看,除了内核是放在boot分区外,其它层的代码都是在system分区中。下面结合这张图来介绍system分区的主要目录内容:

system/app:app目录下存放的是核心应用,也就是大家熟知的系统APP,这些系统自带的程序是不能简单的卸载的,要通过一些特殊的方式才能删除。如果是做rom固件。还要考虑去各种验证才可以顺利开机。

system/lib:lib目录下存放的是组成JNI层,Dalvik虚拟机,本地库,HAL层和厂家适配层的所有动态链接库(.so文件)。

system/framework:该目录下存放的是框架层的JAR包,其中对MIUI移植来说有3个最重要的JAR包(framework.jar,android.policy.jar,services.jar)。

system/fonts:该目录下存放的是系统缺省的字体文件。

system/media:该目录下存放的是系统所使用的各种媒体文件,比如说开机音乐,动画,壁纸文件等。不同的手机该目录的组织方式可能不一样。如何修改这些文件请参考网上对应机型形形色色的教程,这里不再赘叙。

system/bin:该目录下存放的是一些可执行文件,基本上是由C/C++编写的。其中有一个重要的命令叫app_process.

system/xbin:该目录下存放的是一些扩展的可执行文件,既该目录可以为空。大家常用的busybox就放在该目录下。Busybox所建立的各种符号链接命令都是放在该目录。system/build.prop:build.prop和上节说得根文件系统中的default.prop文件格式一样,都称为属性配置文件。它们都定义了一些属性值,代码可以读取或者修改这些属性值。属性值有一些命名规范:ro开头的表示只读属性,即这些属性的值代码是无法修改的。persist开头的表示这些属性值会保存在文件中,这样重新启动之后这些值还保留。其它的属性一般以所属的类别开头,这些属性是可读可写的,但是对它们的修改重启之后不会保留。

system/etc:该目录存放一些配置文件,和属性配置文件不一样,这下面的配置文件可能稍微没那么的有规律。一般来说,一些脚本程序,还有大家所熟悉GPS配置文件(gps.conf)和APN配置文件(apns-conf.xml)放在这个目录。像HTC将相机特效所使用的一些文件也放在这个目录下。

data和和和和cache 简单的介绍一下data和cache分区。当我们开机进入桌面程序后,一般来说我们都会下载安装一些APP,这些APP都安装在data/app目录下。所有的Android程序生成的数据基本上都保存在data/data目录下。wipedata实质上就是格式化data分区,这样我们安装的所有APP和程序数据都丢失了。cache分区从名字上来看是用来缓存一些文件的,比如说一些音乐下载的临时文件,或者下载管理下载的内容基本上放在这个分区。

分区文件组成---smali目录

smali目录存放的是反编译后的Java代码,文件名以smali结尾,故称作smali文件。这些代码比一般的Java代码可读性差太多了,但是和传统的x86或者其他体系结构下的汇编文件那又是好读多了。虽然有工具可以直接把这些反汇编成java代码,但是好不了太多,我们还是直接读取修改smali文件。

文件中的以#开头的文字表示注释,以.开头的叫做annotations,其中的.line表示对应的源代码的行号,这个对调试很重要。.metho和.endmethod表示一个方法定义的开始和结束。Smali文件中的这些指令的功能请参照http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html,有过Java编程基础的很容易理解这些指令。

以上只是有些常见的机型分区名称和基本的含义。最新的机型中对有些分区做了调整。但变化不是太大。

关注我 了解安卓常识和一些故障的简单解决方法

更多推荐

web应用及微信小程序版本更新检测方案实践

背景:随着项目体量越来越大,用户群体越来越多,用户的声音也越来越明显;关于应用发版之后用户无感知,导致用户用的是仍然还是老版本功能,除非用户手动刷新,否则体验不到最新的功能;这样的体验非常不好,于是我们团队针对该问题给出了相应的解决方案来处理;技术栈:vue3+ts+vite+ant-design-vue1.web应用

视屏点播项目

项目背景大家应该在电脑上刷过视频吧,这个项目就是模拟一下我们刷视频的整个流程,我们要做的是一个类似B站的网页,这里面包含视频的上传修改和观看以及删除,注意我这个是一个简易版本的,在后面我会做一个升级,增加其他的功能.基本原理下面我们说一下我们项目的基本原理.我们这里做的是服务器客户端类型的项目.当客户端发起请求之后,我

PyTorch中的pyi檔案生成機制

PyTorch中的pyi檔案生成機制前言pyi檔由py生成pyi.in由pyi.in生成pyitorch/CMakeLists.txttools/pyi/gen_pyi.pygen_pyinative_functionsrand.names&rand.names_outrand.generator_with_names

Linux文件编程(lseek函数和stat函数)

文章目录前言一、lseek函数二、stat函数总结前言本篇文章来讲解lseek函数和stat函数,lseek函数主要用来设置文件偏移量,stat函数主要用来获取文件属性。一、lseek函数lseek函数用于在打开的文件中移动文件指针的位置。它可以用于设置文件的读写位置或查找特定位置的数据。函数原型如下:#include

Linux 系统下 CMake 示 例

CMake是一个开源的跨平台工具,可以构建、测试和打包软件。它具有如下特性:自动搜索可能需要的程序、库和头文件的能力;独立的构建目录(如build),可以安全清理;支持复杂的自定义命令(下载、生成各种文件);自定义配置可选组件;从简单的文本文件(CMakeLists.txt)自动生成工作区和项目的能力;在主流平台上自动

Linux之Shell进阶(变量和条件判定语句)

文章目录变量变量的含义变量的定义与使用(重点)只读变量接收用户输入删除变量条件判断语句变量变量的含义什么是量?量就是数据.什么是变量?数据可以发生改变就是变量。在一个脚本周期内,其值可以发生改变的量就是变量。什么叫做一个脚本周期?一个脚本周期我们可以简单的理解为当前的shell文件。变量是shell中不可或缺的一部分,

C#中的方法

引言在C#编程语言中,方法是一种封装了一系列可执行代码的重要构建块。通过方法,我们可以将代码逻辑进行模块化和复用,提高代码的可读性和可维护性。本文将深入探讨C#中的方法的定义、参数传递、返回值、重载、递归等方面的知识,并结合实际案例介绍方法的应用。方法的定义和调用:1.1方法是什么:方法是一个包含一组语句的代码块,用于

学习python和anaconda的经验

PYTHON1常用命令1.11.1注释Python注释多行的方法有以下三种:使用ctrl+/实现多行注释、在每一行的开头使用shift+#键、输入’‘’‘’'或者"“”“”",将要注释的代码插在中间1.2definit():函数区分两个函数:1.definit(self):这种形式在__init__方法中,只有一个se

【LeetCode-面试经典150题-day24】

目录35.搜索插入位置74.搜索二维矩阵162.寻找峰值33.搜索旋转排序数组35.搜索插入位置题意:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。【输入样例】nums=[1,3,5,6],target

Linux性能调优 —— 内存篇

Linux性能调优——内存篇Linux内存的工作原理内存映射的概念虚存空间分布内存分配与回收分配回收内存查看与分析查看内存使用情况命令:free命令:vmstat命令:top分析单个进程命令:ps-pLinux内存的工作原理内存映射的概念大多数计算机用的主存都是动态随机访问内存(DRAM),只有内核才可以直接访问物理内

Android ANR问题触发机制

1Anr类型​Anr一般有四种类型。1.1inputdispatchingtimeout​主要时按键或触摸屏事件在5s内没有响应。这个时间在ActivityManagerService中定义。C:\Users\wangjie\AppData\Local\Android\Sdk\sources\android-32\co

热文推荐