热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android构建基础流程详解

参考转载:https://blog.csdn.net/xujiaofu6181/article/details/86598988https://blog.csdn.net/Thanksgining

参考转载:
https://blog.csdn.net/xujiaofu6181/article/details/86598988
https://blog.csdn.net/Thanksgining/article/details/83374493
分析 system 生成过程

编译Android系统三部曲:

source build/envsetup.sh lunch full-eng make -j24

make其实就是执行Makefile文件,在没有指定Makefile的情况下,执行当前路径下的Makefile文件。Android系统执行make命令就是source code跟目录下Makefile文件,而此Makefile文件的内容只有一句,include另外一个main.mk文件, 现在android P 上,main.mk 内容比较多,其实流程是一样的

### DO NOT EDIT THIS FILE ### include build/make/core/main.mk ### DO NOT EDIT THIS FILE ###

根据Makefile书写规则,在main.mk开始不久,就出现了一个droid伪目标,也是默认目标(default target)。这个默认目标是一个伪目标,make工具遇到伪目标以后,会检查解析伪目标的依赖,如果伪目标存在依赖,就会检查这些依赖,如果这些依赖是伪目标,继续检查这个伪目标的依赖,如果不是伪目标,就会生成这个目标。

最终目标droid

默认目标droid依赖于droid_targets,根据build/make/core/main.mk文件可知完整编译Android系统时,droid_targets的依赖于droidcode和dist_files两大伪目标

BUILD_SYSTEM := $(TOPDIR)build/make/core # This is the default target. It must be the first declared target. .PHONY: droid DEFAULT_GOAL := droid $(DEFAULT_GOAL): droid_targets .PHONY: droid_targets droid_targets: # Set up various standard variables based on configuration # and host information. include $(BUILD_SYSTEM)/config.mk droid_targets依赖

根据上面代码可知默认目标droid依赖于droid_targets,根据build/make/core/main.mk文件可知完整编译Android系统时,droid_targets的依赖于droidcode和dist_files两大伪目标.
注意: mk 文件中定义 .PHONY 目标才可以进行,build , 在MK 可以调用shell 脚本

ifneq ($(TARGET_BUILD_APPS),) ...... .PHONY: apps_only apps_only: $(unbundled_build_modules) droid_targets: apps_only ...... else # TARGET_BUILD_APPS ...... # Building a full system-- the default is to build droidcore droid_targets: droidcore dist_files ...... endif # TARGET_BUILD_APPS

android make 基本流程一
图片.png
droid_code依赖

droidcode目标依赖files、systemimage、INSTALLED_BOOTIMAGE_TARGET等目标,dist_files没有看到依赖情况;

# $(INSTALLED_BOOTIMAGE_TARGET)取INSTALLED_BOOTIMAGE_TARGET的环境变量值 # Build files and then package it into the rom formats .PHONY: droidcore droidcore: files systemimage $(INSTALLED_BOOTIMAGE_TARGET) $(MTK_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $(INSTALLED_VBMETAIMAGE_TARGET) $(INSTALLED_USERDATAIMAGE_TARGET) $(INSTALLED_CACHEIMAGE_TARGET) $(INSTALLED_TRANFSIMAGE_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 # dist_files only for putting your library into the dist directory with a full build. .PHONY: dist_files

android make 基本流程一
图片.png
files依赖

files目标依赖modules_to_install和INSTALLED_ANDROID_INFO_TXT_TARGET目标;

# All the droid stuff, in directories .PHONY: files files: $(modules_to_install) $(INSTALLED_ANDROID_INFO_TXT_TARGET) INSTALLED_SYSTEMIMAGE依赖

build/make/core/main.mk文件包含如下.mk和Makefile文件

android make 基本流程一
图片.png

systemimage目标依赖在build/make/core/Makefile中说明,可知systemimage目标依赖INSTALLED_SYSTEMIMAGE目标;INSTALLED_SYSTEMIMAGE赋值为(PRODUCT_OUT)/system.img,即(PRODUCT_OUT)/system.img目标依赖:
-BUILT_SYSTEMIMAGE
-RECOVERY_FROM_BOOT_PATCH

NSTALLED_SYSTEMIMAGE := $(PRODUCT_OUT)/system.img SYSTEMIMAGE_SOURCE_DIR := $(TARGET_OUT) ...... # Rules that need to be present for the all targets, even # if they don't do anything. .PHONY: systemimage systemimage: # build/make/core/config.mk定义了hide := @,即$(hide)表示在命令前加“@” # 在命令前加@表示不回显命令 # call 一个可以用来创建新的参数化的函数 **$(INSTALLED_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE) $(RECOVERY_FROM_BOOT_PATCH)** @echo "Install system fs image: $@" $(copy-file-to-target) $(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) systemimage: $(INSTALLED_SYSTEMIMAGE) #QEMU表示软件化模拟器 ifeq ($(BUILD_QEMU_IMAGES),true) ...... systemimage: $(INSTALLED_QEMU_SYSTEMIMAGE) ...... endif

BUILT_SYSTEMIMAGE赋值为$(systemimage_intermediates)/system.img,其依赖:

FULL_SYSTEMIMAGE_DEPS INSTALLED_FILES_FILE BUILD_IMAGE_SRCS

systemimage_intermediates := $(call intermediates-dir-for,PACKAGING,systemimage) BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img ...... $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(BUILD_IMAGE_SRCS) $(call build-systemimage-target,$@)

目标INSTALLED_SYSTEMIMAGE执行两个动作,分别是:

copy-file-to-target,此命令在build/make/core/definitions.mk文件定义了,可知此命令就是将第一个依赖项拷贝到目标处,即$(PRODUCT_OUT)/system.img是由拷贝$(systemimage_intermediates)/system.img过来的。

