总结一下android的编译系统

一.Android的编译脚本在哪里?

在build/core目录下,使用的是makefile的方式。入口是main.mk。

一般我们执行make去编译。

在根目录下可以看到一个Makefile,这个就是入口了。

image.png

看一下编译的目标:

image.png

第一个定义的PHONY就是目标了。所以目标是droid

TARGET_BUILD_TYPE和TARGET_BUILD_VARIANT的区别

1.TARGET_BUILD_VARIANT:表示编译产品的类型,可能的值有eng、user和userdebug

adb的属性就是通过这个来设置的

image.png

2.TARGET_BULD_TYPE:表示编译的类型,可选的值是release和debug

PRODUCT_PACKAGES怎样控制编译到img中的?

在build/core/main.mk中,

product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)

product_FILES := $(call module-installed-files, $(product_MODULES))

modules_to_install := $(sort \

$(ALL_DEFAULT_INSTALLED_MODULES) \

$(product_FILES) \

$(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \

$(CUSTOM_MODULES) \

)

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_SYSTEMOTHERIMAGE_TARGET) \

$(INSTALLED_FILES_FILE) \

$(INSTALLED_FILES_FILE_VENDOR) \

$(INSTALLED_FILES_FILE_SYSTEMOTHER)

# Building a full system-- the default is to build droidcore

droid_targets: droidcore dist_files

编译系统初始化过程

makefile依赖中的竖线

ninja编译系统

脚本在build/soong/ui/build下

main.go (main函数) ->build.go(Build函数)

build/soong/soong_ui.bash --make-mode

ninja的go语言

//返回所给路径的绝对路径

path, _ := filepath.Abs("./1.txt");

ALL_MODULE

INTERNAL_PRODUCT是什么?

是一个mk文件,例如

INTERNAL_PRODUCT=device/huawei/XXX/full_huawei.mk

如何编译apk删除apk内部的dex文件?

通过方法dexpreopt-remove-classes.dex实现

客制化img编译流程是怎样的?

1.在build_custom_images.mk中给PRODUCT_CUSTOM_IMAGE_MAKEFILES赋值若干个makefile

build_custom_images.mk

PRODUCT_CUSTOM_IMAGE_MAKEFILES :=

XXX.mk

2.遍历每一个makefile,执行build_custom_image.mk

(PRODUCT_CUSTOM_IMAGE_MAKEFILES),

(mk))

(BUILD_SYSTEM)/tasks/tools/build_custom_image.mk))

$(call clear-var-list, $(custom_image_parameter_variables)) ##清理环境遍历

include $(my_custom_imag_makefile) ##执行我们定义的makefile,这个makefile中指定了分区的大小等信息

my_custom_image_name := $(basename $(notdir $(my_custom_imag_makefile))) ##分区的名字,去makefile的名字

intermediates := $(call intermediates-dir-for,PACKAGING,$(my_custom_image_name)) ##中间目录

my_built_custom_image := $(intermediates)/$(my_custom_image_name).img ##生成的img

my_staging_dir := $(intermediates)/$(CUSTOM_IMAGE_MOUNT_POINT) ##中间目录 例如huawei_product/produtc/

# Collect CUSTOM_IMAGE_MODULES's installd files and their PICKUP_FILES.

my_built_modules := ##安装的module

my_copy_pairs := ##需要拷贝的文件

my_pickup_files := ##需要pickup的文件

#$(ALL_MODULES.$(m).BUILT_INSTALLED)的格式是 源地址:目标地址 的格式,类似于out/target/product/sdm660_64/obj/APPS/Camera.apk_intermediates/package.apk:out/target/product/sdm660_64/system/app/Camera/Camera.apk

#因此需要分割出来,ins代表目标地址,bui代表源地址或者中间文件地址

$(foreach m,$(CUSTOM_IMAGE_MODULES),\

$(eval _pickup_files := $(strip $(ALL_MODULES.$(m).PICKUP_FILES)\

$(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).PICKUP_FILES)))\

$(eval _built_files := $(strip $(ALL_MODULES.$(m).BUILT_INSTALLED)\

$(ALL_MODULES.$(m)$(TARGET_2ND_ARCH_MODULE_SUFFIX).BUILT_INSTALLED)))\

$(if $(_pickup_files)$(_built_files),,\

$(warning Unknown installed file for module '$(m)'))\

$(eval my_pickup_files += $(_pickup_files))\

