android系统的分区结构

转载

ANTIBili_MC 关注

(一)Android的主要分区

Modem分区bootloader分区boot分区recoverty分区system分区data分区1. modem分区

a) 实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区,在所有适配的ROM中这部分是不动,否则会造成通话不稳定;

2. bootloader分区

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

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

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

3. boot分区

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

android内核挂载/nfsroot/androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:

1)设置一些环境变量

2)创建system、sdcard、data、cache等目录

3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals

4)设置一些文件的用户群组、权限

5)设置一些线程参数

6)设置TCP缓存大小

根文件系统中有一个重要的配置文件,叫default.prop,该文件的内容一般为:

#

#ADDITIONAL_DEFAULT_PROPERTIES

#

ro.secure=1

ro.allow.mock.location=1

ro.debuggable=0

persist.service.adb.enable=1。

文件中的每一行对某个属性赋值,大家需要注意的两个属性:ro.secure和ro.debuggable。如果ro.secure=0允许我们运行adbroot命令。在下一篇我们会详细介绍adb,这是我们做ROM移植的利器。通常大家说得内核ROOT指的就是ro.secure=0。ROOT权限只是的手机上有一个名为授权管理的程序(Superuser.apk)可以授予程序root用户的权限。ro.deguggable=1允许调试系统APP。

init程序读取启动脚本,执行脚本中指定的动作和命令,脚本中的一部分是运行system分区的程序

4. recovery分区

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

5.system分区

我们把这张android的图贴在这里,除下面的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),都是放在这。像是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将相机特效所使用的一些文件也放在这个目录下。

6. 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 这个字串。

7、映像文件打包方式

system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证:

file ramdisk.img

输出:ramdisk.img: gzip compressed data, from Unix, last modified: Wed Mar 18 17:16:10 2009

Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:

将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

gunzip ramdisk.img.gz

然后新建一个文件夹,叫ramdisk吧,进入,输入命令

cpio -i -F ../ramdisk.img

这下,你就能看见并操作ramdisk里面的内容了。

然后把Android源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。

1. oem分区是为全球定制功能而增设的一个分区,里面增加了对应不同国家的各种配置参数,如某些功能开关,有些区域要求打开,其它的则要求关闭,此时就需要用到oem.img,否则就需要出两个版本;

2. systeminfo是专门为了添加system分区检查而设立的分区,system分区检查是指检查system分区的资源是否被更改,比如apk被删减或者某些权限被更改,目的是为了防止system被更改导致手机被监控。而systeminfo分区存放一个check.bin文件,此文件里面存储所有system文件和其对应的sha1值。

3. persist分区是用于保存FRP(factory reset protcect)功能用到帐号、密码等受保护的信息,避免在恢复出厂设置后被清空。 什么是Persist分区:

Persist分区是系统的一个ext4分区,由于我们的线刷包都不包含这个分区,所以你需要自己动手修复,这个分区内包含DRM相关文件、传感器注册表、你的wifi、蓝牙、mac地址都在这里了。

一般解锁手机都要强制禁止访问PERSIST分区中的账号信息,因此需要配合修改版的系统,让系统不读取账号信息也能工作(原生安卓表示你们都是渣渣)

