一、引言
本章介绍Android的几个分区,已经编译后生成的.img镜像文件,对于大家移植整个Android有一定的帮助。本人也首次接触Android,有不正确的地方,欢迎指正!

二、Android的主要分区介绍
1、主要分区列表
Modem分区
bootloader分区
boot分区
recoverty分区
system分区
data分区
cache分区
misc分区
2、分区介绍
modem分区
实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区,在所有适配的ROM中这部分是不动,否则会造成通话不稳定;

bootloader分区
a) bootloader的primary bootloader部分,主要执行硬件检测,确保硬件能正常工作,然后将second bootloader拷贝到内存(RAM)开始执行。

b) Second bootloader会进行一些硬件初始化工作,获取内存大小信息等,然后根据用户的按键进入到某种启动模式。比如说大家所熟知的通过电源键和其它一些按键的组合,可以进入到recovery,fastboot或者选择启动模式的启动界面等。

fastboot模式:fastboot是android定义的一种简单的刷机协议,用户可以通过fastboot命令行工具来进行刷机。比如说fastboot flash boot boot.img这个命令就是把boot.img的内容刷写到boot分区中。一般的手机厂商不直接提供fastboot模式刷机,总是会提供自己专有的刷机工具和刷机方法。比如说三星的Odin,摩托的RSD,华为的粉屏等等。但是其本质实际上是相同的,都是将软件直接flash到各个分区中。这种通常称为线刷,是比较原始的方法。当手机处于开不了机的情况下,可以使用此厂家提供的工具进行刷入;

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

recoverty分区
recovery模式:recovery是android定义的一个标准刷机协议。当进入recovery模式时,second bootloader从recovery分区开始启动,recovery分区实际上是一个简单的Linux系统,当内核启动完毕后,开始执行第一个程序init(init程序是Linux系统所有程序的老祖宗)。init会启动一个叫做recovery的程序(recovery模式的名称也由此而来)。通过recovery程序,用户可以执行清除数据,安装刷机包等操作。一般的手机厂商都提供一个简单的recovery刷机,多只能进行upate的操作。不能进行卡刷;如果想要自已卡刷,则需要事先刷入第三方的Recovery,然后选择刷机包。

system分区
除linux Kernel部分位于boot分区外,在其上的Library、runtime、framework、core application都是处于system分区
0、/system/priv-app

特权App,比system_app权限还要高,其不仅System_app标识是true,同时还置了Priv-app标识。
1、/system/app
核心应用程序档(*.apk: Android应用程序包),都是放在这。像是Phone、Alarm Clock, Browser, Contacts 等等。

2、/system/framework
这里放 Android 系统的核心程序库,就是上图中application framework部分的库。像是core.jar, framework-res.apk, framework.jar等等。

3、system/lib
存放Library部分的库,存放的是所有动态链接库(.so文件),这些.SO是JNI层,Dalvik虚拟机,本地库,HAL层所需要的,因为系统应用/system/app下的apk是不会解压的SO到程序的目录下,所以其相应用的SO,都应放在/system/lib 下面。当一个系统apk的SO加载时,会从此目录下寻找对应用的SO文件;

4、/system/media/audio/(notification, alarms, ringtones, ui)
这里放系统的声音档,像是闹铃声,来电铃声等等。这些声音档,多是 ogg 格式。

5、/system/bin
存放的是一些可执行文件,基本上是由C/C++编写的。其中有一个重要的命令叫app_process。一般大家称之为Zygote。(Zygote是卵的意思,所有的Android进程都是由它生出来的)。Zygote首先会加载dalvik虚拟机,然后产生一个叫做system_server的进程。system_server顾名思义被称作Android的系统服务程序,它主要管理整个android系统。system_server启动完成后开始寻找一个叫做启动器的程序,找到之后由zygote开始启动执行启动器,这就是我们常见到的桌面程序。

6、system/xbin
存放的是一些扩展的可执行文件,既该目录可以为空。大家常用的busybox就放在该目录下。Busybox所建立的各种符号链接命令都是放在该目录。

7、system/build.prop
build.prop和上节说得根文件系统中的default.prop文件格式一样,都称为属性配置文件。它们都定义了一些属性值,代码可以读取或者修改这些属性值。属性值有一些命名规范:
  ro开头的表示只读属性,即这些属性的值代码是无法修改的。
  persist开头的表示这些属性值会保存在文件中,这样重新启动之后这些值还保留。
  其它的属性一般以所属的类别开头,这些属性是可读可写的,但是对它们的修改重启之后不会保留。

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