$(foreach i, $(_built_files),\

$(eval bui_ins := $(subst :,$(space),$(i)))\

$(eval ins := $(word 2,$(bui_ins)))\

$(if $(filter $(TARGET_OUT_ROOT)/%,$(ins)),\

$(eval bui := $(word 1,$(bui_ins)))\

$(eval my_built_modules += $(bui))\

$(eval my_copy_dest := $(patsubst $(PRODUCT_OUT)/%,%,$(ins)))\

$(eval my_copy_dest := $(subst /,$(space),$(my_copy_dest)))\

$(eval my_copy_dest := $(wordlist 2,999,$(my_copy_dest)))\

$(eval my_copy_dest := $(subst $(space),/,$(my_copy_dest)))\

$(eval my_copy_pairs += $(bui):$(my_staging_dir)/$(my_copy_dest)))\

))

# Collect CUSTOM_IMAGE_COPY_FILES.

my_image_copy_files :=

$(foreach f,$(CUSTOM_IMAGE_COPY_FILES),\

$(eval pair := $(subst :,$(space),$(f)))\

$(eval src := $(word 1,$(pair)))\

$(eval my_image_copy_files += $(src))\

$(eval my_copy_pairs += $(src):$(my_staging_dir)/$(word 2,$(pair))))

ifndef CUSTOM_IMAGE_AVB_KEY_PATH

# If key path isn't specified, use the default signing args.

my_avb_signing_args := $(INTERNAL_AVB_SIGNING_ARGS)

else

my_avb_signing_args := \

--algorithm $(CUSTOM_IMAGE_AVB_ALGORITHM) --key $(CUSTOM_IMAGE_AVB_KEY_PATH)

endif

$(my_built_custom_image): PRIVATE_INTERMEDIATES := $(intermediates)

$(my_built_custom_image): PRIVATE_MOUNT_POINT := $(CUSTOM_IMAGE_MOUNT_POINT)

$(my_built_custom_image): PRIVATE_PARTITION_SIZE := $(CUSTOM_IMAGE_PARTITION_SIZE)

$(my_built_custom_image): PRIVATE_FILE_SYSTEM_TYPE := $(CUSTOM_IMAGE_FILE_SYSTEM_TYPE)

$(my_built_custom_image): PRIVATE_STAGING_DIR := $(my_staging_dir)

$(my_built_custom_image): PRIVATE_COPY_PAIRS := $(my_copy_pairs)

$(my_built_custom_image): PRIVATE_PICKUP_FILES := $(my_pickup_files)

$(my_built_custom_image): PRIVATE_SELINUX := $(CUSTOM_IMAGE_SELINUX)

$(my_built_custom_image): PRIVATE_SUPPORT_VERITY := $(CUSTOM_IMAGE_SUPPORT_VERITY)

$(my_built_custom_image): PRIVATE_SUPPORT_VERITY_FEC := $(CUSTOM_IMAGE_SUPPORT_VERITY_FEC)

$(my_built_custom_image): PRIVATE_VERITY_KEY := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VERITY_SIGNING_KEY)

$(my_built_custom_image): PRIVATE_VERITY_BLOCK_DEVICE := $(CUSTOM_IMAGE_VERITY_BLOCK_DEVICE)

$(my_built_custom_image): PRIVATE_DICT_FILE := $(CUSTOM_IMAGE_DICT_FILE)

$(my_built_custom_image): PRIVATE_AVB_AVBTOOL := $(AVBTOOL)

$(my_built_custom_image): PRIVATE_AVB_SIGNING_ARGS := $(my_avb_signing_args)

$(my_built_custom_image): PRIVATE_AVB_HASH_ENABLE := $(CUSTOM_IMAGE_AVB_HASH_ENABLE)

$(my_built_custom_image): PRIVATE_AVB_ADD_HASH_FOOTER_ARGS := $(CUSTOM_IMAGE_AVB_ADD_HASH_FOOTER_ARGS)

$(my_built_custom_image): PRIVATE_AVB_HASHTREE_ENABLE := $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)

$(my_built_custom_image): PRIVATE_AVB_ADD_HASHTREE_FOOTER_ARGS := $(CUSTOM_IMAGE_AVB_ADD_HASHTREE_FOOTER_ARGS)

ifeq (true,$(filter true, $(CUSTOM_IMAGE_AVB_HASH_ENABLE) $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)))

$(my_built_custom_image): $(AVBTOOL)

else ifneq (,$(filter true, $(CUSTOM_IMAGE_AVB_HASH_ENABLE) $(CUSTOM_IMAGE_AVB_HASHTREE_ENABLE)))

$(error Cannot set both CUSTOM_IMAGE_AVB_HASH_ENABLE and CUSTOM_IMAGE_AVB_HASHTREE_ENABLE to true)

endif

ifeq (true,$(CUSTOM_IMAGE_SUPPORT_VERITY_FEC))

$(my_built_custom_image): $(FEC)

endif

my_custom_image_modules_var:=BOARD_$(strip $(call to-upper,$(my_custom_image_name)))_KERNEL_MODULES

my_custom_image_modules:=$($(my_custom_image_modules_var))

