以TCC88XX为例,当在Android顶层源码目录使用make编译完成后,会生成这样一个目录:

out/target/product/tcc8800,该目录内部有我们需要的boot.img和system.img,boot.mg

使用kernel和out/target/product/tcc8800/root目录打包而成(广义的ramdisk),也就是说,

boot.img是由kernel和ramdisk.img生成得到,在本文中主要分析root目录和ramdisk.img的生成,

在Android编译框架中,把许多固定的、反复用到的目录路径定义为宏变量,而上述生成的目录

out/target/product/tcc8800的宏即为:PRODUCT_OUT

out/target/product/tcc8800/system的宏即为:TARGET_OUT

而out/target/product/tcc8800/root的宏即为:TARGET_ROOT_OUT,

out/target/product/tcc8800/root主要是由system/core/rootdir目录拷贝得到的,

为此我分析了system/core/rootdir目录中的Android.mk文件,具体情况是这样的:

copy_from := etc/dbus.conf   etc/hosts

copy_from += etc/vold.fstab

以上内容将需要拷贝的文件添加到copy_from变量中,以便后续处理。

拷贝到那里呢? 在看看copy_to的定义:

copy_to := $(addprefix $(TARGET_OUT)/,$(coby_from))

该语句即为copy_from中每个字符串片段添加一个TARGET_OUT前缀(即system),这样copy_to的

内容就很明了:

copy_to :=out/target/product/tcc8800/system/etc/dbus.conf ...之类,在此略掉。

之后,给copy_from添加路径前缀:

