在Android4.2的源代码Build/prduct_config.mk里面遇到几个疑惑:

# Convert a short name like "sooner" into the path to the product
# file defining that product.
#
INTERNAL_PRODUCT := $(call resolve-short-product-name, $(TARGET_PRODUCT))
ifneq ($(current_product_makefile),$(INTERNAL_PRODUCT))
$(error PRODUCT_NAME inconsistent in $(current_product_makefile) and $(INTERNAL_PRODUCT))
endif
current_product_makefile :=
all_product_makefiles :=
all_product_configs := # Find the device that this product maps to.
TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)

按道理Makefile在读取product_config.mk文件时。TARGET_DEVICE第一感觉就该被理解我一个合成的变量,当然这是Makefile的原理。

可是这里发现却不是。为什么?由于引入了一个node_fns.mk文件。

该文件的作用相似规定下完開始的content应该依照它的逻辑来处理。就好像比方定义了一种宏形式,那么接着的变量处理实际会变为还有一中处理方式:

比方这里实际:

INTERNAL_PRODUCT = device/softwinner/fiber-3g/fiber_3g.mk

TARGET_DEVICE = fiber-3g

说实话自己也不是非常理解node_fns.mk的作用,就把他理解为一个定义了好多宏的头文件吧。

看了下老罗的Android之旅。收获了非常对。上述的内容实质就是$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)是一个全新的变量。通过对AndroidProducts.mk的内容进行分析。然后加上不同的_product_var_list ,这样就能够生成全新的变量,都是依据不同的自己定制的产品来生成的。例如以下的变量就变成了上面提到的TARGET_DEVICE,事实上质是在AndroidProducts.mk里面进行了定义而已:

# Overrides
PRODUCT_BRAND := Softwinner
PRODUCT_NAME := fiber_3g
PRODUCT_DEVICE := fiber-3g
PRODUCT_MODEL := Softwinn
PRODUCTS.build/target/product/full.mk.PRODUCT_NAME := fiber_3g
PRODUCTS.build/target/product/full.mk.PRODUCT_DEVICE := fiber-3g
_product_var_list := \
PRODUCT_NAME \
PRODUCT_MODEL \
PRODUCT_LOCALES \
PRODUCT_AAPT_CONFIG \
PRODUCT_AAPT_PREF_CONFIG \
PRODUCT_PACKAGES \
PRODUCT_PACKAGES_DEBUG \
PRODUCT_PACKAGES_ENG \
PRODUCT_PACKAGES_TESTS \
PRODUCT_DEVICE \
PRODUCT_MANUFACTURER \
PRODUCT_BRAND \
PRODUCT_PROPERTY_OVERRIDES \
PRODUCT_DEFAULT_PROPERTY_OVERRIDES \
PRODUCT_CHARACTERISTICS \
PRODUCT_COPY_FILES \
PRODUCT_OTA_PUBLIC_KEYS \
PRODUCT_EXTRA_RECOVERY_KEYS \
PRODUCT_PACKAGE_OVERLAYS \
DEVICE_PACKAGE_OVERLAYS \
PRODUCT_TAGS \
PRODUCT_SDK_ADDON_NAME \
PRODUCT_SDK_ADDON_COPY_FILES \
PRODUCT_SDK_ADDON_COPY_MODULES \
PRODUCT_SDK_ADDON_DOC_MODULES \
PRODUCT_DEFAULT_WIFI_CHANNELS \
PRODUCT_DEFAULT_DEV_CERTIFICATE \
PRODUCT_RESTRICT_VENDOR_FILES \
PRODUCT_VENDOR_KERNEL_HEADERS \
PRODUCT_FACTORY_RAMDISK_MODULES \
PRODUCT_FACTORY_BUNDLE_MODULES

对于Android系统中的.mk文件能够在source /build/envsetup.sh后进行调用。比方:

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
}

该脚本函数就会被在lunch 选择时,进行chenk products的操作。进一步运行get_build_var TARGET_DEVICE的函数处理。

事实上质是运行了一次Make的操作。

看上去和系统编译的Make -j8等全然相似。

仅仅是他运行了的仅仅有config.mk配置相关的内容而已。

进一步依次运行envsetup.mk。到product_config.mk,终于获得TARGET_DEVICE变量的内容。

6.$DEVICE变量的生成过程,事实上就是文件fiber-3g所在的路径:
首先通过source envsetup.sh将全部的device和vendor下的vendorsetup.sh加进来。并完毕combo的整合。
lunch函数选择相应的平台后,并会设置好全部编译所需的环境变量使用以下函数来完毕:
   #环境变量设置
    set_stuff_for_environment
   #打印终于的配置信息
    printconfig
set_stuff_for_environment的setpath函数中,该函数会export非常多的环境路径,供兴许脚本函数运行调用
有包含export DEVICE的导入:

