Android系统编译时遇到的几个.mk的疑惑。

在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的疑惑。,布布扣,bubuko.com

时间: 2024-10-25 13:36:08

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

Android系统编译环境搭建

之前在公司做Android系统开发时,服务器编译环境都是我来配置的,总结了一份文档,文档放着很久了,一来跟大家共享下,二来防止丢失. 1.JDK环境变量配置 将mtkoss.tar.gz上传到/目录,使用命令:#tar –xvzf mtkoss.tar.gz 修改/etc/profile文件,加入环境变量: JAVA_HOME=/mtkoss/jdk/1.6.0_45-ubuntu-10.04/x86_64 JRE_HOME=/mtkoss/jdk/1.6.0_45-ubuntu-10.04/x

realarm Android系统编译后内核无法启动的解决方法

由于之前版本使用的内核并非uImage格式,而在编译时使用的是非uImage格式编译,所以照成无法启动. 解决方法是,在编译内核时使用make uImage方式编译. 修改根目录下的build_realv210.sh文件,如下图所示 另外注意上图中CPU_JOB_NUM这个参数,要根据自己的电脑配置来选择,该参数在该文件的起始处设置,可以设置成电脑CPU核心数的2倍,例如:如果核心数为2,那么设置成4即可. 完整脚本下载地址:http://download.csdn.net/detail/u01

Android混淆编译时,用到gson-2.2.2.jar进行反射解析json数据时,报ClassCastException错误

在我的代码中,我使用方法是: public synchronized <T> T parseJson(String json, Class<T> classOfT) throws Exception{ T target = null; Gson gson = new Gson(); target = gson.fromJson(json, classOfT); return target; } 之后在我的Activity中使用方式是: String addModel = JsonP

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

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43452969 ,本文出自:[张鸿洋的博客] 1.概述 记得很久以前,写过几篇博客,容我列举一下: Android 进阶 教你打造 Android 中的 IOC 框架 [ViewInject] (上) Android 进阶 教你打造 Android 中的 IOC 框架 [ViewInject] (下) Android 框架炼成 教你如何写组件间通信框架EventBus 大家可以关

Android系统编译与测试

1.Android系统分析 2.下载Android源代码(不包括Linux内核部分) 下载好了的Android_5.01.tar.gz,通过samba复制到ubuntu里,再解压之. 可以看到AndroidSrc/这个文件夹,它存放的就是Android源代码了. 3.编译 a.初始化编译环境,在build目录下面 b.选择编译目标(配置) 配置 这里有好几个小时的时间zzzzzzzzzzzzzzzzzzz c.编译目标输出 4.测试Android系统 a.创建一个模拟器来模拟设备 启动studi

Android Studio编译时Gradle报乱码

其实这个问题已经困扰了很久了,只不过对编译没什么影响,就一直放着了,今天又遇到了,实在看不过去了,就去找解决方法,然后呢,搜出来的答案全都是一样的,而且也试了,没有用,尼玛,太过分了. 问题是这样的,代码中有中文,中文是在注释中,显示的时候是完全正常的,然而编译的时候gradle会报错,但是呢,又可以编译成功.这尼玛,真蛋疼..提示信息其实也是乱码的,别问我既然乱码的下面的信息你是怎么得出来的,这不是重要的,重要的是怎么解决. 编译时Gradle报错信息 "编码 UTF-8 的不可映射字符&qu

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

从运行make -f config,mk文件開始,config,mk作为当前的makefile文件.将会被make解析,一般make解析Makefile文件流程首先是载入当中include的各种其它mk文件,同一时候在载入的过程中会初始化自己定义的变量,相似于预编译,在完毕各种初始化后,确定目标以及依赖关系,终于运行目标输出动作. 在config.mk中存在多个须要include的mk文件.这里关注product相关的envsteup.mk 在envsteup.mk从又会include prod

Android系统开发时常用linux的命令

android shell中linux命令:(busybox指令)---命令脚本一般放在/system/bin  busybox脚本一般放在/system/xbin下 (注意命令的执行权限) (能切入adb shell 表明有shell权限,更多的操作则需要root权限) ls  列出当前文件夹下的文件 rm  移除文件 或 文件夹  rm /data/local/tmp/1.apk cd  进入目录  cd /data/local/tmp cat 查看文件内容 cat /proc/cpuinf

Android系统编译错误Note: Some input files use or override a deprecated API. 解决办法

进入系统framework层修改了下MediaPlayer.java的源码,就添加了个方法,结果重新编译系统报下面错误: .................. Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. 6 warnings 再进入MediaPlayer.java把修改的复原,结果编译就通过,关键是我需要那个方法... 最