copy_from := $(addprefix $(LOCAL_PATH)/, $(copy_from)

之所以要添加前缀的原因是接下来马上要设置的拷贝语句:

$(copy_to) : $(TARGET_OUT)/% : $(LOCAL_PATH)/% | $(ACP)

$(stransform-prebuilt-to-target)

上述语句会让Android在构建img前,自动完成拷贝工作,其中使用到符号%进行匹配,这也是为什么要

给copy_from添加前缀的原因。

随后,脚本将copy_to变量添加进 ALL_PREBUILT全局宏中:

ALL_PREBUILT += $(copy_to)

最后,在build/core/Makefile中看到copy_to的内容被提取到了另外一个全局宏 ,具体如下:

#build/core/Makefile

INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%,$(ALL_PREBUILT) ......

由于上述4行内容设计到system.img的生成,在此不深究。

看来system/core/rootdir中的部分内容是拷贝到了out/target/product/tcc8800/system中的,并不是

完完全全拷贝到out/target/product/tcc8800/root目录中去的。

我们回头继续查看system/core/rootdir/Android.mk文件,该文件中剩下的内容才是与root密切相关的。

file := $(TARGET_ROOT_OUT)/init.rc

然后也是经典的拷贝设置:

$(file) : $(LOCAL_PATH)/% | $(ACP)

$(stransform-prebuilt-to-target)

接下来的脚本的内容是为生成boot.img而写的。

ALL_PREBUILT +=$(file)

$(INSTALLED_RAMDISK_TARGET):$(file)

看来原理也和上述system的拷贝相同,在build/core/Makefile中是由INTERNAL_RAMDISK_FILE提取的,

具体如下:INTERNAL_RAMDISK_FILES := $(filter $(TARGET_ROOT_OUT)/%, $(ALL_PREBUILT) ...

随后有一段很关键的句子直接道破了ramdisk.img的生成:

INSTALLED_RAMDISK_TARGET=$(BUILT_RAMDISK_TARGET)

$(INSTALLED_RAMDISK_TARGET):$(MKBOOTFS $(INTERNAL_RAMDISK_FILES | $(MINIGZIP)

$(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@

如此多的宏,让我们一一列出它们的值:

BUILT_RAMDISK_TARGET = $(PRODUCT_OUT/ramdisk.img 这是我们的目标

INSTALLED_RAMDISK_TARGET = BUILT_RAMDISK_TARGET 目标伪装了一下。

MKBOOTFS = mkbootfs 就是位于out/host/linux-x86/bin目录下的mkbootfs,这东西自然也有后话。

INTERNAL_RAMDISK_FILES = 所有TARGET_ROOT_OUT中的文件

由此可以看出root目录先被打包生成了ramdisk.img,然后才合并进boot.img的。

Android构建boot.img(一):root目录与ramdisk.img的生成相关推荐

  1. Android构建boot.img:root目录与ramdisk.img的生成

    以TCC88XX为例,当在Android顶层源码目录使用make编译完成后,会生成这样一个目录: out/target/product/tcc8800,该目录内部有我们需要的boot.img和syst ...

  2. Android构建boot.img(二):kernel的拷贝与打包

    上文已经对boot.img其中组成部分之一ramdisk.img做了分析,boot.img另外一个重要的组成部分就是kernel了, 这里所说的kernel,可以只理解为位于out/target/pr ...

  3. 【Android:构建相机应用】

    [Android:构建相机应用] 文章目录 [Android:构建相机应用] 一.检测和访问相机 - 创建用于检查设备是否配有相机和请求访问权限的代码. 二.访问相机 三.检查相机功能 四. 创建预览 ...

  4. Magisk root 原理分析之二 :Android Verified Boot (AVB)

    1. Android Verified Boot (AVB) 或称 Verified Boot 2.0 简介 官方解释:验证用户设备上运行的软件完整性.它通常从设备固件的只读部分开始,该部分加载代码并 ...

  5. AVB校验微观版本:android avb(Android Verified Boot)验证

    前辈原文:https://blog.csdn.net/weixin_43836778/article/details/90400147 其实可能有人会说,怎么整这么多重复的,其实不是的.这是为了不断地 ...

  6. Android 8.0.0-r4源码目录结构详解

    Android的移植按如下流程: (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. (2)正确挂载文件系统,确保内核启动参数和 android 源代码 syste ...

  7. Android编译及编译脚本、Android构建基础学习笔记

    Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...

  8. 关于Android 构建

    在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...

  9. 如何修改root目录内容后打包

    步骤: 1.修改root目录总的内容. 2.初始化开发环境:. build/envsetup.sh.............. 3.在camdroid目录下执行make. 然后就会生成新的ramdis ...

最新文章

  1. CentOS7的node.js安装
  2. 如何再造一个百度贴吧兼谈如何改造园子的团队
  3. IP Precedence DSCP、TOS
  4. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】HAWQ数据仓库 使用之 gpfdist协议
  5. 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数...
  6. 一个ApplicationContext.xml的配置
  7. flash player for linux 64,64-bit linux下装什么adobe flash player
  8. CoffeeScript 学习笔记
  9. 什么叫AI优先?不如你看谷歌CEO的办公位在哪儿
  10. JSON与XML优缺点对比分析
  11. linux操作系统短进程优先调度算法,操作系统的常用的进程调度算法
  12. 爱荷华州立大学计算机科学,爱荷华州立计算机科学庆祝成立50周年
  13. python 冒号分隔_以冒号分隔的分析
  14. Swing 美化包-JTattoo
  15. ClickHouse Kafka引擎表 Application maximum poll interval ... leaving group
  16. 群晖NAS加AD域时提示用户名或密码错误,但域管理员帐号和密码是对的,并且在电脑上可以正常加域。
  17. vs2012 mvc3项目ObjectContext与DBContext
  18. JavaScript script标签同步异步加载过程
  19. 服务器trunk协议是什么,TRUNK端口汇聚技术原理和作用介绍
  20. 睡觉睡到自然醒,数钱数到手抽筋

热门文章

  1. python的turtle怎么设置rgb颜色_Python : turtle色彩控制实例详解
  2. bat循环执行带参数_dos命令exit图文教程,结束退出CMD.EXE程序或当前bat批处理脚本...
  3. java免安装版配置,Tomcat(免安装版)的安装与配置 配置成windows服务
  4. 拆分文件_Word按页拆分文件
  5. web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...
  6. 安卓自定义View进阶-Matrix Camera
  7. docker 镜像基本操作、镜像与容器常用指令
  8. 第五篇:Mysql的数据备份与恢复---------
  9. mach空串 php preg_PHP 优化详解
  10. plsql oracle服务端,PLSQL Developer + Oracle客户端简易安装方法