Android Makefile中是 如何识别 TARGET_PRODUCT 的

http://blog.csdn.net/stevenliyong/article/details/5285334

今天有时间小看一下Android 的Makefile, 终于稍有明白Android 编译系统是如何通过环境变量 TARGET_PRODUCT 来决定编译定制product.

首先, 编译Android 代码 通常情况下使用:

# make showcommands

这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk )

# TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands

可见,默认情况下编译系统认为TARGET_PRODUCT 是generic 的

那如何编译特定产品的Android呢?

这就需要查看Android Makefile是如何解析环境变量TARGET_PRODUCT的。

Android Makefile 的引用关系是这样的

Makefile  -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/product_config.mk

在build/core/product_config.mk 中编译系统首先调用 build/core/product.mk中定义的函数get-all-product-makefiles ,来

遍历整个vendor 的子目录, 找到vendor下所有的 AndroidProducts.mk, 不同子目录下的AndroidProducts.mk 中定义了不同的 PRODUCT_NAME, PRODUCT_DEVICE 等信息,(我们也可以通过 打开build/core/product_config.mk  中的#$(dump-products) 语句使控制台编译的时候输出所有product 的信息)  , 接着build/core/product_config.mk 会调用resolve-short-product-name 将TARGET_PRODUCT匹配的AndroidProducts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。

有了这个TARGET_DEVICE, 再回到 build/core/config.mk,

会include $(TARGET_DEVCIE)/BoardConfig.mk

board_config_mk := /
 $(strip $(wildcard /
  $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
  vendor/*/$(TARGET_DEVICE)/BoardConfig.mk /
 ))

include $(board_config_mk)

而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等

另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。

TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))

当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk

TARGET_OUT_ROOT_release := $(OUT_DIR)/target
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))

TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product

PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)

再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来

#
# Typical build; include any Android.mk files we can find.
#

subdir_makefiles := /
 $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)

include $(subdir_makefiles)

我们再来看其中的

./build/target/board/Android.mk

,对了它引用了

include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

由上面TARGET_DEVICE_DIR的定义,这下又进入了

vendor 下TARGET_DEVICE指向的目录了,这个mk文件中定义了特定Product需要编译和安装app 和 script.

时间: 2024-10-08 00:16:05

Android Makefile中是 如何识别 TARGET_PRODUCT 的的相关文章

Android 自定义控件在Android Studio中xmlns不识别

Gradle工具会自动识别,所以不用指定包名 把 xmlns:xx="http://schemas.android.com/apk/res/com.xxx" 换成 xmlns:xx="http://schemas.android.com/apk/res-auto" 然后同步一下

Android UI性能优化实战 识别绘制中的性能问题

出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android性能优化典范,发了16个小视频供大家欣赏,当时我也将其下载,通过微信公众号给大家推送了百度云的下载地址(地址在文末,ps:欢迎大家订阅公众号),那么近期google又在udacity上开了系列类的相关课程.有了上述的参考,那么本性能优化实战教程就有了坚实的基础,本系列将结合实例为大家展示如何去识别.

Android编译系统中的Kconfig,Makefile,.config编译系统浅析

在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译.当然还包括很多配置命令,比如make defconfig, make oldconfig以及各种编译的脚本,共同构成Android的整个编译系统! 跟make menuconfig这个命令相关的文件,包括三类,包括.config,Kconfig,Makefile.为什么不说三个,而说三类呢?因为 Kconfig和Makefile是配合使用的,在很多的子目录都存在,而.config只存

Android.mk中的经常使用语法

Android.mk编译文件是用来向Android NDK描写叙述你的C,C++源码文件的, 今天查了一些经常使用的的语法. 一 概述: 一个Android.mk文件用来向编译系统描写叙述你的源码. 详细来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或很多其它次的build系统. 你能够在每个Android.mk文件里定义一个或多个模块, 你也能够在几个模块中使用同一个源码文件. 二 语法 1 必须定义内容 先看必须定义的内容: LOCAL_PATH := $(call

Android Studio中手动导入Eclipse Project

RT,这应该是很多朋友刚从Eclipse转到Android Studio后遇到最大的一个问题,首先我们需要重新认识AS里面的目录结构,在我前一篇帖子里面也有提到(Android Studio中的Project相当于Eclipse中的Workspace,Module则相当于Eclipse中的Project). 所以我们手动导入Project,其实就是导入AS里面的Module.主要有以下几个步骤: 1.复制build.gradle到需要导入的项目中 2.复制你需要导入的项目至AS Project根

makefile中的自动化变量[email protected],$%,$

转自:http://www.2cto.com/os/201302/191344.html 自动化变量 模式规则中,规则的目标和依赖文件名代表了一类文件名:规则的命令是对所有这 一类文件重建过程的描述,显然,在命令中不能出现具体的文件名,否则模式规则失去 意义.那么在模式规则的命令行中该如何表示文件,将是本小节的讨论的重点. 假如你需要书写一个将.c 文件编译到.o 文件的模式规则,那么你该如何为gcc 书写 正确的源文件名?当然了,不能使用任何具体的文件名,因为在每一次执行模式规则时 源文件名都

Android Studio中使用Gradle打包

首先要注意一点,Android Studio中把proguard.txt已经命名为proguard-rules.pro,由此可见,采用Gradle打包,混淆规则文件的名称是不重要的,可以自己随便命名.混淆规则跟原来一样,没有变化.不懂可以搜一下别人怎么写的. 加入签名文件,在Build->Generate Signed APK- 就会看到下面的弹出框 如果没有签名文件就创建新的签名文件,如果已经有签名文件,那么选择签名文件的位置,并填写好密码就可以点Next了.创建签名文件的方式跟老版本(Ecl

Android开发中Eclispe相关问题及相应解决(持续更新)

1.Eclipse项目中的Android Private Libraries没有自动生成. 一般而言,在Android开发中,项目中引用到的jar包会放到项目目录中的libs中,引入库会放到Android Dependencies中,对于放置于libs中的jar包,会自动置于项目中的Android Private Libraries下,如果没有自动生成,clean项目后一般在console下会发现有相应的错误提示,修正即可.如:项目中引用了不同的v4兼容包等会出现此类情况. 2.Eclipse中

Android触摸屏中的手势识别

我们经常利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读器中翻页等.在Android系统中,手势的识别是通过 GestureDetector.OnGestureListener接口来实现的,不过William翻遍了Android的官方文档也没有找到一个相 关的例子,API Demo中的TouchPaint也仅仅是提到了onTouch事件的处理,没有涉及到手势.Android Deve