以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)

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

1 $(copy_to) : $(TARGET_OUT)/% : $(LOCAL_PATH)/% | $(ACP)
2
3 $(transform-prebuilt-to-target)

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

给copy_from添加前缀的原因。

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

ALL_PREBUILT += $(copy_to)

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

1 #build/core/Makefile
2
3 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

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

1 $(file) : $(LOCAL_PATH)/% | $(ACP)
2
3 $(transform-prebuilt-to-target)

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

1 ALL_PREBUILT +=$(file)
2
3 $(INSTALLED_RAMDISK_TARGET):$(file)

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

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

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

1 INSTALLED_RAMDISK_TARGET=$(BUILT_RAMDISK_TARGET)
2
3 $(INSTALLED_RAMDISK_TARGET):$(MKBOOTFS $(INTERNAL_RAMDISK_FILES | $(MINIGZIP)
4
5 $(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的。


更多相关文章

  1. 《第一行代码 Android(安卓)》学习记录(一)
  2. Android(安卓)Studio debug.keystore位置介绍
  3. 对Android(安卓)Studio 中Android(安卓)类型的目录结构的解析
  4. 正则表达式pcre在Android下的移植
  5. 【边做项目边学Android】小白会遇到的问题--创建Android项目不自
  6. (转)android中的ellipsize
  7. 新书内容连载(1):自定义Android组件之带图像的TextView
  8. Android使用fitsSystemWindows属性实现–状态栏【status_bar】各
  9. Android(安卓)SDK目录及版本号区别

随机推荐

  1. 这个查询能用变量写出来吗?
  2. mysql创建任务事件
  3. 通向SQLServer安全级别3的楼梯:主体和安全
  4. mysql 千万级的 count统计对比
  5. 【安全牛学习笔记】MsSQL高级注入
  6. 数据库对象的创建和管理
  7. centos65安装简测mysql cluster 7.3.7
  8. [z]如何在一台windows主机上搭建mysql主
  9. MySQL免安装配置(亲测过,请放心借鉴)
  10. SQL Server 2005 所允许的 SQL 语句的最