Android编译系统

Android编译系统分析三:make完整编译android系统 Android编译系统分析系列文章: android编译系统分析一 Android编译系统-mm编译单个模块 android编译系统分析(三)-make android编译系统(四)-实战:新增一个产品 这篇博客的目标是摸清楚默认编译整个android系统时代码的流程。 当我们执行make的时候,会查找当前的Makefie文件或者makefile文件 阅读详情

这篇文章对Android的编译系统做个大概的分析,希望对大家有帮助,也希望大家一起讨论。

编译系统的框架和结构网上有很多文章描述,本文后面也附了一些链接可供大家参考。

下面我们就从Android系统(以android4.2.2为例)的编译过程来分析其编译系统。

一、执行source build/envsetup.sh

      envsetup.sh其主要作用如下:

  1. 加载了编译时使用到的函数命令,如:help,lunch,m,mm,mmm等
  2. 添加默认的lunch选项
    # add the default one here
    add_lunch_combo aosp_arm-eng
    add_lunch_combo aosp_x86-eng
    add_lunch_combo aosp_mips-eng
    add_lunch_combo vbox_x86-eng
  3. 查找vendor/<-厂商目录>/和device/<厂商目录>/ 目录下的vendorsetup.sh,如果存在的话,加载执行它,添加厂商自己定义产品的编译选项
    # Execute the contents of any vendorsetup.sh files we can find.
    for f in `test -d device && find device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null` \
             `test -d vendor && find vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null`
    do
        echo "including $f"
        . $f
    done
    unset f

二、执行lunch

       执行lunch的时候,会出现选择菜单,让您选择编译的产品和编译类型,lunch方法执行时,会等待用户输入对应的产品类型,并有缺省的产品类型,比较重要的逻辑
    local product=$(echo -n $selection | sed -e "s/-.*$//")
    check_product $product
    local variant=$(echo -n $selection | sed -e "s/^[^\-]*-//")
    check_variant $variant
        check_product会调用config.mk设置一些平台无关的变量,下面有详细描述
        check_variant会校验是否为user userdebug eng之一

三、build/core/config.mk文件

       该文件定义了编译过程中需要的一些 与平台无关的变量,在该方法里被调用

# Get the exact value of a build variable.
function get_build_var()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1
}

            现列举出几个比较重要的地方:

# ---------------------------------------------------------------
# Define most of the global variables.  These are the ones that
# are specific to the user's build configuration.
include $(BUILD_SYSTEM)/envsetup.mk
            1、envsetup.mk里定义了大部分的全局变量,可以从该文件的末尾发现定义的全局变量。包括android版本信息等。

         2、定义了board_config_mk变量,主要是板级的配置选项,比如CPU类型,外设相关        

# Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
# or under vendor/*/$(TARGET_DEVICE).  Search in both places, but
# make sure only one exists.
# Real boards should always be associated with an OEM vendor.
board_config_mk := \
        $(strip $(wildcard \
                $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
                $(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
                $(shell test -d vendor && find vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
        ))

四、修改编译系统,适配自己的产品

如何在Android系统中添加自己的编译系统,假设厂商名称为DCODE,该厂商有两个基于ANDROID的产品,都放到一个主线上来维护,这两个产品为:apple和orange。OK,下面我们为该厂商添加编译模块:

1、在device目录下创建子目录DCODE,并在该目录下创建文件AndroidProducts.mk,该文件的内容为:

PRODUCT_MAKEFILES := \  $(LOCAL_DIR)/apple/apple.mk \  $(LOCAL_DIR)/orange/orange.mk

      那么Android系统是怎么将产品的mk文件load进来的呢,在文件build/core/product_config.mk中有如下定义:

ifneq ($(strip $(TARGET_BUILD_APPS)),)
# An unbundled app build needs only the core product makefiles.
all_product_configs := $(call get-product-makefiles,\
    $(SRC_TARGET_DIR)/product/AndroidProducts.mk)
else
# Read in all of the product definitions specified by the AndroidProducts.mk
# files in the tree.
all_product_configs := $(get-all-product-makefiles)
endif

# Find the product config makefile for the current product.
# all_product_configs consists items like:
# <product_name>:<path_to_the_product_makefile>
# or just <path_to_the_product_makefile> in case the product name is the
# same as the base filename of the product config makefile.
current_product_makefile :=
all_product_makefiles :=
$(foreach f, $(all_product_configs),\
    $(eval _cpm_words := $(subst :,$(space),$(f)))\
    $(eval _cpm_word1 := $(word 1,$(_cpm_words)))\
    $(eval _cpm_word2 := $(word 2,$(_cpm_words)))\
    $(if $(_cpm_word2),\
        $(eval all_product_makefiles += $(_cpm_word2))\
        $(if $(filter $(TARGET_PRODUCT),$(_cpm_word1)),\
            $(eval current_product_makefile += $(_cpm_word2)),),\
        $(eval all_product_makefiles += $(f))\
        $(if $(filter $(TARGET_PRODUCT),$(basename $(notdir $(f)))),\
            $(eval current_product_makefile += $(f)),)))
      对于这段代码,解释一下几个重要的地方:

        1) get-all-product-maefiles方法,该方法定义在build//core/product.mk文件中,该方法的注释为

#
# Returns the sorted concatenation of all PRODUCT_MAKEFILES
# variables set in all AndroidProducts.mk files.
# $(call ) isn't necessary.
        从注释里面可看出,该方法用来从所有的AndroidProducts.mk文件中获取PRODUCT_MAKEFILES变量。

define get-all-product-makefiles
$(call get-product-makefiles,$(_find-android-products-files))
endef
            不难理解上面的代码,_find-andorid-products-files用来获得所有的AndroidProducts.mk文件,而get-product-maifles则是遍历这些文件,获取PRODUCT_MAKEFILES变量。

2) 在device/DCODE目录下创建两个子目录,分别为apple和orange,如上述AndroidProducts.mk中定义的,我们要在这两个目录下分别创建文件apple.mk和orange.mk。在产品的mk文件里我们要定义该产品的一些属性,比如PRODUCT_PACKAGES, PRODUCT_PACKAGE_RESOURCES等,这时候,apple和orange产品会有很多属性是完全一致的,在实际的系统里我们没必要定义两份重复的配置选项,我们可以定义一个common文件夹,然后apple和orange从这个common配置里派生出来,如下:

$(call inherit-product, device/DCODE/common/common.mk)

3、增加了上述两个mk文件,我们下面需要了解这两个文件中的内容,比如我现在有这样的需求,为apple产品添加一些自定义的功能模块,并将android系统中的一些资源进行替换。首先功能模块可以通过PRODUCT_PACKAGES属性包含进来,而替换系统资源,则可以通过PRODUCT_PACKAGE_OVERLAYS属性来指定。其他一些常用属性入PRODUCT_NAME,PRODUCT_DEVICE等,这里就不一一详述了。

4、在产品目录下添加board相关的配置。增加AndroidBoard.mk文件,该文件定义了如file copy,key layout files,key character-map files,init file,

5、在产品目录下添加verdorsetup.sh文件,增加如下内容:(这个是否需要添加?)

add_lunch_combo full_apple-userdebug

这个文件的作用是为lunch添加选项,这个文件由build/envsetup.sh脚本include进来

其他可参考的文章:

<span style="font-size:14px;">http://blog.youkuaiyun.com/yili_xie/article/details/4830541
http://www.360doc.com/content/10/0224/11/155970_16643955.shtml
http://www.kandroid.org/online-pdk/guide/build_new_device.html#androidBuildSystemProductDefFiles
http://blog.youkuaiyun.com/mr_raptor/article/details/7539978</span>




