Android makefile编译流程(二)
★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★
在build/core/main.mk中找到第一个目标,其makefile树关系如下:
然后我们逐一分析这些目标。
===================================================================
一、构建files目标
其依赖关系树如下:
从图中可以看出,files依赖modules_to_install和INSTALLED_ANDROID_INFO_TXT_TARGET
后面在做更近一步的详细发分析。
===================================================================
二、构建systemimg伪目标
伪目标systemimg,输出system.img
其对应的makefile依赖关系树如下:
图中黄色部分为makefile程序入口,也就是敲击make命令时或者敲击make systemimage时,会构建systemimage伪目标。
systemimage伪目标输出的文件就是(PRODUCT_OUT)/system.img
从图中我们可以看出,systemimage伪目标依赖下面的4个变量:
(FULL_SYSTEMIMAGE_DEPS)
(INSTALLED_FILES_FILE)
(BUILD_IMAGE_SRCS)
(RECOVERY_FROM_BOOT_PATCH)
1、(FULL_SYSTEMIMAGE_DEPS) 目标
2、(INSTALLED_FILES_FILE)目标
3、(BUILD_IMAGE_SRCS)目标
4、(RECOVERY_FROM_BOOT_PATCH)目标
该目标输出我们很熟悉的recovery_from_boot.p文件,该文件是用于ota升级时候更新recovery分区。后面会进一步再介绍bsdiff、imgdiff的用法。
这里可以看出,system.img也会依赖(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET),也就意味着:
(1)当敲击make system命令时,在构建system.img之前,会先构建(INSTALLED_BOOTIMAGE_TARGET和(INSTALLED_RECOVERYIMAGE_TARGET)
(2)当linux kernel代码有修改时候,在手机版本更新boot.img的同时,理应也更新system.img。否则system.img中的recovery_from_boot.p还是老的 ,会导致OTA升级失败
===================================================================
三、构建bootimage/INSTALLED_BOOTIMAGE_TARGET目标
伪目标bootimage对应的输出为boot.img. 其依赖关系图如下
INSTALLED_BOOTIMAGE_TARGET
那么真正的Linux kernel又是怎样编译的呢,其对应的依赖关系图如下:
我们再来回想下树根的依赖关系
droid_targets: droidcore dist_files.PHONY: droidcore
droid是第一个目标,敲击make时候会构建,droid依赖droidcore和dist_file,dist_file为空,droidcore又依赖一堆的target:
droidcore: files \systemimage \$(INSTALLED_BOOTIMAGE_TARGET) \$(INSTALLED_RECOVERYIMAGE_TARGET) \$(INSTALLED_VBMETAIMAGE_TARGET) \$(INSTALLED_USERDATAIMAGE_TARGET) \$(INSTALLED_CACHEIMAGE_TARGET) \$(INSTALLED_BPTIMAGE_TARGET) \$(INSTALLED_VENDORIMAGE_TARGET) \$(INSTALLED_PRODUCTIMAGE_TARGET) \$(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \$(INSTALLED_FILES_FILE) \$(INSTALLED_FILES_FILE_VENDOR) \$(INSTALLED_FILES_FILE_PRODUCT) \$(INSTALLED_FILES_FILE_SYSTEMOTHER) \soong_docs
有没有发现,这里面没有bootloader或uboot的target,其实在上面剖析boot.img的编译时,已经看出来了,(INSTALLED_BOOTIMAGE_TARGET)依赖linuxkernel和bootloader. 所以当你敲击make bootimage时,事实上也会编译bootloader(uboot). 而在上一节我们知道,在你敲击make systemimage时候,也会构建(INSTALLED_BOOTIMAGE_TARGET),即:
make bootloader —产生uboot.img
make bootimage —产生boot.img、uboot.img
make systemimage ----产生system.img、boot.img、uboot.img
===================================================================
四、构建bootloader(uboot.img)
如上一节介绍,敲击make时、或敲击make systemimage、或敲击make bootimage、或敲击make bootloader,都会依赖bootloader变量.
bootloader目标不在main.mk中,在uboot根目录下的AndroidUboot.mk中(各个芯片厂家可能会不一样),当敲击了make命令后,makefile系统会先将所有的include文件load进来,然后再找到相关目标进行构建。也就意味着,AndroidUboot.mk需要被include到main.mk当中,才能识别到make bootloader命令。那么AndroidUboot.mk是如何被include到main.mk中的呢,其实还是蛮复杂蛮绕的,如下图所示:
===================================================================
五、构建recoveryimage/INSTALLED_RECOVERYIMAGE_TARGET
伪目标recoveryimage输出recovery.img,其依赖关系树如下:
$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) $(ADBD) \$(INSTALLED_RAMDISK_TARGET) \$(INSTALLED_BOOTIMAGE_TARGET) \$(INTERNAL_RECOVERYIMAGE_FILES) \$(recovery_initrc) $(recovery_sepolicy) $(recovery_kernel) \$(INSTALLED_2NDBOOTLOADER_TARGET) \$(recovery_build_props) $(recovery_resource_deps) \$(recovery_fstab) \$(RECOVERY_INSTALL_OTA_KEYS) \$(INSTALLED_VENDOR_DEFAULT_PROP_TARGET) \$(BOARD_RECOVERY_KERNEL_MODULES) \$(DEPMOD)$(call build-recoveryimage-target, $@)
这里就不再展开介绍了,值得注意的时,依赖目标中共有(INSTALLED_BOOTIMAGE_TARGET) ,也就意味着,敲击make recoveryimage时,也会编译boot.img了。
===================================================================
六、其它镜像的构建
构建userdateimage
伪userdateimage输出userdata.img,其依赖关系如下:
BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.imgINSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET)INSTALLED_USERDATAIMAGE_TARGET_DEPS := \$(INTERNAL_USERIMAGES_DEPS) \$(INTERNAL_USERDATAIMAGE_FILES) \$(BUILD_IMAGE_SRCS)
$(INSTALLED_USERDATAIMAGE_TARGET): $(INSTALLED_USERDATAIMAGE_TARGET_DEPS)$(build-userdataimage-target)
构建cacheimage
BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img
# We just build this directly to the install location.
INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET)
$(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES) $(BUILD_IMAGE_SRCS)$(build-cacheimage-target)
构建vendorimage
BUILT_VENDORIMAGE_TARGET := $(PRODUCT_OUT)/vendor.img
# We just build this directly to the install location.
INSTALLED_VENDORIMAGE_TARGET := $(BUILT_VENDORIMAGE_TARGET)
$(INSTALLED_VENDORIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_VENDORIMAGE_FILES) $(INSTALLED_FILES_FILE_VENDOR) $(BUILD_IMAGE_SRCS) $(DEPMOD) $(BOARD_VENDOR_KERNEL_MODULES)$(build-vendorimage-target)
构建productimage
BUILT_PRODUCTIMAGE_TARGET := $(PRODUCT_OUT)/product.img
# We just build this directly to the install location.
INSTALLED_PRODUCTIMAGE_TARGET := $(BUILT_PRODUCTIMAGE_TARGET)
$(INSTALLED_PRODUCTIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_PRODUCTIMAGE_FILES) $(INSTALLED_FILES_FILE_PRODUCT) $(BUILD_IMAGE_SRCS)$(build-productimage-target)
构建INSTALLED_FILES_FILE目标
输出:installed-files.txt
INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
$(INSTALLED_FILES_FILE): $(FULL_SYSTEMIMAGE_DEPS) $(FILESLIST)@echo Installed file list: $@@mkdir -p $(dir $@)@rm -f $@$(hide) $(FILESLIST) $(TARGET_OUT) > $(@:.txt=.json)$(hide) build/make/tools/fileslist_util.py -c $(@:.txt=.json) > $@
构建INSTALLED_FILES_FILE_VENDOR目标
输出:installed-files-vendor.txt
INSTALLED_FILES_FILE_VENDOR := $(PRODUCT_OUT)/installed-files-vendor.txt
$(INSTALLED_FILES_FILE_VENDOR) : $(INTERNAL_VENDORIMAGE_FILES) $(FILESLIST)@echo Installed file list: $@@mkdir -p $(dir $@)@rm -f $@$(hide) $(FILESLIST) $(TARGET_OUT_VENDOR) > $(@:.txt=.json)$(hide) build/make/tools/fileslist_util.py -c $(@:.txt=.json) > $@
构建INSTALLED_FILES_FILE_PRODUCT目标
输出:installed-files-product.txt
INSTALLED_FILES_FILE_PRODUCT := $(PRODUCT_OUT)/installed-files-product.txt
$(INSTALLED_FILES_FILE_PRODUCT) : $(INTERNAL_PRODUCTIMAGE_FILES) $(FILESLIST)@echo Installed file list: $@@mkdir -p $(dir $@)@rm -f $@$(hide) $(FILESLIST) $(TARGET_OUT_PRODUCT) > $(@:.txt=.json)$(hide) build/tools/fileslist_util.py -c $(@:.txt=.json) > $@
以下目标为可选,这里就不讲解了
INSTALLED_SYSTEMOTHERIMAGE_TARGET(system_other.img)
INSTALLED_BPTIMAGE_TARGET(partition-table.img)
INSTALLED_VBMETAIMAGE_TARGET(vbmeta.img)
INSTALLED_FILES_FILE_SYSTEMOTHER(installed-files-system-other.txt)
soong_docs(为空)
Android makefile编译流程(二)相关推荐
- Android Makefile编译流程
★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ 1.整编译 当中android根目录下敲击make时候,根目录下的Makefile就一句话include build/core/main.mk ...
- linux源文件编译工具Makefile编译流程
一.Makefile介绍 个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至 ...
- android关机分区卸载,Android关机重启流程(二)
一.回顾 先回顾下上部分得分析,从最开始的PM.reboot(),经过层层调用,最终调用 SystemProperties.set("sys.powerctl", "re ...
- android apk 自动编译器,Android APK编译流程
apk 是Android Package的简写, 在平时的开发过程中,通过点击Run app 按钮 或者 在命令行中输入 ./gradlew ***(taskName) 这样Android Studi ...
- 高通Android智能平台环境搭建_编译流程分析
高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...
- Mac 从Makefile 编译 Rocksdb 源码的一些注意事项
文章目录 前言 Makefile 编译流程 1. 平台变量/环境变量的初始化. 2. 编译需要的源码文件变量初始化. 3. include 目录的设置. 4. 编译的执行逻辑. 问题记录1:可能的打包 ...
- 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程
文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...
- 全志 android 编译,全志Android SDK编译详解(二)
注意要确定安装了jdk) 第一步: cd lichee; ./build.sh -p sun5i_elite -k 3.0 (apt-get install uboot-mkimage需要安装m ...
- Android编译流程
目录 一.编译流程 1.初始化编译环境 2.选择编译平台 3.开始编译 二.Soong工具 1.Soong工作原理 2.转换关系 三.make流程 1.编译开端main.mk 2.编译配置config ...
最新文章
- VC++设置Release模式下允许调试代码
- stl_vector.h
- css( div和span)——读书笔记
- java多线程构造函数_Java多线程编程经验谈
- excel根据rgb自动填充颜色_Excel一键定位空值与自动填充
- oracle学习笔记一
- python基础之内置异常对象
- 利用Linux命令和perl脚本批量将文件重命名
- linux查看jdk详细版本号,Linux中查看jdk版本
- 解决ray报错AttributeError: module ‘aioredis‘ has no attribute ‘create_redis_pool‘
- cefsharp作为采集工具(学习笔记)
- access 的几种更新语句:update where 与 update join where
- A feature-supervised generative adversarial network for environmental monitoring during hazy days
- java编写家庭收支记账程序
- VC,DirectX8开发实例(画面的清除和描画)
- Android平台移植FFmpeg和x264
- 我敢说,没人能超过这份产品经理推荐书单(40本)!
- 跟着禅一练功夫-少林八段锦对身体有什么样的益处
- 阿里-测试开发工程师-18年暑期实习-一面
- php cet成绩查询,cet.php · xuthus/redline教务查询系统 - Gitee.com
热门文章
- ups的空开、电缆及电池的配置计算
- 数据机房局部过热与节能降耗解决方案
- Google 首次引入数据中心液体冷却
- AI之HCI:人机交互Human-Computer Interaction的简介、发展历史、案例应用之详细攻略
- Blockchain:《Blockchain applications in insurance》Deloitte—德勤区块链技术研究报告正文版—听课记录
- YOLO:将yolo的.weights文件转换为keras、tensorflow等模型所需的.h5文件的图文教程
- Python机器学习类库常见问题及解决
- 如何快速掌握Pandas
- Packet for query is too large (1166 1024). You can change this value
- Java 中浮点数---------BigDecimal和double(初探)