android makefile

================
android makefile
================
:Author: zxsu<suzp1984@gmail.com>
:Date: $Date: 2011-2-15 $
:Revision: $Revision: 1 $
:Description: This is a document about android makefile system

概述
====

在android工程中有很多的device设备,例如在devices/目录中就有分别为htc和samsung的不同设备,android是如何知道应该编译那个设备呢?方法是这样的:

首先,我们在脚本里定义了target_product变量,并导入到环境变量中。然后,makefile会在vender和device目录下面寻找所有的AndroidProduct.mk文件,
此文件应该有变量PRODUCT_MAKEFILES,然后将此变量中的makefile文件中的变量导入进来,我们所能导入的值在_product_var_list列表中::

_product_var_list := \
    PRODUCT_NAME \
    PRODUCT_MODEL \
    PRODUCT_LOCALES \
    PRODUCT_PACKAGES \
    PRODUCT_DEVICE \
    PRODUCT_MANUFACTURER \
    PRODUCT_BRAND \
    PRODUCT_PROPERTY_OVERRIDES \
    PRODUCT_CHARACTERISTICS \
    PRODUCT_COPY_FILES \
    PRODUCT_OTA_PUBLIC_KEYS \
    PRODUCT_PACKAGE_OVERLAYS \
    DEVICE_PACKAGE_OVERLAYS \
    PRODUCT_CONTRIBUTORS_FILE \
    PRODUCT_TAGS \
    PRODUCT_SDK_ADDON_NAME \
    PRODUCT_SDK_ADDON_COPY_FILES \
    PRODUCT_SDK_ADDON_COPY_MODULES \
    PRODUCT_SDK_ADDON_DOC_MODULE \  
    PRODUCT_DEFAULT_WIFI_CHANNELS

然后, 比较相应的PRODUCT_NAME的值跟我们环境变量中的target_product的值, 如果相同那么此product就是android要编译的目标.

debugs methods in andorid makefile
==================================
product_config.mk中的代码为例子,里面有一些注释掉的代码,其实是调试用的。
例如:
$(dump-products)
$(error done)

当我们想知道makefile系统中某个变量的值时,可以通过一下的方法:
$(error TARGET_PRODUCT $(TARGET_PRODUCT) --> $(INTERNAL_PRODUCT))
makefile执行到此后,就会打印出相应的值,然后自动停止。

inherite in android makefile
============================

记得看过一篇blog说到android的makefile中就用了面向对象的继承的思想。
还是以上面讲到的android中devices定制的例子。那么如何写一个devices的makefile, 首先,要明白它所能定制的变量列表在_product_var_list中
只有此列表中的变量出现在此makefile中才有意义.
::

$(call inherit-product, build/target/product/generic.mk)
PRODUCT_BRAND := xxx
PRODUCT_NAME := llll
PRODUCT_DEVICE := llll

以上就是一个简单的例子,首先调用inherit-product函数, 此函数的作用是利用eval生产变量. 然后就可以定义_product_var_list中的变量了.
所谓的继承就是利用eval生成需要的变量,例如上面中的PRODUCT_BRAND就后生成PRODUTS.llll.PRODUCT_BRAND变量中间一段为$(PRODUCT_NAME)的值.

我想这就是android在makefile中利用的面向对象的思想了。


Comments

Popular posts from this blog

Bluedroid stack in android

How to setup a NAT server?

Network programming in elisp