# $@ --> 表示目标 # $ 表示第一个依赖项 # mkdir -p --> 可创建多级文件目录 如:mkdir -p a/b/c define copy-file-to-target @mkdir -p $(dir $@) $(hide) rm -f $@ $(hide) cp "$

assert-max-image-size,此命令在build/make/core/definitions.mk文件定义了

# build/make/core/combo/HOST_linux-x86.mk中定义了get_file-size # $(1): The file to check define get-file-size stat --format "%s" "$(1)" | tr -d 'n' endef # build/make/core/definitions.mk # $(1): The file(s) to check (often $@) # $(2): The partition size. define assert-max-image-size $(if $(2), size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); total=$$(( $$( echo "$$size" ) )); printname=$$(echo -n "$(1)" | tr " " +); maxsize=$$(($(2))); if [ "$$total" -gt "$$maxsize" ]; then echo "error: $$printname too large ($$total > $$maxsize)"; false; elif [ "$$total" -gt $$((maxsize - 32768)) ]; then echo "WARNING: $$printname approaching size limit ($$total now; limit $$maxsize)"; fi , true ) endef

在分析assert-max-image-size之前,先看看RECOVERY_FROM_BOOT_PATCH和BOARD_SYSTEMIMAGE_PARTITION_SIZE

,RECOVERY_FROM_BOOT_PATCH描述的是一个patch文件,这个patch文件的名称为recovery_from_boot.p,保存在设备上system分区中,描述recovery.img与boot.img之间的差异。也就是说,在设备上,可以通过boot.img和recovery_from_boot.p文件生成一个recovery.img文件,使得设备可以进入recovery模式。好比OTA通过recovery_from_boot.p方式升级recovery.img(OTA卡包里面必须要有boot.img、recovery-from-boot.p、install-recovery.sh三个文件缺一不可),在OTA升级完之后,系统重启时会去升级recovery.img(通过boot.img与recovery-from-boot.p生成的)。

RECOVERY_FROM_BOOT_PATCH依赖规则如下:

# The system partition needs room for the recovery image as well. We # now store the recovery image as a binary patch using the boot image # as the source (since they are very similar). Generate the patch so # we can see how big it's going to be, and include that in the system # image size check calculation. ifneq ($(INSTALLED_RECOVERYIMAGE_TARGET),) ifneq ($(BOARD_USES_FULL_RECOVERY_IMAGE),true) ifneq (,$(filter true, $(BOARD_BUILD_SYSTEM_ROOT_IMAGE) $(BOARD_INCLUDE_RECOVERY_DTBO))) diff_tool := $(HOST_OUT_EXECUTABLES)/bsdiff else diff_tool := $(HOST_OUT_EXECUTABLES)/imgdiff endif intermediates := $(call intermediates-dir-for,PACKAGING,recovery_patch) RECOVERY_FROM_BOOT_PATCH := $(intermediates)/recovery_from_boot.p $(RECOVERY_FROM_BOOT_PATCH): PRIVATE_DIFF_TOOL := $(diff_tool) $(RECOVERY_FROM_BOOT_PATCH): $(INSTALLED_RECOVERYIMAGE_TARGET) $(INSTALLED_BOOTIMAGE_TARGET) $(diff_tool) @echo "Construct recovery from boot" mkdir -p $(dir $@) $(PRIVATE_DIFF_TOOL) $(INSTALLED_BOOTIMAGE_TARGET) $(INSTALLED_RECOVERYIMAGE_TARGET) $@ else # $(BOARD_USES_FULL_RECOVERY_IMAGE) == true RECOVERY_FROM_BOOT_PATCH := $(INSTALLED_RECOVERYIMAGE_TARGET) endif endif

BOARD_SYSTEMIMAGE_PARTITION_SIZE是system分区大小,在对应产品的Makefile文件中定义了

BOARD_SYSTEMIMAGE_PARTITION_SIZE:=838860800

如下操作是将“(PRODUCT_OUT)/system.img recovery-from-boot.p”作为一组参数1,“分区size”作为一组参数$2,传入assert-max-image-size中,再根据assert-max-image-size的定义,我们可知以下操作就是在比较镜像文件总和是否大于分区大小,如果大于允许的最大分区的大小,这里就会报错。因此,assert-max-image-size函数可以理解为检查system.img size的合法性。

$(hide) $(call assert-max-image-size,$@ $(RECOVERY_FROM_BOOT_PATCH),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))

通过编译log也可以看到如下信息:

[100% 81510/81510] Install system fs image: out/target/product/${project}/system.img out/target/product/${project}/system.img+out/target/product/${project}/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=2415114240 blocksize=4224 total=1860325777 reserve=24397824

至此,$(PRODUCT_OUT)/system.img就生成了


推荐阅读
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 当使用 `new` 表达式(即通过 `new` 动态创建对象)时,会发生两件事:首先,内存被分配用于存储新对象;其次,该对象的构造函数被调用以初始化对象。为了确保资源管理的一致性和避免内存泄漏,建议在使用 `new` 和 `delete` 时保持形式一致。例如,如果使用 `new[]` 分配数组,则应使用 `delete[]` 来释放内存;同样,如果使用 `new` 分配单个对象,则应使用 `delete` 来释放内存。这种一致性有助于防止常见的编程错误,提高代码的健壮性和可维护性。 ... [详细]
  • 如何有效防御网站中的SQL注入攻击
    本期文章将深入探讨网站如何有效防御SQL注入攻击。我们将从技术层面详细解析防范措施,并结合实际案例进行阐述,旨在帮助读者全面了解并掌握有效的防护策略。希望本文能为您的网络安全提供有益参考。 ... [详细]
author-avatar
远处有个蘑菇丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有