全面认识Android手机 (MIUI ROM适配之旅第一天——认识Android手机 )

本文详细介绍了Android手机的刷机过程,涉及bootloader、recovery、system分区等关键概念,包括它们的作用和刷机的基本原理,对于想深入了解Android技术的读者极具价值。
摘要由CSDN通过智能技术生成

**

MIUI ROM适配之旅第一天——认识Android手机**

写这篇文章时想起我的第一部Android手机HTC Hero。买回来后,同事告诉我可以去刷机玩玩。刷机,怎么刷?同事说,你个土人,刷机都不知道,很多刷机论坛的,你去逛逛,挺简单的。我去逛了逛机锋论坛(那时还不知道MIUI),打开一看,什么recovery, radio, root各种词汇扑面而来,oh my lady gaga,这么复杂。但是为了不被鄙视,而且闲着也是闲着,还是刷着玩玩吧。后来就结识MIUI来到了小米。这是题外话,咱们言归正传。

在这纷纷扰扰的Android世界里,如何找到那条刷机大道呢,或许它只是个传说,我们只是一直在探索。让我们从零开始来看一看,看能发现点什么。

1. bootloader

当我们拿到一款手机,第一件事应该就是按下电源键开机,那么从开机到进入到桌面程序这中间发生了些什么呢,我们从下面这张简化了的手机结构图开始:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:该结构图并不反映手机的实际分区顺序和位置,只是一个逻辑结构图。

大家可以简单的把手机的ROM存储类比为我们电脑上的硬盘,这个硬盘被分成了几个分区:bootloader分区,boot分区,system分区等等。后面我们会逐渐介绍各个分区的用途。所谓的刷机我们可以简单的理解成把软件安装在手机的某些分区中,类似于我们在电脑上安装Windows系统。

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

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

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

手机除了普通的CPU芯片以外,还有MODEM处理器芯片。该芯片的功能就是实现手机必需的通信功能,大家通常所的刷RADIO就是刷写modem分区。

2. 正常启动

当我们只是按下电源键开机时,会进入正常启动模式。Secondary stage bootloader会从boot分区开始启动。Boot分区的格式是固定的,首先是一个头部,然后是Linux内核,最后是用作根文件系统的ramdisk。

一般针对每个机型的完整刷机包中会有一个boot.img文件,这就是boot分区镜像文件。如何编辑该镜像文件可以参照这篇文章http://android-dls.com/wiki/inde … Re-Pack_Boot_Images。

当Linux内核启动完毕后,就开始执行根文件系统中的init程序,init程序会读取启动脚本文件(init.rc和init.xxxx.rc)。启动脚本文件的格式大家可以在网上找到很多参考资料,这里就不写了,而且我们在原厂ROM上移植MIUI的原则是不修改boot分区,因为有一些机型无法修改boot分区。

根文件系统中有一个重要的配置文件,叫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允许我们运行adb root命令。在下一篇我们会详细介绍adb,这是我们做ROM移植的利器。通常大家说得内核ROOT指的就是ro.secure=0。ROOT权限只是的手机上有一个名为授权管理的程序(Superuser.apk)可以授予程序root用户的权限。ro.deguggable=1允许调试系统APP。

init程序读取启动脚本,执行脚本中指定的动作和命令,脚本中的一部分是运行system分区的程序,下一节我们就来看看system分区的结构。

3. system分区

在讲system分区之前,我们先来看下面这张Android的软件系统架构图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上到下依次为:

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

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

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

Dalvik虚拟机:Android开发使用Java语言,应用程序的Java代码会被编译成dalvik虚拟机字节码,这些字节码由dalvik虚拟机解释执行。

本地库:本地库一般是由C/C++语言所开发,直接编译成相应CPU的机器码,这其中包含标准C库,用以绘制图形的skia库,浏览器核心引擎webkit等。

HAL:硬件抽象层,为了和各个厂家的不同硬件工作,Android定义了一套硬件接口,比如说为了使用相机,厂家的相机驱动必须提供的接口方法。这样使得上层的代码可以独立于不同的硬件运行。

厂家适配层:本来Android定义的HAL层是直接和厂家提供的设备驱动打交道的,但是目前厂家不想开源HAL部分的代码,因此很多厂家都提供了一个我称之为厂家适配层的代码,这样在HAL层接口的实现只是一个简单的对厂家适配层接口函数的调用。

内核:这一层就是大家熟悉的Linux内核,内核中包含有各种硬件驱动,这些驱动不同的手机厂商不同的手机是不一样的。Linux内核是支持驱动模块化机制的,简单的说就是允许用户动态的加载或者卸载某个硬件驱动,但是目前来看,手机厂商除了提供WIFI驱动单独加载外,其它驱动都是和内核绑定在一起的。

从这张软件结构图来看,除了内核是放在boot分区外,其它层的代码都是在system分区中。

下面结合这张图来介绍system分区的主要目录内容:

system/app: app目录下存放的是核心应用,也就是大家熟知的系统APP,这些系统自带的程序是不能简单的卸载的,要通过一些特殊的方式才能删除(大家熟悉的一种方法是用RE文件管理器)。

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

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

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值