博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android构建boot.img(一):root目录与ramdisk.img的生成
阅读量:1991 次
发布时间:2019-04-27

本文共 2414 字,大约阅读时间需要 8 分钟。

以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的生成,

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

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的。

转载地址:http://kkavf.baihongyu.com/

你可能感兴趣的文章
请停止学习框架
查看>>
考研比惨五大专业排行榜,第一名没人不服!
查看>>
没钱没公司,怎么做一款付费产品
查看>>
Python 3.8 新特性来袭
查看>>
老程序员“被嫌弃”
查看>>
神器:公众号如何从第一篇文章开始看
查看>>
查询亿级数据毫秒级返回!Elasticsearch 是如何做到的?
查看>>
FastAPI 构建 API 服务,究竟有多快?
查看>>
为什么Quora选择用Python语言?
查看>>
一劳永逸学编程的方法
查看>>
终于来了!Python 编辑神器 Jupyter ,推出首款官方可视化 Debug 工具!
查看>>
代码整洁之道-编写 Pythonic 代码
查看>>
100行python代码,轻松完成贪吃蛇小游戏
查看>>
破解百度网盘的Pandownload开发者被捕,让人唏嘘
查看>>
如何科学的刷 Leetcode
查看>>
雷军 1994 年写的代码,经典老古董~
查看>>
越老越值钱的数据产品经理
查看>>
霸榜 GitHub:去你丫的算法!
查看>>
害,反爬之ID混淆 hashids 不了解下吗?
查看>>
墙裂推荐这个能打怪升级的Python项目
查看>>