本文是《Android内核开发》系列的第五篇文章,本文重点介绍如何把编译输出的镜像文件烧写到Android设备中。


玩过刷机的朋友肯定对fastboot这个工具并不陌生,它是Android SDK中提供的一种开发工具,支持通过USB线将手头的镜像文件更新/烧录到Android设备中,常用的fastboot烧录过程如下:


1
2
3
4
5
6
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash userdata userdata.img
fastboot flash cache cache.img
fastboot flash recovery recovery.img
fastboot reboot


这样,就把我们编译输出的镜像文件分别成功更新到Android设备指定的分区去了。


但是你知道它的原理是什么吗?


其实fastboot是Google定义的一种传输协议,它工作在Android设备与PC机两端,就像浏览器常用的HTTP协议一样,需要服务器/客户端同时支持该协议才能完成数据的传递。


Google提供了fastboot协议的定义和源码,需要设备厂商将代码移植到自己设备的bootloader中,并不是所有的Android设备都支持fastboot,因此,我们可能买到的有些开发板的并不支持fastboot,这就需要我们采用其他方式烧录,或者修改bootloader/u-boot源码,让其支持fastboot协议。


Google定义的fastboot协议地址:这里(需要翻墙)


由于AOSP官网被墙,因此我也把该协议定义文本拷贝了一份到我们Github中,地址如下:


https://github.com/Jhuster/AOSP/blob/master/documents/fastboot_protocol.txt


对于任何标准的Android设备而言,它都会对内部存储空间进行分区,不同的设备的分区大小都不一样,但通常都会有如下几个分区:


1
2
3
4
5
6
    /boot
    /system
    /recovery
    /data
    /cache
    /misc


各个分区分别对应着各个镜像文件在设备中实际的存储位置。下图所示,是ADP1/G1手机的系统分区划分:



由此我们知道了,其实fastboot命令执行的流程,就是根据命令参数,将新的镜像文件拷贝到指定分区的过程,其实并不复杂。


那么,不支持fastboot协议的设备一般是如何烧录Android镜像的呢?


其实上面也提到了,fastboot协议是工作在bootloader之中的,在没有fastboot出现之前,嵌入式系统的镜像烧写通过bootloader也是完全可以完成的,这里通过示例简单演示一下Linux内核烧写过程 。


通常在u-boot启动过程中,会有3秒的停留,在串口终端敲击回车中断u-boot启动内核的过程,这时就可以输入u-boot支持的各种命令与板子交互了,举例如下:


1
2
3
$ nand erase 0x100000 0x200000             //擦除掉nandflash指定位置区域的数据
$ tftp 0x80000000 uImage                   //通过tftp将内核下载到内存指定位置
$ nand write 0x80000000 0x100000 0x200000  //把内存中的内核烧写到nandflash指定的位置


同理,只要清楚存储空间的分区和地址,就能够通过u-boot完成镜像的烧写过程,当然,u-boot是怎么烧录到开发板的呢?这是通过JTAG工具烧写的,这里就不详细论述了。


当然,如果系统是从外接的SDCard启动就更简单了,只需要把SDCard连接到电脑上,覆盖对应分区里面的镜像文件就可以了。

Android内核开发:系统分区与镜像文件的烧写相关推荐

  1. 嵌入式文件系统镜像制作及烧写

    将rootfs和userdata两个目录分别制作为镜像文件进行烧写: 镜像文件对应文件系统类型的选择,采用: rootfs制作为rootfs.img镜像,采用的文件系统类型为cramfs,只读,用于保 ...

  2. 嵌入式linux烧录文件格式,嵌入式文件系统镜像制作及烧写

    将rootfs和userdata两个目录分别制作为镜像文件进行烧写: 镜像文件对应文件系统类型的选择,采用: rootfs制作为rootfs.img镜像,采用的文件系统类型为cramfs,只读,用于保 ...

  3. Android内核开发:系统编译输出的镜像文件

    本文是<Android内核开发>的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系 ...

  4. Android内核开发:学会分析系统的启动log

    本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统 ...

  5. Android内核开发:系统启动速度优化

    在学习新知识的过程中,我一直很推荐结合实战任务去学习,只有经历实战,才能加深对理论知识的理解.<Android内核开发>系列已经写了八篇了,本文就结合前面的内容,给大家布置一个实战任务:  ...

  6. Android内核开发:图解Android系统的启动过程

    本文是<Android内核开发>系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载.版本和分支介绍.编译和烧写等等,从本文起就要开始 ...

  7. Android内核开发:为什么刷机后系统第一次启动会很慢?

    转自:http://ticktick.blog.51cto.com/823160/1677216 在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都 ...

  8. Android内核开发:如何统计系统的启动时间

    转自:http://ticktick.blog.51cto.com/823160/1660996 本文是<Android内核开发>系列的第七篇文章,通过上一篇文章<Android内核 ...

  9. Android内核开发:从源码树中删除出厂的app应用

    本文是<Android内核开发>系列的第十一篇文章,本文重点介绍如何从Android源码中删除出厂的app应用. 上一篇文章中提到过,系统出厂的app应用,其实就是被安装到/system分 ...

最新文章

  1. 桑叶黑芝麻糊,从头到脚通补
  2. Windows7 最重要的70个技巧和窍门
  3. jquery获取radio选中值及遍历
  4. python没有运行_Python没有执行__init__
  5. Linux 大规模请求服务器连接数相关设置
  6. 如何在Scala中将Double转换为String?
  7. Google 作恶!99.9% 的 Android 手机 App 都在窃取隐私
  8. 4键电子手表说明书_飞猪II控制台简体中文说明书
  9. c mysql用户登录_SQL语句及5.7.2 mysql 用户管理 c_G
  10. MVC4网站发布到windows server 2003服务器
  11. 怎么在线制作gif动图?推荐一款gif表情包在线制作生成器
  12. canvas保存图片时,谷歌浏览器Chrome报错【解决方案】Not allowed to navigate top frame to data URL
  13. 吐血推荐|2万字总结Mac所有应用程序、软件工具和相关资料
  14. Unity 之自动化打包ipa
  15. Python 于 webgame 的应用
  16. 【Python】批量导出word文档中的图片、嵌入式文件
  17. 常见光纤连接头 ST、SC、FC、LC
  18. nacos启动报错 Unable to start embedded Tomcat 以及项目链接nacos报错 server is DOWN now, please try again later!
  19. powermill2020错误代码1603_max2020安装提示1603
  20. JAVA编写 飞翔的小鸟

热门文章

  1. java web 开发分层
  2. JAVA操作文件大全(一)
  3. 世界上最成熟、功能最全的加密库HELib
  4. JavaScript 键盘事件处理
  5. Javascript第三章创建数组的两种方式第一课
  6. Javascript变量的使用第三课
  7. py获取前端的参数_Python小工具系列(3)之参数检查
  8. c语言程序设计2试卷答案,《C语言程序设计》试卷2参考答案.doc
  9. ubuntu openssl_在Ubuntu下安装旧版seurat
  10. 【大数据】0002---MongoDB集群自动分离创建新集群