Android构建boot.img(一):root目录与ramdisk.img的生成
以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的生成相关推荐
- Android构建boot.img:root目录与ramdisk.img的生成
以TCC88XX为例,当在Android顶层源码目录使用make编译完成后,会生成这样一个目录: out/target/product/tcc8800,该目录内部有我们需要的boot.img和syst ...
- Android构建boot.img(二):kernel的拷贝与打包
上文已经对boot.img其中组成部分之一ramdisk.img做了分析,boot.img另外一个重要的组成部分就是kernel了, 这里所说的kernel,可以只理解为位于out/target/pr ...
- 【Android:构建相机应用】
[Android:构建相机应用] 文章目录 [Android:构建相机应用] 一.检测和访问相机 - 创建用于检查设备是否配有相机和请求访问权限的代码. 二.访问相机 三.检查相机功能 四. 创建预览 ...
- Magisk root 原理分析之二 :Android Verified Boot (AVB)
1. Android Verified Boot (AVB) 或称 Verified Boot 2.0 简介 官方解释:验证用户设备上运行的软件完整性.它通常从设备固件的只读部分开始,该部分加载代码并 ...
- AVB校验微观版本:android avb(Android Verified Boot)验证
前辈原文:https://blog.csdn.net/weixin_43836778/article/details/90400147 其实可能有人会说,怎么整这么多重复的,其实不是的.这是为了不断地 ...
- Android 8.0.0-r4源码目录结构详解
Android的移植按如下流程: (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. (2)正确挂载文件系统,确保内核启动参数和 android 源代码 syste ...
- Android编译及编译脚本、Android构建基础学习笔记
Android编译及编译脚本.Android构建基础学习笔记 Android编译及编译脚本 概述 Android.mk转换成Android.bp 例子(简单Android.mk文件转Android.b ...
- 关于Android 构建
在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...
- 如何修改root目录内容后打包
步骤: 1.修改root目录总的内容. 2.初始化开发环境:. build/envsetup.sh.............. 3.在camdroid目录下执行make. 然后就会生成新的ramdis ...
最新文章
- CentOS7的node.js安装
- 如何再造一个百度贴吧兼谈如何改造园子的团队
- IP Precedence DSCP、TOS
- 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】HAWQ数据仓库 使用之 gpfdist协议
- 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数...
- 一个ApplicationContext.xml的配置
- flash player for linux 64,64-bit linux下装什么adobe flash player
- CoffeeScript 学习笔记
- 什么叫AI优先?不如你看谷歌CEO的办公位在哪儿
- JSON与XML优缺点对比分析
- linux操作系统短进程优先调度算法,操作系统的常用的进程调度算法
- 爱荷华州立大学计算机科学,爱荷华州立计算机科学庆祝成立50周年
- python 冒号分隔_以冒号分隔的分析
- Swing 美化包-JTattoo
- ClickHouse Kafka引擎表 Application maximum poll interval ... leaving group
- 群晖NAS加AD域时提示用户名或密码错误,但域管理员帐号和密码是对的,并且在电脑上可以正常加域。
- vs2012 mvc3项目ObjectContext与DBContext
- JavaScript script标签同步异步加载过程
- 服务器trunk协议是什么,TRUNK端口汇聚技术原理和作用介绍
- 睡觉睡到自然醒,数钱数到手抽筋
热门文章
- python的turtle怎么设置rgb颜色_Python : turtle色彩控制实例详解
- bat循环执行带参数_dos命令exit图文教程,结束退出CMD.EXE程序或当前bat批处理脚本...
- java免安装版配置,Tomcat(免安装版)的安装与配置 配置成windows服务
- 拆分文件_Word按页拆分文件
- web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...
- 安卓自定义View进阶-Matrix Camera
- docker 镜像基本操作、镜像与容器常用指令
- 第五篇:Mysql的数据备份与恢复---------
- mach空串 php preg_PHP 优化详解
- plsql oracle服务端,PLSQL Developer + Oracle客户端简易安装方法