data分区
当我们开机进入桌面程序后,一般来说我们都会下载安装一些APP,这些APP都安装在data/app目录下。所有的Android程序生成的数据基本上都保存在data/data目录下。wipedata实质上就是格式化data分区,这样我们安装的所有APP和程序数据就都丢失了。
1、/data/app
放的是使用者自己安装的应用程式执行档(*.apk)。

2、/data/data/
当你在程式中用Context.openFileOutput() 所建立的档案,都放在这个目录下的files 子目录内。而用Context.getSharedPreferences() 所建立的preferences 档(*.xml) ,则是放在shared_pref 这个子目录中。

3、/data/anr/traces.txt
当你的应用程式发生ANR (Application is Not Responding) 错误时,Android 会自动将问题点的code stack list 写在这个档案内,你直接用cat 命令就可以看他的内容。

4、/data/system/dropbox/***.txt
主要是系统内apk发生crash时写的日志文件,主要有system_app_crash、data_app_crash等日志。

5、/data/location/gps
是给GPS location provider 用的。其中的 properties 档案的内容如下:

6、/data/system/location/location.gps
一般文字档。主要是记录最后的经纬度座标。 LocationManager.getLastKnownLocation() 就在来这抓值的。

7、/data/property/persist.sys.timezone
这个档案也是个一般文字档。主要是记录目前系统所使用的时区。在我的模拟器上,他记录着Asia/Taipei 这个字串。

cache分区
此分区是安卓系统缓存区,他保存系统最常访问的数据和应用程序。擦除这个分区,不会影响个人数据,只是删除了这个分区中已经保存的缓存内容,缓存内容会在后续手机使用过程中重新自动生成。

misc分区
misc分区中有Bootloader Control Block(BCB),主要是用于存放Recovery引导信息。

三、编译后生成的img文件介绍
在编译android 之后,会生成几个image 文件, 这些文件是:

1.、ramdisk.img : 一个分区镜像文件,它会在kernel 启动的时候,以只读的方式被 mount , 这个文件中只是包含了 /init 以及一些配置文件,这个ramdisk 被用来调用init,以及把真正的root file system mount 起来。

2、system.img:是包含了整个系统,android 的framework,application 等等,会被挂接到 “/” 上,包含了系统中所有的二进制文件

3、userdata.img: 将会被挂接到 /data 下,包含了所有应用相关的配置文件,以及用户相关的数据 。

4、boot.img:
包括 boot header,kernel, ramdisk
boot镜像不是普通意义上的文件系统,而是一种特殊的Android定制格式,由文件头信息boot header,压缩的内核,文件系统数据ramdisk以及second stage loader(可选)组成,它们之间非页面对齐部分用0填充

5、update.img:
将所有的img文件,通过指定打包工具,制作update.img,批量生产中常用到此镜像文件

四、烧写过程
1、 Android系统的移植过程与移植linux很像
先移植bootloader,再移植linux内核,最后烧写文件系统,只是最后烧写文件系统的时候用system.img就行了。
流程:
bootloader.img -> boot.img -> system.img

Android 在启动的时候,会由 UBOOT 传入一个 init 参数,这个init 参数指定了开机的时候第一个运行的程序,默认就是 init 程序,这个程序在 ramdisk.img中。可以分析一下它的代码,看看在其中到底做了一些什么样的初始化任务,它的源文件在system/core/init/init.c 中。它会调用到 init.rc初始化文件,这个文件在 out/target/product/generic/root 下,我们在启动以后,会发现根目录是只读属性的,而且 sdcard 的 owner 是system,就是在这个文件中做了些手脚,可以将它改过来,实现根目录的可读写。
通过分析这几个文件,还可以发现,android 启动时首先加载 ramdisk.img 镜像,并挂载到/目录下,并进行了一系列的初始化动作,包括创建各种需要的目录,初始化 console,开启服务等。 System.img是在 init.rc中指定一些脚本命令,通过 init.c 进行解析并挂载到根目录下的/system 目录下的。

Android系统的分区及img文件、移植烧写过程相关推荐

  1. Android内核开发:系统分区与镜像文件的烧写

    本文是<Android内核开发>系列的第五篇文章,本文重点介绍如何把编译输出的镜像文件烧写到Android设备中. 玩过刷机的朋友肯定对fastboot这个工具并不陌生,它是Android ...

  2. android frp分区,android系统的分区结构

    android系统的分区结构 转载 ANTIBili_MC 关注 (一)Android的主要分区 Modem分区bootloader分区boot分区recoverty分区system分区data分区1 ...

  3. android 手机分区失败怎么办,一种Android系统Data分区自修复方法及系统专利_专利查询 - 天眼查...

    1.一种Android系统Data分区自修复方法,其特征在于,包括: 步骤1: Android智能终端开机进入Android系统后,判断Data分区是否损坏,对Data分 区进行挂载,然后读取Data ...

  4. android 读build.prop,Android系统下的build.prop文件

    Android系统下的build.prop文件,用adb shell进入,再进入到system目录,查看该目录下的文件,会看到build.prop文件,用exit命令退出. 1551927518(1) ...

  5. xilinx Vivado的使用详细介绍(2):创建工程、添加文件、综合、实现、管脚约束、产生比特流文件、烧写程序、硬件验证

    xilinx Vivado的使用详细介绍(2):创建工程.添加文件.综合.实现.管脚约束.产生比特流文件.烧写程序.硬件验证 Author:zhangxianhe 新建工程 打开Vivado软件,直接 ...

  6. 米联客 ZYNQ/SOC 精品教程 S02-CH29 基于TCP的QSPI Flash bin文件网络烧写

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  7. Altera的FPGA用烧写器烧写POF文件,烧写成功,显示100%,但是逻辑做的点灯没亮,一般会是哪的问题呀?烧写sof,灯亮。

    Altera的FPGA用烧写器烧写POF文件,烧写成功,显示100%,但是逻辑做的点灯没亮,一般会是哪的问题呀?烧写sof,灯亮. 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markd ...

  8. 【Android 文件管理】分区存储 ( MediaStore 文件操作 )

    文章目录 一.动态权限申请 二.MediaStore 操作文件 三.完整代码示例 1.MainActivity 核心代码 2.build.gradle 构建脚本 3.清单文件 五.相关文档资料 特别注 ...

  9. Android 系统的分区

    1.modem分区,主要是手机短信的通讯模块: 2.bootloader分区,主要用于线刷: 3.recovery分区,只有用于普通刷机: 4.boot分区,用于启动: 5.system分区,系统分区 ...

最新文章

  1. 阿里二面:如何设计与实现短URL服务?
  2. Selenium自动化测试驱动下载
  3. Maximal Square 我们都在寻找最高1子矩阵(leeCode)
  4. 兄弟连区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令一
  5. 瞬间带你了解如何优化 Mysql 数据库,老板再也不担心客户投诉了
  6. 网络交换机功能和原理详解
  7. Keil出现 err:Cannot read project file异常;err:点击Project闪退
  8. SOLIDWORDS API修改零部件属性全部保存
  9. 太极软件qn的代码_多版本QQ内置qn、qx模块
  10. 图书借阅系统软件测试实验报告,C 大作业--图书管理系统-实验报告.doc
  11. SMARTDRV.EXE下载和安装说明
  12. Mysql中文排序规则
  13. 定义Employee类(1)该类包含:private成员变量name,sal,birthday,其中birthday为MyDate类的对象;(2)为每一个属性定义getter,setter方法
  14. 【论文翻译】Clustering by fast search and find of density peaks
  15. [BZOJ3772]精神污染(主席树)
  16. 01 数据库和MySQL简介
  17. apollo 阿波罗使用
  18. 你玩的英雄在比赛中发挥如何呢?
  19. 较新版本的git安装教程
  20. 解决虚拟机拼不通物理机的网络问题

热门文章

  1. win10 无线显示未连接到服务器,老司机详解win10系统未识别无线网络无法连接的方法介绍...
  2. 一个改版的猜数字游戏,超搞笑
  3. @Autowire与@Resource用法以及它们的区别
  4. 518抽奖软件源码之:主窗口上含对话框时如何最小化
  5. 【Myeclipse】导入javaweb项目 No projects are found to import
  6. JavaScript 中检查数组是否包含值的 5 种方法
  7. 详解qtopia4.4.3移植到mips处理器以及相关问题总结
  8. Flash Builder4.7 更新Air SDK及FlashPlayer
  9. Python大整数的小数次方的计算(Decimal使用)
  10. crontab 问号_crontab详解