my_custom_image_modules_dep:=$(if $(my_custom_image_modules),$(my_custom_image_modules) $(DEPMOD),)

$(my_built_custom_image): PRIVATE_KERNEL_MODULES := $(my_custom_image_modules)

$(my_built_custom_image): PRIVATE_IMAGE_NAME := $(my_custom_image_name)

$(my_built_custom_image): $(INTERNAL_USERIMAGES_DEPS) $(my_built_modules) $(my_image_copy_files) $(my_custom_image_modules_dep) \

$(CUSTOM_IMAGE_DICT_FILE)

@echo "Build image $@"

$(hide) rm -rf $(PRIVATE_INTERMEDIATES) && mkdir -p $(PRIVATE_INTERMEDIATES) ##删除中间目录,并且重新穿件

$(hide) rm -rf $(PRIVATE_STAGING_DIR) && mkdir -p $(PRIVATE_STAGING_DIR)

# Copy all the files.

$(hide) $(foreach p,$(PRIVATE_COPY_PAIRS),\ ##拷贝CUSTOM_IMAGE_COPY_FILES定义的拷贝文件

$(eval pair := $(subst :,$(space),$(p)))\

mkdir -p $(dir $(word 2,$(pair)));\

cp -Rf $(word 1,$(pair)) $(word 2,$(pair));)

$(if $(PRIVATE_KERNEL_MODULES), \

$(call build-image-kernel-modules,$(PRIVATE_KERNEL_MODULES),$(PRIVATE_STAGING_DIR),$(PRIVATE_IMAGE_NAME)/,$(call intermediates-dir-for,PACKAGING,depmod_$(PRIVATE_IMAGE_NAME))))

$(if $($(PRIVATE_PICKUP_FILES)),$(hide) cp -Rf $(PRIVATE_PICKUP_FILES) $(PRIVATE_STAGING_DIR)) ##拷贝PRIVATE_PICKUP_FILES文件

# Generate the dict.

$(hide) echo "# For all accepted properties, see BuildImage() in tools/releasetools/build_image.py" > $(PRIVATE_INTERMEDIATES)/image_info.txt ##往image_info.txt记录信息

