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(二):kernel的拷贝与打包
上文已经对boot.img其中组成部分之一ramdisk.img做了分析,boot.img另外一个重要的组成部分就是kernel了, 这里所说的kernel,可以只理解为位于out/target/pr ...
- Docker+Jenkins持续集成环境(5): android构建与apk发布
项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...
- Android系统分区理解及分区目录细解【转】
本文转载自:https://blog.csdn.net/u010001503/article/details/51853822 Android 通常有以下分区: System分区: 就是我们刷ROM的 ...
- 关于Android 构建
在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...
- Android 5.1.1 源码目录结构
点击打开链接 最近公司培训新同事,我负责整理一点关于android的基础知识,遥想当年,刚接触android,也是一头雾水, 啥都不懂,就是靠看文档和视频,对android有一个初步了解,然后就通过查 ...
- (转)Android 5.1.1 源码目录结构
转自:http://blog.csdn.net/tfslovexizi/article/details/51888458最近公司培训新同事,我负责整理一点关于android的基础知识,遥想当年,刚接触 ...
- eclipse中将项目发布到tomcat的root目录
在eclipse中,将项目直接部署在tomcat的root目录中,这样便可以直接ip:port访问项目: 项目右键->属性->web project settings
- Nginx虚拟目录alias和root目录
nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alia ...
- MyEclipse 开发 Web项目发布到 Tomcat 下的Root 目录
通常情况下,Web项目是发布到Tomcat下的webapps文件目录下的 . 例如:Web应用项目名称为:stock,则部署到tomcat后,是部署在tomcat/webapps/stock中,网址为 ...
随机推荐
- 【BZOJ】【1597】【USACO 2008 Mar】土地购买
DP/斜率优化 Orz Hzwer…… 想到排序了,但没想到其实可以将序列转化为x递增且y递减的序列……因为x是递增的,若y[i]>y[i-1]那么第i-1个就足够小……以至于可以在搞定第 i ...
- struct{0}二
一直以为 ]={};是把a的所有元素初始化为0,]={};是把a所有的元素初始化为1. 调试的时查看内存发现不是那么一回事,翻了一下<The C++ Programming Language&g ...
- js java正则表达式替换手机号4-7位为星*号
需求: 一个手机号13152461111,由于安全性,需要替换4-7位字符串为星号,为131****1111,那么有2中玩法,一种是前端隐藏,一种是后台隐藏. 1. 前台隐藏 <!DOCTYPE ...
- 停止使用循环 教你用underscore优雅的写代码
你一天(一周)内写了多少个循环了? var i; for(i = 0; i < someArray.length; i++) { var someThing = someArray[i]; ...
- mysql触发器使用实例
DELIMITER $$ USE `db`$$ DROP TRIGGER `member_walletinit_trigger`$$ CREATE TRIGGER `member_walletinit ...
- F.I.S本地环境的搭建教程
一.准备开发环境: 1.安装JRE 2.安装nodejs 最好是msi文件,比较省事. 3.(如果是PHP项目)安装php. 首先下载php(我的是5.5.15版本,win7 64位系统) zip,然 ...
- HDU 4493 Tutor(精度处理)
题目 #include<stdio.h> int main() { int t; double a,s; scanf("%d",&t); while(t--) ...
- SQL技术内幕-4 row_number() over( partition by XX order by XX)的用法(区别于group by 和order by)
partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指 ...
- 初学Ajax(二)
$.get()和$.post() .load()方法是局部方法,因为它需要一个包含元素的jQuery对象作为前缀.而$.get()和$.post()是全局方法,无须指定某个元素.对于用途而言,.loa ...
- lintcode:带环链表
带环链表 给定一个链表,判断它是否有环. 解题 定义两个指针p1 p2 p1每次向前走一步 p2每次向前走两步 当p2能赶上p1的时候说明有环 /** * Definition for ListNod ...