Android Makefile中是 如何识别 TARGET_PRODUCT

Android Makefile中是 如何识别 TARGET_PRODUCT 的

今天有时间小看一下Android 的Makefile, 终于稍有明白Android 编译系统是如何通过环境变量 TARGET_PRODUCT 来决定编译定制product.
3 W# @, O  B& L, L, ~我们只做简洁、专业的嵌入式开发技术论坛。首先, 编译Android 代码 通常情况下使用: arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,/ T: Y1 ?, f  Q2 W8 i$ Y# i
# make showcommands 嵌入式开发联盟; h; Q4 ?. m, q  _5 q# f4 N
这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk )
7 d0 K' f4 c9 U$ Y& o7 y( C嵌入式开发联盟# TARGET_ARCH=arm TARGET_PRODUCT=generic TARGET_BUILD_TYPE=release make showcommands
+ D3 L5 v# M; F' f我们只做简洁、专业的嵌入式开发技术论坛。可见,默认情况下编译系统认为TARGET_PRODUCT 是generic 的 arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,6 p) P/ }+ a9 x" e' _/ ]8 l( H8 [, e
那如何编译特定产品的Android呢? arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,7 n  N* t# q" c9 c  C% W
这就需要查看Android Makefile是如何解析环境变量TARGET_PRODUCT的。
% {- c& e$ t: F7 h2 h8 D我们只做简洁、专业的嵌入式开发技术论坛。Android Makefile 的引用关系是这样的 mcuos.com1 b" z& i3 S. J5 J9 T
Makefile  -> build/core/main.mk -> build/core/config.mk -> build/core/envsetup.mk -> build/core/product_config.mk 嵌入式开发联盟2 t1 D) I' n) x4 /+ Q# X! D
在build/core/product_config.mk 中编译系统首先调用 build/core/product.mk中定义的函数get-all-product-makefiles ,来
# s( G' f1 d2 n8 x, y+ @8 carm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,遍历整个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。
; n7 l" m9 o3 Mmcuos.com有了这个TARGET_DEVICE, 再回到 build/core/config.mk,
% I* a- u7 w3 u( w会include $(TARGET_DEVCIE)/BoardConfig.mk
9 y. I. P2 @  V1 T嵌入式开发联盟board_config_mk := /
  T& E, o- E! {( `5 b! warm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye, $(strip $(wildcard / arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,7 s6 h* H) @& B, X. [5 [' t" J& U
  $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk /
- n, Z8 }, @* f9 a4 P$ O嵌入式开发联盟  vendor/*/$(TARGET_DEVICE)/BoardConfig.mk / - 我们只做简洁、实用、专业的嵌入式开发技术论坛。2 L& f% E. T& M4 S) u
)) 我们只做简洁、专业的嵌入式开发技术论坛。5 }- ~6 j# s8 s/ a* v- i
include $(board_config_mk) 嵌入式开发联盟, [. Z( H) L2 B; s, c
而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是 GENERIC_AUDIO 等等
& |/ T- G! N* j$ B$ U$ N, v另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR, 因为TARGET_DEVICE_DIR 取的是上面提到的BoardConfig.mk 的路径。 arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,' ~( W" a( p& y9 g- n) A: c
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
' a# P  ?% T- P3 x. a3 b! |5 q2 V; s当然Android 的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk
" C, P4 b! /; ?; /+ `- 我们只做简洁、实用、专业的嵌入式开发技术论坛。TARGET_OUT_ROOT_release := $(OUT_DIR)/target 我们只做简洁、专业的嵌入式开发技术论坛。  v( |. V7 ^+ T+ G& m
TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
* A# n0 V  X: H7 S& y- c  c嵌入式开发联盟TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE)) ( ?. c1 J& d) o9 M. [
TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product mcuos.com7 N! X' G9 T7 o& j+ }# |2 S. p# x
PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE) 嵌入式开发联盟  P& ]2 q" C/ x: ?
再回到 build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有Android.mk文件,并将这些Android.mk文件include 进来
1 C* /7 |8 e4 J8 V# [, t嵌入式开发联盟#
! J; n$ `; D0 B8 ^: V, xmcuos.com# Typical build; include any Android.mk files we can find.
& v; r  M$ u( s/ T$ g& C; X- 我们只做简洁、实用、专业的嵌入式开发技术论坛。#
+ x* `0 ~- |: j( k. S0 Sarm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,subdir_makefiles := / 我们只做简洁、专业的嵌入式开发技术论坛。% T9 p" L4 e. O6 ?, h" @' @
$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk) - 我们只做简洁、实用、专业的嵌入式开发技术论坛。7 N. z& r* z; @! p5 n; {
include $(subdir_makefiles) - 我们只做简洁、实用、专业的嵌入式开发技术论坛。0 b% j5 a+ L2 E" r9 R3 v7 m
我们再来看其中的
% z( D. t' `; a) I, Q- 我们只做简洁、实用、专业的嵌入式开发技术论坛。./build/target/board/Android.mk
$ n% E& o9 H" a8 g6 Z! Carm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,,对了它引用了
& j7 `1 I2 F3 y0 [7 }) @& }0 M嵌入式开发联盟include $(TARGET_DEVICE_DIR)/AndroidBoard.mk - 我们只做简洁、实用、专业的嵌入式开发技术论坛。: a- I! H* p5 i5 g- ^5 R6 z$ C- ^
由上面TARGET_DEVICE_DIR的定义,这下又进入了
2 k- I9 L) `9 D- _/ /- 我们只做简洁、实用、专业的嵌入式开发技术论坛。vendor 下TARGET_DEVICE指向的目录了,这个mk文件中定义了特定Product需要编译和安装app 和 script.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值