$(hide) echo "mount_point=$(PRIVATE_MOUNT_POINT)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(hide) echo "partition_name=$(PRIVATE_MOUNT_POINT)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(hide) echo "fs_type=$(PRIVATE_FILE_SYSTEM_TYPE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(hide) echo "partition_size=$(PRIVATE_PARTITION_SIZE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(hide) echo "ext_mkuserimg=$(notdir $(MKEXTUSERIMG))" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(if $(PRIVATE_SELINUX),$(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)

$(if $(PRIVATE_SUPPORT_VERITY),\

$(hide) echo "verity=$(PRIVATE_SUPPORT_VERITY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\

echo "verity_key=$(PRIVATE_VERITY_KEY)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\

echo "verity_signer_cmd=$(VERITY_SIGNER)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\

echo "verity_block_device=$(PRIVATE_VERITY_BLOCK_DEVICE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)

$(if $(PRIVATE_SUPPORT_VERITY_FEC),\

$(hide) echo "verity_fec=$(PRIVATE_SUPPORT_VERITY_FEC)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)

$(hide) echo "avb_avbtool=$(PRIVATE_AVB_AVBTOOL)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(hide) echo "avb_signing_args=$(PRIVATE_AVB_SIGNING_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt

$(if $(PRIVATE_AVB_HASH_ENABLE),\

$(hide) echo "avb_hash_enable=$(PRIVATE_AVB_HASH_ENABLE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\

echo "avb_add_hash_footer_args=$(PRIVATE_AVB_ADD_HASH_FOOTER_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)

$(if $(PRIVATE_AVB_HASHTREE_ENABLE),\

$(hide) echo "avb_hashtree_enable=$(PRIVATE_AVB_HASHTREE_ENABLE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\

echo "avb_add_hashtree_footer_args=$(PRIVATE_AVB_ADD_HASHTREE_FOOTER_ARGS)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt)

$(if $(PRIVATE_DICT_FILE),\

$(hide) echo "# Properties from $(PRIVATE_DICT_FILE)" >> $(PRIVATE_INTERMEDIATES)/image_info.txt;\

cat $(PRIVATE_DICT_FILE) >> $(PRIVATE_INTERMEDIATES)/image_info.txt)

# Generate the image.

$(if $(filter oem,$(PRIVATE_MOUNT_POINT)), \

$(hide) echo "oem.buildnumber=$(BUILD_NUMBER)" >> $(PRIVATE_STAGING_DIR)/oem.prop)

$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ ##生成img

./build/tools/releasetools/build_image.py \

$(PRIVATE_STAGING_DIR) $(PRIVATE_INTERMEDIATES)/image_info.txt $@ $(TARGET_OUT)

my_installed_custom_image := $(PRODUCT_OUT)/$(notdir $(my_built_custom_image)) ##将img拷贝到PRODUCT_OUT目录

$(my_installed_custom_image) : $(my_built_custom_image)

$(call copy-file-to-new-target-with-cp)

.PHONY: $(my_custom_image_name)

custom_images $(my_custom_image_name) : $(my_installed_custom_image)

# Archive the built image.

$(call dist-for-goals, $(my_custom_image_name) custom_images,$(my_installed_custom_image))

my_staging_dir :=

my_built_modules :=

my_copy_dest :=

my_copy_pairs :=

my_pickup_files :=

android custom.img 编译生成,Android:编译系统总结相关推荐

  1. Android 10 根文件系统和编译系统(十八):Android.bp语法

    配套系列教学视频链接: 安卓系列教程之ROM系统开发-百问100ask 说明 系统:AOSP Android10.0 设备:Android x86模拟器 前言 由于make在编译时表现出效率不够高.增 ...

  2. Android Custom View --- Circular(环形条)

    Android Custom View - Circular(环形条) 这次是实现一个简单的环形条,下图这样的,还是尽量简单的写,让新手能够看懂 这一次没多少代码,就贴一下核心部分,别的大家可以自己看 ...

  3. Android 10 根文件系统和编译系统(四):Android源码目录结构

    配套系列教学视频链接: Android 10.0 AOSP源码编译: https://www.100ask.net/detail/p_60a1e037e4b0adb2d864c6d8/6 Androi ...

  4. Android Custom View系列《圆形菜单一》

    前言 自定义view能够做出很多不同寻常的效果,圆形菜单交互效果不错,目前网上有两个版本,虽然比较庞大,但非常值得研究与学习. radial-menu-widget: https://code.goo ...

  5. android custom toast,Android自定义Toast

    核心代码: package com.huatec.myapplication; import android.content.Context; import android.graphics.Bitm ...

  6. Android Custom

    /** 修改标题栏 */ public class CustomTitle extends Activity {/*** Initialization of the Activity after it ...

  7. android.mk 比较字变量,Android.mk的用法和基础

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  8. android mk与bp,Android.bp你真的了解吗

    Android.bp你真的了解吗 前言 最近在捣鼓Android 9 和10的build系统,看到一篇比较好的博客,大名鼎鼎的gityuan的,奉上链接理解Android.bp,为了方便学习和更多的人 ...

  9. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

最新文章

  1. R语言ggplot2可视化分面图(faceting)、在所有的分面中添加相同的参考基准曲线(overlay a base or reference plot to all facets )
  2. 必看,经典sql面试题(学生表_课程表_成绩表_教师表)
  3. php-fpm 没有启动脚本,php-fpm服务启动脚本
  4. 花果山第一届猿类分级考试实录--Talk is cheap,Show me the code
  5. 前端技术分享:什么是MongoDB数据库?
  6. ibatis与spring的整合
  7. 细数网络上十七种安全威胁
  8. asp.net web api集成微信服务(使用Senparc微信SDK)
  9. Git本地仓库管理远程库(GitHub)——clone(下载)、push(提交)、pull(拉取)操作
  10. 用C/C++写CGI程序
  11. python assert_Python中何时使用断言 assert
  12. 核磁共振成像基本原理——杨正汉(1)
  13. 两年数据对比柱形图_【Excel技巧】制作柱形图图表完美呈现百分比,提升您的报表颜值...
  14. 2D图像像素点操作——平移,旋转,缩放 tcy
  15. oracle查询存储过程完整的sql,SQL命令查询Oracle存储过程信息(代码内容等)
  16. redis-manger管理平台
  17. ColumnTransformer()函数
  18. linux服务器被挖矿的解决办法
  19. 归一化数字角频率_数字信号处理中的归一化频率
  20. PAT甲级真题 1011 World Cup Betting (20分) C++实现

热门文章

  1. 嵌入式 Linux 文件IO操作
  2. Java面试总结笔记
  3. 重访马尔可夫生成式任务型对话 Revisiting Markovian Generative Architectures for Efficient Task-Oriented Dialog Sys
  4. C语言主编李念,李念远大前程剧照走红 自曝为角色爱上旗袍与国粹
  5. 极速office(Word)怎么快速插入空白页
  6. Dockerfile制作jdk镜像和微服务镜像部署的最佳实践【Dockerfile实战】
  7. win7 远程桌面连接Ubuntu 14.01
  8. 微信小程序中自定义导航和地图定位
  9. Hive- 序列函数
  10. 打开Anaconda遇到的问题,提示There is an instance of ana/loading applicati/solving environment和 | 一直转