tdevice=$(get_build_var TARGET_DEVICE)

     export DEVICE=$T/device/*/$tdevice
 
例如以下自己定义Android编译项和创建Product产品配置文件,Board板级配置文件:
7 lunch过程确定了TARGET_PRODUCT = fiber_3g的内容。
8 TARGET_DEVICE=fiber-3g,在build/core/product_config.mk中依据PRODUCT_DEVICE来确定。
通过遍历全部device文件夹下的AndroidProducts.mk中的引入的.mk文件,比方这里指fiber_3g.mk。通过TARGET_PRODUCT 来匹配查找到相应的AndroidProducts.mk。而PRODUCT_DEVICE在fiber_3g.mk中被确定为fiber-3g。

通过node_fns.mk的宏作用,进而确定TARGET_DEVICE的内容为fiber-3g。

9.Boardconfig.mk的作用。build/core/config.mk来决定。

通过遍历device/*/$(TARGET_DEVICE)/boardconfig.mk来完毕

Android系统编译时遇到的几个.mk的疑惑。的更多相关文章

  1. 全志tina v3.0系统编译时的时间错误的解决(全志SDK的维护BUG)

    全志tina v3.0系统编译时的时间错误的解决(全志SDK的维护BUG) 2018/6/13 15:52 版本:V1.0 开发板:SC3817R SDK:tina v3.0 1.01原始编译全志r1 ...

  2. H3 android 系统编译

    http://bbs.ickey.cn/group-topic-id-57981.html [Orange Pi PC试用体验]11编译android源码笔记 编译android和编译linux有点类 ...

  3. Android系统编译【转】

    本文转载自;http://blog.csdn.net/zirconsdu/article/details/8005415 Android编译系统分析 概要 由于android编译系统的复杂和使用了不熟 ...

  4. Android系统编译脚本理解

    android源码编译步骤: 1. repo sync 代码(下载代码) 2.start branch(用哪个分支,git相关) 3. 到根目录(android目录) $cd android/ 4. ...

  5. Android 打造编译时注解解析框架 这只是一个开始

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43452969 ,本文出自:[张鸿洋的博客] 1.概述 记得很久以前,写过几篇博客 ...

  6. Android系统编译与测试

    1.Android系统分析 2.下载Android源代码(不包括Linux内核部分) 下载好了的Android_5.01.tar.gz,通过samba复制到ubuntu里,再解压之. 可以看到Andr ...

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

    从运行make -f config,mk文件開始,config,mk作为当前的makefile文件.将会被make解析,一般make解析Makefile文件流程首先是载入当中include的各种其它m ...

  8. Android 系统编译

    最近研究了下Android 的编译系统,下面结合编译我们自己的产品 mobot 来对整个编译系统进行必要的介绍,方便大家今 后对默认编译的修改. 先列出几个觉得重要的Make 文件: build/bu ...

  9. ubuntu64位系统编译时头文件找不到的问题(可以查看g++ -v路径,设置export C_INCLUDE_PATH,CPLUS_INCLUDE_PATH)

    今天编译webrtc时出现以下错误: ninja -C out/Debug Allninja: Entering directory `out/Debug'[1/6] CXX obj/talk/app ...

随机推荐

  1. React Native 出现红屏幕报连接服务失败

    最近移动项目组在本人的带领下切换进React Native开发应用,之前没接触过,用了几周之后,发现也就那么回事吧,小玩具项目用用还是可以的.今天Android小姑娘在Windows下出问题解决不了, ...

  2. npm换淘宝源 yarn换淘宝源

    查询初始的源 npm get registry > https://registry.npmjs.org/ 设置淘宝源 npm config set registry http://regist ...

  3. codeforces_333B_水过

    B. Chips time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  4. CAD绘制一个图象标记对象(com接口VB语言)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. vue基础---计算属性和侦听器

    [一]计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> ...

  6. java的标识符和关键词

    1.1.1 标识符   可以简单的理解为一个名字.在Java中,我们需要标识代码的很多元素,包括类名.方法.字段.变量.包名等.我们选择的名称就称为标识符,并且遵循以下规则: 标识符可以由字母.数字. ...

  7. 虚拟机找不到本机vmnet0,vmnet8,无法连接xshell,解决方案

    首先出现这个问题肯定是第一次下载虚拟机把之前的注册表覆盖了,网卡找不到,首先卸载VMware 并且将C\ProgramData下的VMware文件夹删除掉 ,下载cceaner,点击注册表清除干净,再 ...

  8. mybatis传参总结

    注:文章引用部分 mybatis传递参数总结文章内容 一.单个参数 1.基本数据类型 (1)直接使用 List<ChargeRuleDO> tests(long id); <sele ...

  9. 【2018百度之星初赛(A)】1002 度度熊学队列

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6375 Knowledge Point: STL - map:https://www.cnblogs.c ...

  10. SQLAlchemy-Utils

    由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法. 安装: pip3 install sqlalchemy_utils 示例: f ...