一定要对源码体系有足够的认知,才能对刷机有深刻的理解。现在只能概述了
最底层各种硬件设备略过不提
Bootloader:PC主板上一小段程序叫BIOS,主板加电跑起来的第一个程序,负责初始化硬件,OS启动,嵌入式设备里也有类似的程序,不叫BIOS,叫Bootloader。使用最广泛的是一个叫uboot的程序,编译后生成uboot.bin镜像,烧到特定分区,就可以作为Bootloader使用。
Bootloader支持交互式启动,也就是初始化硬件完成后,不是马上启动OS,而是停留在当前状态。等待用户输入命令告诉他接下来干什么,这种启动模式叫Fastboot模式。 adb reboot bootloader进入Fastboot模式。
进入Fastboot之前,先了解ROM结构。一个能够正常启动的ROM包含以下四个分区。
1. Bootloader,存放uboot.bin的分区
2. Bootloader用来保存环境变量的分区
3. Kernel,存放os内核的分区
4. Rootfs,存入系统第一个进程init对应的程序的分区
Fastboot模式下,可以通过另外一个工具fastboot来让设备执行指定的命令,对于刷机者来说,最常用的就是刷入各种镜像文件。例如,Kernel分区和Rootfs分区刷入指定的镜像。
android设备上,处于Fastboot模式时(就是烧写了Bootloader),我们可以把一个包含Kernel和Rootfs的Recovery.img镜像通过fastboot工具刷入到设备上一个叫Revovery的分区去,就是刷Recovery,属于刷ROM的一种,Recovery包含有Kerne和Rootfs,因此Recovery刷入设备后可以让设备正常的启动起来,这个启动方式叫Recovery模式 adb reboot recovery。
总结一下,Bootloader程序即uboot.bin启动完毕,进入Fastboot模式,用fastboot工具刷入Recovery.img镜像后,进入Recovery模式。
当设备处于Recovery模式时,我们可以做些什么呢?答案是取决于刷入的Recovery.img所包含的Rootfs所包含的程序。更确切地说,是取决于Rootfs镜像里面的init程序都做了些什么事情。不过顾名思义,Recovery就是用来恢复系统的意思,也包含有更新系统的意思。这里所说的系统,是用户正常使用的系统,里面包含有Android运行时框架,使得我们可以在上面安装和使用各种APP
用户正常使用Android设备时的系统,主要是包含有两个分区:System分区和Boot分区。System分区包含有Android运行时框架、系统APP以及预装的第三方APP等,而Boot分区包含有Kernel和Rootfs。刷入到System分区和Boot分区的两个镜像称为system.img和boot.img,我们通常将它们打包和压缩为一个zip文件,例如update.zip,并且将它上传到Android设备上的sdcard上去。这样当我们进入到Recovery模式时,就可以在Recovery界面上用我们之前上传到sdcard的zip包来更新用户正常使用Android设备时所用的系统了。这个过程就是通常所说的刷ROM了。
广义上的刷ROM,实际上包含更新Recovery(Kernel和Rootfs)和更新用户正常使用的系统两个意思;而狭义上的刷ROM,只是更新用户正常使用的那个系统。更新Recovery需要进入到Fastboot模式中,而更新用户正常使用的那个系统需要进入到Recovery模式中。Android设备在启动的过程中,在默认情况下,一旦Bootloader启动完成,就会直接启动用户正常使用的那个系统,而不会进入到Recovery模式,或者停留在Bootloader中,也就是停留在Fastboot模式中。只有通过特定的命令,例如adb reboot recovery和adb reboot bootloader,或者特定的按键,例如在设备启动过程中同时按住音量减小键和电源开关键,才能让设备进入到Recovery模式或者Fastboot模式中。
一个完整的刷Rom过程有两个步骤
- 进入FastBoot模式,输入recovery.img镜像
- 进入Recovery模式,刷入包含system.img和boot.img镜像的zip包
注意:system.img和boot.img在Fastboot模式下也可以刷入,只不过Recovery模式更友好一些,这里需要提到一个Bootloader锁的概念,在锁定Bootloader的情况下,无法刷入非官方的recovery.img,system.img,boot.img镜像。这是跟厂商的Bootloader有相关的。可以通过一定的算法(例如签名)来验证要刷入的镜像是否是官方发布的。在这种情况下必须对Booloader解锁,才可以刷入非官方的镜像。
所谓定制自己的系统,就是自己制作recovery.img和system.img,boot.img。
从aosp源码中编译出能在自己使用的手机上运行的系统,并非易事,好在有很多基于aosp第三方开源项目,最著名的就是CyanogenMod,简称CM,MIUI,锤子 ,一加 ,都是基于CM开发的。
以上就是刷机概念和过程,至于原理。
打好源码底子再来补充
fastboot 解锁
开发者选项中的oem unlocking打开
adb reboot bootloader
fastboot flashing unlock
按音量上键adb
fastboot reboot
adb disable-verity
adb reboot
adb root
adb remount
替换boot.img
A: 先将整个版本烧写到手机,烧写完后启动手机进入开发者模式查看OEM是否已解锁(必须解锁,不然替换boot.img会失败)
B:烧写boot.img
(1): 将boot.img放到电脑上(比如D盘),启动DOS终端,进入D盘(要和boot.img同目录)
(2): 手机连接电脑,在DOS端输入:adb reboot bootloader 进入fastboot模式
(3): 等待手机进入fastboot模式后输入:fastboot flash boot boot.img
(4): 等待烧写完成后输入fastboot reboot重启手机
fastboot刷机
- 先执行: adb reboot-bootloader 进入 fastboot模式
- fastboot flash system system. img
- fastboot flash dtbo dtbo.img
- fastboot flash vendor vendor.i
- fastboot flash userdata userdata.img
- fastboot flash boot boot.img
- fastboot reboot
- fastboot flash system system.img && fastboot flash vendor 8. vendor.img && fastboot flash userdata userdata.img && fastboot flash boot boot.img && fastboot reboot
- data_collect: update data collect app source
- this updatedata collect app and add faceDataCollect upload app source code
- fastboot flash system system.img && fastboot reboot
编译模块
./mk_android.sh -t userdebug -i bootimage -j 32
./mk_android.sh -t userdebug -i dtboimage -j 32
开机流程
android开机启动流程
- 手机开机后,引导芯片启动,引导芯片开始从固化再rom里的预设代码执行,加载引导程序到ram,bootloader检查ram,初始化硬件参数等功能。
- 硬件参数初始化完成后,进入到kernel层,kernel层主要加载一些硬件设备驱动,初始化进程管理等操作,再kernerl中首先启动swapper进程(pid=0),用于初始化进程管理,内存管理,加载Driver等操作,再启动kthread进程(pid=2),这些linux系统的内核进程,kthread是所有内核进程的鼻祖。
- Kernel加载完毕后,硬件设备驱动与hal层交互,初始化进程管理等操作会启动init进程,这些在native中
- init进程pid=1,init是所有进程的吧izhu,第一个启动,启动后,会启动adbd,logd等用户守护进程,并且会启动servicemanager(binder服务管家)等重要服务,同时孵化出zygote进程,c++ framework,
- zygote进程是有init进程解析init.rc文件后for生成,他会加载虚拟机,启动system server,(zygote 孵化的第一个进程)System server负责启动和管理整个java framework,包含activitymanager,windowmanager,packagemanager,powermanager等服务
- zygote同时会启动app进程,启动的第一个进程是launcher,然后启动email,sms等进程,所有的app都是zygote fork生成。
概述:Loader > Kernel > Native > Framework > Application
细分:BootRom > Bootloader > Kernel > Init > Zygote > SystemServer > Launcher
未完待续。。。。。