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中利用的面向对象的思想了。
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
Post a Comment