android 6.0 oem分区,android系统的分区结构相关推荐

  1. 华为内测基于Android 10.0的EMUI 10系统;2019年Q1真无线耳机市场份额,苹果占半壁江山……...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  2. 一加3t氢android8_一加3t氢android8_一加氢OS推出Android 8.0正式版 新系统流畅到飞起...

    原标题:一加氢OS推出Android 8.0正式版 新系统流畅到飞起 一加手机早在去年万圣节就在一加3和3T上开始公测基于Android 8.0的氢系统了,但奈何当时由于国内大部分软件都不兼容而导致迟 ...

  3. 一加3t氢android8_一加氢OS推出Android 8.0正式版 新系统流畅到飞起

    原标题:一加氢OS推出Android 8.0正式版 新系统流畅到飞起 一加手机早在去年万圣节就在一加3和3T上开始公测基于Android 8.0的氢系统了,但奈何当时由于国内大部分软件都不兼容而导致迟 ...

  4. android AVB2.0(六)Super动态分区介绍

    文章目录 一.Super分区是什么? 二.Super分区工作原理 三.Super分区的配置和编译 1.分区表的配置 2. Super镜像的编译 2.1 Super镜像的编译日志 2.2 Super镜像 ...

  5. Android 4.0按键事件以及系统流程分析

    Android 4.0中按键的处理流程 按键在Android系统中,有着不同的代表意义.以前的全键盘的手机代码没有阅读过,所以也不是很了解.本人介绍的是在触摸屏的手机上的按键消息的处理流程. 在现在触 ...

  6. android 7.0开机脚本,Android 7.0系统的手机无法执行appium脚本的问题:PS 'uiautomator'...

    报错: 解决: 解决办法 uiautomator1.0应该是不支持7.0,不升版本就换用uiautomator2.0吧,或者用下面的改脚本的方法使用. 解决Android 7.0系统的手机无法执行ap ...

  7. Android 5.0(Lollipop)事件输入系统(Input System)

    其实Android 5.0中事件输入子系统的框架和流程没有本质变化.Service端的实现在/frameworks/native/services/inputflinger/下(4.4中在/frame ...

  8. android 5.0 ios 8,Android 5.0和iOS8.1哪个好?安卓5.0与iOS8.1区别对比

    Android和iOS显然是目前最受欢迎的移动平台,也是最大的两个竞争者.在今年,谷歌和苹果都对各自的系统进行了更新,其中iOS8.1已经正式推送,相信各位苹果用户已经正在使用:而Android 5. ...

  9. android 7.0 禁止 imei,Android一些适配

    # Android 版本适配重点 其他细节请查看官网对应版本:https://developer.android.com/preview ## 7.0 1. 后台优化 - 移除了以下静态注册广播通知( ...

  10. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

最新文章

  1. 求最大值_Excel求最大值地球人都知道,那要求出第2、第3、第N大值呢?
  2. workflow4.0学习资料
  3. 一个表单同时向两个页面传值
  4. 无线 在linux叫什么地方,请问有知道atheros无线网卡Linux驱动官方下载地址是什么吗?...
  5. 旅游网站的主页代码_影响外贸网站seo排名的因素有哪些?
  6. TranslateAnimation类:位置变化动画类
  7. PCA算法的原理C++ Eigen库实现(附源码下载)
  8. Atitit hadoop使用总结 目录 1.1. 下载300m ,解压后800M 1 1.2. 二:需要的jar包 1 2. Demo code 2 2.1. WCMapper 2 2.2. WC
  9. Linux中ctrl+z 和trl+c的区别以及jobs、bg、fg命令
  10. 全网最全leafLetAPI中文版
  11. Error running ...: No jdk for module
  12. java练习题-猜数字游戏
  13. Adaptive Object Detection Using Adjacency and Zoom Prediction
  14. 仙人掌圆方树学习笔记
  15. 全基因组组装,注释与评估软件
  16. 操作系统C语言模拟内存分配算法的模拟实现
  17. Android PackageManagerService分析一:PMS的启动
  18. Git 必知必会《上》
  19. 大厂程序员能力修炼手册,从筑基到化神要多久?
  20. Java中接口的理解和使用

热门文章

  1. 【Unity】【Odin Inspector】关于AOT Generation
  2. 透明背景flash html5,DW网页设计:添加透明背景的 Flash
  3. 局域网文件服务器带宽,高带宽局域网
  4. java 读取字符串文件_Java读取文件为字符串
  5. 逆向之汇编(堆栈平衡函数)
  6. word转pdf转换器2015注册码
  7. jdk工具keytool和jarsigner帮助(jdk keytooljarsigner tool manual)
  8. Linux深度学习框架安装
  9. Oracle的卸载步骤(详细图示)
  10. Duilib学习笔记(一)—— 环境搭建