七、AndroidProducts.mk 文章目录AndroidProducts.mk是什么简单来说就是:此外注意一下:例子AndroidProducts.mk怎么用AndroidProducts.mk如何被加载从`lunch`到`AndroidProducts.mk.list``AndroidProducts.mk.list`调用关系`_find-android-products-files`宏函数`get-all-product-makefiles`宏函数`get-product-makefiles`宏函数`_validate-common-l 阅读详情

相关推荐

Android编译系统入门(一)

做过Android平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系统的大门,探索一下这片未知的恐怖之森(问啥要用恐怖之森后面大家就知道了)。Makefile入门在讲解Android编译系统之前首先来了解一下什么是Makefile:简单的说,Makefile提供了一种机制,

读万卷书,行万里路 3702

android编译分析之4—product.mk

android编译系统中有两个概念product和device,product.mk是关于product相关的函数和变量。 下面的函数找到编译系统中的AndroidProducts.mk,在AndroidProducts.mk中一般都定义了具体产品相关makefile的文件。# # Functions for including AndroidProducts.mk files # PRODUCT

lyf's blog 1万+

Android编译系统——基础介绍(一)

Android编译系统是构建Android操作系统及其应用程序的核心基础设施,负责将源代码、资源文件等编译打包成可在设备上运行的软件包。随着Android版本的演进,编译系统经历了多次重大变革。

小旭的专栏 1409

Android Build系列专题【篇二:AOSP编译流程】

众所周知,Android系统其实就是一个运行在Linux系统上面的应用桌面程序,当然这样概括可能不是很准确,但是他们的编译确实异曲同工之妙。 在Linux系统中,我们可以通过make命令来编译代码。执行Make命令默认会在当前目录找到一个Makefile文件,然后根据Makefile文件中的指令来对代码进行编译(makefile语法课参考《GNU make中文手册》)。也就是说make命令执行的是Makefile文件中的指令,Makefile文件中的指令可以是编译命令(例如gcc,也可以是其它命令)。

qq_27672101的博客 1万+

AD23导出Gerber文件保姆级教程:从PCB到嘉立创下单,一步不落(附常见问题排查)

本文提供AD23导出Gerber文件的详细教程,涵盖从PCB设计检查到嘉立创下单的全流程,特别针对两层板设计场景,帮助新手工程师避免常见错误。内容包括Gerber文件生成步骤、钻孔文件设置、文件检查工具推荐以及嘉立创下单实操指南,确保PCB打样顺利。

weixin_30924239的博客 440

FANUC机器人PROFINET通讯方式组态

6 然后对模块进行命名及更改IP地址,点击“Network Detection”,进行扫描,会生成下图,双击商科模块会生成下边的对话框,对模块进行命名及更改IP地址,在“Permanent Name”处点对勾,完成后点击“Apply Name及Apply”进行命名。此处注意,上图左上在线在不了,网络扫描处上面也灰色的,扫描不了。5双击abcc-prt-2-port RT(FW1.13),生成下面图标,在右边点击1、2把原来内容删掉,从新在左侧加载 ,使1、2是输出,3、4为输入,完成后点击OK。

dxs93的博客 8431

Android系统编译环境初始化时Product产品的import-nodes过程

从执行make -f config,mk文件开始,config,mk作为当前的makefile文件,将会被make解析,一般make解析Makefile文件流程首先是加载其中include的各种其他mk文件,同时在加载的过程中会初始化自定义的变量,类似于预编译,在完成各种初始化后,确定目标以及依赖关系,最终执行目标输出动作。在config.mk中存在多个需要include的mk文件,这里关注pro

天才之嵌入式 4340

VTK实战笔记(1)在win11搭建VTK-9.4.2 + qt5.15.2 + VS2019_x64开发环境

Visual Studio 2019 + qt5.15.2 + vtk9.4.2

心向阳光,斗志昂扬! 977

编译系统入门篇-Android10.0编译系统(一)

摘要:本节主要来进行Android10.0 HwBinder的原理总结 阅读本文大约需要花费14分钟。 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! [Android取经之路] 的源码都基于Android-Q(10.0) 进行分析 [Android取经之路] 系列文章: 《系统启动篇》 Android系统架构 Android是怎么启动的 Android 10.0系统启动之init进程 Android10.0系统

IngresGe 的专栏 2万+

uniapp [全端兼容] - 实现省市区选择器三四级联动组件,uniapp选择地址自定义省市区三级联动插件,弹框式多级联动选择器区域选择(全平台兼容苹果安卓App、支付宝微信小程序、移动端H5网页)

uni-app省市区选择器,省市区街道三级四级联动选择器,uniapp自定义多列选择器省市两级联动,uniapp picker组件实现多级联动,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniApp选择器省市区县街道乡镇,uniapp实现省市区选择联动,uniapp城市三级联动(自定义组件)_uniapp三级联动,picker插件省市区联动,uniapp小程序省市区选择器,uni-app 省市区街道的四级联动选择,uniapp怎样实现省市区地址三级联动uni

🏆 前端领域优质创作者 1万+

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5088

Android编译系统简要介绍和学习计划

在Android源码环境中,我们开发好一个模块后,再写一个Android.mk文件,就可通过m/mm/mmm/make等命令进行编译。此外,通过make命令还可制作各种系统镜像文件,例如system.img、boot.img和recovery.img等。这一切都得益于Android编译系统,它为我们处理了各种依赖关系,以及提供各种有用工具。本文对Android编译系统进行简单介绍以及制定学习计划。

老罗的Android之旅 6万+

096、PCIE环回模式(Loopback):调试时自己和自己对话的利器

摘要: PCIE环回模式是调试利器,通过让芯片内部数据自环来定位问题层级。文章详解三种环回模式:物理层环回验证基础收发,数据链路层环回测试DLLP机制,事务层环回验证端到端协议。分享了实战中的典型问题(时钟异常、状态机卡死、计数器失真)和"从下往上"的调试流程,强调要区分调试与生产功能,建议早期验证环回模式。通过具体代码示例和调试案例,说明合理使用环回模式能显著提升排查效率,是PCIE调试必备技能。(149字)

z534437748的博客 106

Android编译系统介绍

1. 编译系统变化 Android 最初是用 Android.mk 来定义模块的, Android.mk 本质上就是 Makefile。随着 Android 工程越来越大,包含的模块越来越多,以 Makefile 组织的项目编译花费的时间越来越多。google 在 Android 7.0 开始引入了 ninja 编译系统。相对于 make 来说 ninja 在大的项目管理中速度和并行方面有突出的...

Android系统攻城狮 2381

【异常】Error loading ASGI app. Could not import module ‘main‘

出现或。

奶爸的编程之路,也就一周冷个三天 1854

Unity Sprite Atlas C++底层原理全解析 —— “像素聚合工厂”的秘密

Unity Sprite Atlas C++底层实现简析 Sprite Atlas是Unity中用于优化2D渲染性能的核心机制,其C++底层实现如同一个高效的"像素聚合工厂"。该系统通过将多个小纹理合并为一个大纹理,显著减少Draw Call次数和GPU纹理切换开销。 在数据结构上,底层采用SpriteAtlasData存储图集元数据,PackedTexture管理合并后的大纹理,SpriteFrame记录每个子精灵的位置信息,并通过哈希表实现快速查找。编辑器阶段使用最大矩形等算法优化空

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 204

编译系统总结篇-Android10.0编译系统(十一)

摘要:Android10.0编译系统总结 阅读本文大约需要花费20分钟。 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢迎关注我的公众号! [Android取经之路] 的源码都基于Android-Q(10.0) 进行分析 [Android取经之路] 系列文章: 《系统启动篇》 Android系统架构 Android是怎么启动的 Android 10.0系统启动之init进程 Android10.0系统启

IngresGe 的专栏 5431

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android编译系统结构

Android编译系统的架构: 分析Android编译系统,你会发现,Android编译系统完成的并不仅仅是对目标(主机)系统二进制文件、java应用程序的编译、链接、打包等,而且还有包括生成各种依赖关系、确保某个模块的修改引起相依赖的文件的重新编译链接,甚至还包括目标文件系统的生成,配置文件的生成等,因此Android编译系统具有支持多架构(linux-x86、windows、arm等)、多语

流年偷换的专栏 1870

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android编译系统详解(一)

++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.youkuaiyun.com/mr_raptor/article/details/7539978 ++++++++++++++++++++++++++++++++++++++++++     Android编译系统详解(一):http:

mr_raptor的专栏 4万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android编译系统Makefile

Android编译系统 来自 http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html Android.mk、Ninja、Soong、Blueprint、kati、Android.bp的概念之间的联系为: Makefile Android平台的编译系统,其实就是用Makefile写出来的一个独立项目。它定义了编译的规则,实现了“自动化编译”,不仅把分散在数百个Git库中的代码整合起来、统一编译, 而且还把产物分门别类地输出到一个目录,打包成手机RO

特立独行的博客 3428

一、android build system编译系统概述

文章目录1. 基本概念2. Android build system的变迁2.1 Android N 前后build system的改变2.1.1 `Android N`之前2.1.2 `Android N`之后2.2 Android 10与Android 4.4 build目录对比2.3 Android10 manifest.xml中编译系统相关部分3. envsetup.sh分析4. kati、soong、blueprint、ninja4.1 ninja4.2 kati4.3 soong4.4 blue

王涵的博客 2857

Android 编译系统

自Android开源以来,引起了嵌入式行业一股热潮,很多嵌入式开发者表示对Android有很强的兴趣,并下载Android源码进行编译和移植。Android源码的巨大(repo下来,大概2G)给人以Android相当复杂的错觉。本文从Android编译系统的角度,让大家了解And

721
上一篇: Android联系人模块分析(三)
下一篇: 定制自己的控件
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值